0 follower

Dostosowywanie modelu komentarza

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.

1. Dostosowywanie metody 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).

2. Dostosowywanie metody 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.

3. Dostosowywanie metody 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.

4. Dostosowywanie metody 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, nazwa verifyCode otrzyma domyślną etykietę Verify Code.

5. Dostosowywanie procesu zapisywania

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}");
}