Создание и сопровождение сайтов

Блог. Yii. Советы по Yii. Глава пятнадцатая.

Поиск

Советы по Yii. Глава пятнадцатая.

  1. Выводим CStarRating в GridView.

    В качестве вступления: На сайте есть система комментариев с рейтингом (выставление оценок при помощи виджета CStarRating). Необходимо в GridView отображать рейтинг "звёздочками".

    yii-tips-15-01.jpg

    Для этого нам потребуется во вьюшке в значение ключа 'value' скопировать:

    1. $this->grid->controller->widget("CStarRating"array("name" => $data->id, "id" => $data->id, "value" => $data->rating, "readOnly" => true,),true)  

    Полный вид будет примерно следующим:

    1. array(  
    2.     'name' => 'rating',  
    3.     'type' => 'raw',  
    4.     'value'=>'$this->grid->controller->widget("CStarRating", array("name" => $data->id, "id" => $data->id, "value" => $data->rating, "readOnly" => true,),true)',  
    5.     'headerHtmlOptions' => array('style' => 'width:85px;'),  
    6.     'htmlOptions' => array('class' => 'rating-block'),  
    7.     'filter' => false,  
    8.     'sortable' => false,  
    9. ),  

    Ну и чтобы после поиска/сортировки/фильтрации не отваливался вид ( вместо звёзд отображается набор радиобатонов) необходимо добавить следующий код:

    1. 'afterAjaxUpdate'=>"function() { 
    2.     jQuery('.rating-block input').rating({'readOnly':true}); 
    3. }",  

    В итоге должно получится как-то так:

    1. $this->widget('bootstrap.widgets.TbGridView'array(  
    2.     'id'=>'users-comments-grid',  
    3.     'dataProvider'=>$model->search(),  
    4.     'filter'=>$model,  
    5.     'afterAjaxUpdate'=>"function() { 
    6.         jQuery('.rating-block input').rating({'readOnly':true}); 
    7.     }",  
    8.     'columns'=>array(  
    9.         array(  
    10.             'name' => 'message',  
    11.             'sortable' => false,  
    12.         ),  
    13.         array(  
    14.             'name' => 'rating',  
    15.             'type' => 'raw',  
    16.             'value'=>'$this->grid->controller->widget("CStarRating", array("name" => $data->id, "id" => $data->id, "value" => $data->rating, "readOnly" => true,),true)',  
    17.             'headerHtmlOptions' => array('style' => 'width:85px;'),  
    18.             'htmlOptions' => array('class' => 'rating-block'),  
    19.             'filter' => false,  
    20.             'sortable' => false,  
    21.         ),  
    22.     ),  
    23. ));  

     

  2. Расширяем CFormatter.

    В том же GridView или DetailView мы частенько задаём тип поля, например: 'type' => 'raw', 'type' => 'text' и т.д.

    Для GridView это может выглядеть так:

    1. array(  
    2.     'name' => 'text',  
    3.     'type' => 'raw',  
    4. )  

    Для DetailView так:

    1. array(  
    2.     'label' => 'Email',  
    3.     'value' => 'email@email.com',  
    4.     'type' => 'email',  
    5.     'template' => "<tr class=\"{class}\"><th>{label}</th><td>{value}</td></tr>\n"  
    6. ),  

    Но, в основном, используется типы такие, как: 'raw', 'email', 'image' да 'url'.

    Подробнее о CFormatter и о всех его типах можно прочитать на странице документации - http://www.yiiframework.com/doc/api/1.1/CFormatter

    Будем расширять данный класс, таким образом чтобы при выводе длинных предложений наш фильтр резал текст и отдавал 5 слов с добавлением троеточия

    В папке protected/components создадим новый файл CCFormatter.php с содержимым:

    1. <?php  
    2. class CCFormatter extends CFormatter {  
    3.     public $numOfWords = 5;  
    4.   
    5.     public function formatTtext($value) {  
    6.         $value = CHtml::encode($value);  
    7.   
    8.         $lenBefore = strlen($value);  
    9.   
    10.         if($this->numOfWords){  
    11.             if(preg_match("/\s*(\S+\s*){0,$this->numOfWords}/"$value$match)){  
    12.                 $value = trim($match[0]);  
    13.             }  
    14.             if(strlen($value) != $lenBefore){  
    15.                 $value .= ' ...';  
    16.             }  
    17.         }  
    18.   
    19.         return $value;  
    20.     }  
    21. }  

    В файл config/main.php секцию 'components' добавим несколько строк:

    1. 'format' => array(  
    2.     'class' => 'application.components.CCFormatter'  
    3. ),  

    Проверим работоспособность при отображении в DetailView:

    1. Проверим работоспособность при отображении в DetailView:  
    2. array(  
    3.     'label' => 'Текст',  
    4.     'value' => 'Lorem Ipsum - это текст-"рыба", часто используемый в печати и вэб-дизайне. Lorem Ipsum является стандартной "рыбой" для текстов на латинице с начала XVI века.',  
    5.     'type' => 'ttext',  
    6.     'template' => "<tr class=\"{class}\"><th>{label}</th><td>{value}</td></tr>\n"  
    7. ),  

    На выходе увидим:

    yii-tips-15-02.jpg

     

Обсудить статью на форуме