Cdatacolumn + Clinkcolumn Одновременно

Доброе время суток, уважаемые!

Пытаюсь освоить Yii и зарылся вот в какую проблемку…

С одной стороны нужно чтобы данные, отображаемые с помощью CGridView, были гиперссылками которые генерируются в непосредственно в процессе рендеринга вьюхи, поэтому использую CLinkColumn, с другой стороны для данной вьюхи необходима функциональность интерактивной фильтрации и сортировки отображаемых данных. Но применить CDataColumn к гиперссылкам не получается, не работает ни сортировка, ни фильтрация.




<?php $this->widget('zii.widgets.grid.CGridView', array(

        'id'           =>'user-grid',

	'dataProvider' => $model->search(),

        'filter'       => $model,

	'columns' => array(

            'id',

            'name' => array(

                'class' => 'CDataColumn',

                'class' => 'CLinkColumn',

                'labelExpression' => '$data->name',

                'urlExpression' => '"/service/admin/edit/item/" . $data->tableName() . "/id/" . $data->id',

                'header' => $model->getAttributeLabel('name'),

            ),

        ),

)); ?>



В первой колонке текстовое поле для фильтра присутствует но не работает, а для второй колонки поле фильтра вообще не сгнерерировалось.

Возможно ли в принципе использовать CDataColumn и CLinkColumn одновременно, т.е. фильтровать и сортировать данные которые в браузере представляют из себя сгенерированные в процессе рендеринга гиперссылки или малой кровью эта задачка не решается?

Не знаю насчет CLinkColumn, я в таких случаях использую CDataColumn указывая в нем:


array('name'=>'city', 'value'=>'$data->getLinkToEdit();', 'type'=>'html')

в моделе определяю метод “getLinkToEdit” который генерирует ссылку. Ну фильтр в итоге работает по полю ‘city’

2 Charger

Спасибо, хорошее решение, попробую применить!

Заработало!




<?php $this->widget('zii.widgets.grid.CGridView', array(

        'id'           =>'user-grid',

	'dataProvider' => $model->search(),

        'filter'       => $model,

	'columns' => array(

            array(

                'name' => 'name',

                'value' => 'CHtml::link($data->name, array("/service/admin/edit/item/" . $data->tableName() . "/id/" . $data->id))',

                'type'  => 'raw',

                'header' => $model->getAttributeLabel('name'),

                'sortable' => TRUE,

            ),

        ),

)); ?>



Note: Поле id убрано, т.к. для моих целей оно не должно отображаться, ну и функцию для создания гиперссылок в модели создавать не стал, сделал это прямо по месту, не отходя от кассы.

Спасибо!

По идее если задано поле ‘name’ то ‘header’ можно не задавать, оно и так будет браться из getAttributeLabel

Что до генерации URL на месте, если понадобиться выводить эту ссылку где-то помимо списка, то что бы не дублировать код, все равно придется определить этот метод в моделе.

2 Charger

Относительно ‘header’ - так и есть, убрал его.

Что касается генерации ссылок, при необходимости я так и сделаю!

Спасибо за ценные советы!