Tak jak model wiadomości Post
, musimy dostosować metody rules()
, relations()
oraz safeAttributes()
dla modelu Comment
. Dodatkowo potrzebujemy zmienić
metodę attributeLabels()
aby zdeklarować niestandardowe etykiety dla pewnych atrybutów.
rules()
¶Najpierw dostosowujemy reguły sprawdzania poprawności wygenerowane przez narzędzie yiic
.
Następujące reguły są używane dla komentarzy:
public function rules()
{
return array(
array('author,email,content', 'required'),
array('author,email,url','length','max'=>128),
array('email','email'),
array('url','url'),
array('verifyCode', 'captcha', 'on'=>'insert',
'allowEmpty'=>!Yii::app()->user->isGuest),
);
}
W powyższym kodzie, określamy, że atrybuty: autor author
, e-mail email
oraz zawartość content
są atrybutami wymaganymi (nie mogą być puste); długość atrybutu autor author
, e-mail email
oraz adres URL url
nie może przekraczać 128 (znaków); atrybut e-maila email
musi być poprawnym adresem mailowym;
atrybut adresu URL url
musi być poprawnym adresem URL; a atrybut weryfikacji kodu verifyCode
powinien zostać sprawdzony pod względem zgodności z kodem wygenerowanym przez CAPTCHA.
Powyższy atrybut verifyCode
jest używany przede wszystkim do przechowywania kodu weryfikującego,
który użytkownik wprowadził aby dodać komentarz. Ponieważ nie jest on obecny w tabeli
komentarzy Comment
, musimy zadeklarować go bezpośrednio jako publiczną zmienną.
Do sprawdzania jego poprawności używamy specjalnego walidatora o nazwie captcha
,
który reprezentuje klasę CCaptchaValidator. Ponadto sprawdzenie poprawności
odbędzie się podczas wstawiania (ang. insert) nowego komentarza (popatrz na opcję on
).
Dla uwierzytelnionych użytkowników nie ma potrzeby tego czynić (popatrz na opcję allowEmpty
).
safeAttributes()
¶Następnie dostosowujemy metodę safeAttributes()
aby zdefiniować, które atrybuty
mogą być przypisywane grupowo.
public function safeAttributes()
{
return array('author', 'email', 'url', 'content', 'verifyCode');
}
Oznacza to również, że formularz komentarza będzie zawierał te pola, aby zebrać informacje o autorze, e-mailu, adresie URL, zawartości oraz kodzie weryfikującym.
relations()
¶Podczas tworzenia portletu "ostatnich komentarzy", potrzebujemy wylistować ostatnie
komentarze wraz z odpowiadającymi im informacjami o wiadomościach. Dlatego też,
musimy dostosować metodę relations()
aby określić relację z wiadomością.
public function relations()
{
return array(
'post'=>array(self::BELONGS_TO, 'Post', 'postId',
'joinType'=>'INNER JOIN'),
);
}
Zauważ, że typ złączenia dla relacji post
to INNER JOIN
. Dzieje się tak, ponieważ
komentarz należy do wiadomości.
attributeLabels()
¶Na koniec potrzebujemy dostosować metodę attributeLabels()
aby zdefiniować
niestandardowe etykiety dla atrybutów. Metoda da zwraca tablicę zawierająca pary
nazwa-etykieta. Podczas wywoływania metody CHtml::activeLabel() w celu wyświetlenia
etykiety atrybutu, sprawdzi ona najpierw czy zadeklarowana niestandardową etykietę.
Jeśli nie, użyje ona algorytmu do wygenerowania domyślnych etykiet.
public function attributeLabels()
{
return array(
'author'=>'Name',
'url'=>'Website',
'content'=>'Comment',
'verifyCode'=>'Verification Code',
);
}
Wskazówka: Algorytm służący do generowania domyślnych etykiet oparty jest na
nazwach atrybutów. Najpierw dzieli nazwę na słowa biorąc po uwagę wielkość liter.
Następnie zmienia pierwszą literę w każdym słowie na dużą literę. Na przykład, nazwaverifyCode
otrzyma domyślną etykietęVerify Code
.
Ponieważ chcemy przechowywać w wiadomości ilość komentarzy, gdy dodajemy lub usuwamy
komentarz, musimy poprawić odpowiadającą wiadomości ilość komentarzy. Uzyskujemy to
poprzez nadpisanie metod afterSave()
oraz afterDelete()
dla modelu komentarza Comment
.
Również nadpisujemy metodę beforeValidate()
modelu, tak że możemy konwertować zawartość
z formatu Markdown do formatu HTML oraz zapisywać czas utworzenia.
protected function beforeValidate($on)
{
$parser=new CMarkdownParser;
$this->contentDisplay=$parser->safeTransform($this->content);
if($this->isNewRecord)
$this->createTime=time();
return true;
}
protected function afterSave()
{
if($this->isNewRecord && $this->status==Comment::STATUS_APPROVED)
Post::model()->updateCounters(array('commentCount'=>1), "id={$this->postId}");
}
protected function afterDelete()
{
if($this->status==Comment::STATUS_APPROVED)
Post::model()->updateCounters(array('commentCount'=>-1), "id={$this->postId}");
}
Signup or Login in order to comment.