Советы по Yii. Глава пятнадцатая.
-
Выводим CStarRating в GridView.
В качестве вступления: На сайте есть система комментариев с рейтингом (выставление оценок при помощи виджета CStarRating). Необходимо в GridView отображать рейтинг "звёздочками".
Для этого нам потребуется во вьюшке в значение ключа 'value' скопировать:
- $this->grid->controller->widget("CStarRating", array("name" => $data->id, "id" => $data->id, "value" => $data->rating, "readOnly" => true,),true)
Полный вид будет примерно следующим:
- array(
- 'name' => 'rating',
- 'type' => 'raw',
- 'value'=>'$this->grid->controller->widget("CStarRating", array("name" => $data->id, "id" => $data->id, "value" => $data->rating, "readOnly" => true,),true)',
- 'headerHtmlOptions' => array('style' => 'width:85px;'),
- 'htmlOptions' => array('class' => 'rating-block'),
- 'filter' => false,
- 'sortable' => false,
- ),
Ну и чтобы после поиска/сортировки/фильтрации не отваливался вид ( вместо звёзд отображается набор радиобатонов) необходимо добавить следующий код:
- 'afterAjaxUpdate'=>"function() {
- jQuery('.rating-block input').rating({'readOnly':true});
- }",
В итоге должно получится как-то так:
- $this->widget('bootstrap.widgets.TbGridView', array(
- 'id'=>'users-comments-grid',
- 'dataProvider'=>$model->search(),
- 'filter'=>$model,
- 'afterAjaxUpdate'=>"function() {
- jQuery('.rating-block input').rating({'readOnly':true});
- }",
- 'columns'=>array(
- array(
- 'name' => 'message',
- 'sortable' => false,
- ),
- array(
- 'name' => 'rating',
- 'type' => 'raw',
- 'value'=>'$this->grid->controller->widget("CStarRating", array("name" => $data->id, "id" => $data->id, "value" => $data->rating, "readOnly" => true,),true)',
- 'headerHtmlOptions' => array('style' => 'width:85px;'),
- 'htmlOptions' => array('class' => 'rating-block'),
- 'filter' => false,
- 'sortable' => false,
- ),
- ),
- ));
-
Расширяем CFormatter.
В том же GridView или DetailView мы частенько задаём тип поля, например: 'type' => 'raw', 'type' => 'text' и т.д.
Для GridView это может выглядеть так:
- array(
- 'name' => 'text',
- 'type' => 'raw',
- )
Для DetailView так:
- array(
- 'label' => 'Email',
- 'value' => 'email@email.com',
- 'type' => 'email',
- 'template' => "<tr class=\"{class}\"><th>{label}</th><td>{value}</td></tr>\n"
- ),
Но, в основном, используется типы такие, как: 'raw', 'email', 'image' да 'url'.
Подробнее о CFormatter и о всех его типах можно прочитать на странице документации - http://www.yiiframework.com/doc/api/1.1/CFormatter
Будем расширять данный класс, таким образом чтобы при выводе длинных предложений наш фильтр резал текст и отдавал 5 слов с добавлением троеточия
В папке protected/components создадим новый файл CCFormatter.php с содержимым:
- <?php
- class CCFormatter extends CFormatter {
- public $numOfWords = 5;
-
- public function formatTtext($value) {
- $value = CHtml::encode($value);
-
- $lenBefore = strlen($value);
-
- if($this->numOfWords){
- if(preg_match("/\s*(\S+\s*){0,$this->numOfWords}/", $value, $match)){
- $value = trim($match[0]);
- }
- if(strlen($value) != $lenBefore){
- $value .= ' ...';
- }
- }
-
- return $value;
- }
- }
В файл config/main.php секцию 'components' добавим несколько строк:
- 'format' => array(
- 'class' => 'application.components.CCFormatter'
- ),
Проверим работоспособность при отображении в DetailView:
- Проверим работоспособность при отображении в DetailView:
- array(
- 'label' => 'Текст',
- 'value' => 'Lorem Ipsum - это текст-"рыба", часто используемый в печати и вэб-дизайне. Lorem Ipsum является стандартной "рыбой" для текстов на латинице с начала XVI века.',
- 'type' => 'ttext',
- 'template' => "<tr class=\"{class}\"><th>{label}</th><td>{value}</td></tr>\n"
- ),
На выходе увидим:
Обсудить статью на форуме