yii cgridview Свойство "CActiveDataProvider.abc" не определено

В моем контроллере:

$model = new Sheets(); $criteria = new CDbCriteria; $criteria->compare('id', $model->id); $criteria->compare('track_name', $model->track_name, true); $criteria->addCondition('user_id = '.Yii::app()->user->getId().' and '.$listSetups[$i]['condition']); $setups = new CActiveDataProvider($model, array('criteria' => $criteria)); 

На мой взгляд:

 <?php $this->widget('zii.widgets.grid.CGridView', array( 'id' => 'sheets-grid', 'dataProvider' => $model, //'filter' => $model, 'template'=>'{items}<div class="nav-controller">{pager}</div>', 'enableSorting' => false, 'columns' => array( array( 'header' => 'Track', 'name' => 'track_name', 'value' => $model->track_name, 'htmlOptions' => array( 'width' => '135px', ), ), 

Но я получаю эту ошибку:

Ошибка: свойство «CActiveDataProvider.track_name» не определено.

Кто-нибудь может показать мне, почему это? И как я могу его исправить. И я не хочу использовать $data->track_name потому что я хочу использовать $ model-> track_name в этом коде для настройки кнопки «Добавить»:

 array( 'header' => '', 'class' => 'CButtonColumn', 'template' => '<div class="wrapper-tools">{share}{facebook}{twitter}{download}{add}{update}{delete2}</div>', 'buttons'=>array ( 'add' => array ( 'label'=>'Add favorite', 'imageUrl'=> (Users::model()->checkFavorite(Yii::app()->user->getId(), $model->track_name)) ? Yii::app()->themeManager->baseUrl."/default/images/favorite.png" : Yii::app()->themeManager->baseUrl."/default/images/favorite-disabled.png", 'url'=>'Yii::app()->createUrl("/sheets/", array("id"=>$data->id))', 'options' => array('id' => 'add-favorite', 'class' => 'admin-tools' ), //'visible' => 'Users::model()->checkFavorite(Yii::app()->user->getId(), $data->id) == false', ), ), 'htmlOptions' => array( 'class' => 'admin-tools-2', ), ) 

благодаря

В CGridView вы должны использовать $data->track_name , следующая строка неверна:

 'value' => $model->track_name, 

Вы должны установить значение следующим образом:

 'value' => '$data->track_name', 

ОБНОВИТЬ

Как вы говорите, вы хотите использовать данные в кнопке для каждой строки, вам все равно нужно использовать параметр данных, так как виджет CGridView отображает одну строку за раз с данными данной строки в параметре $data , $model->attribute все еще не имеет никакого контекста, поскольку он будет отличаться для каждой строки в CGridView.

Поскольку параметр imageUrl не оценивается, вы не можете использовать параметр $data там по умолчанию, но можете, если вы создадите собственный класс для расширения CButtonColumn и переопределите это поведение.

Вы можете создать класс, например MyCButtonColumn , и сохранить его в папке с вашими components в файле MyCButtonColumn.php (таким образом, он будет автоматически загружаться по мере необходимости).

Теперь вам нужно создать метод renderButton в этом новом классе для оценки imageUrl если он нуждается в оценке, а затем вернуть результат стандартного CButtonColumn::renderButton() с недавно оцененным imageUrl следующим образом:

 class MyCButtonColumn extends CButtonColumn { protected function renderButton($id,$button,$row,$data) { if(isset($button['imageUrl']) && is_string($button['imageUrl']) && strpos($button['imageUrl'],'$data')!==false) $button['imageUrl'] = $this->evaluateExpression($button['imageUrl'],array('row'=>$row,'data'=>$data)); return parent::renderButton($id,$button,$row,$data); } } 

Наконец, вам нужно будет изменить класс столбца кнопки с CButtonColumn на MyCButtonColumn . Как только вы это сделаете, вы сможете анализировать переменные $data через переменную imageUrl следующим образом:

 array( ... 'class' => 'MyCButtonColumn', ... 'buttons'=>array ( 'add' => array( ... 'imageUrl'=> '(Users::model()->checkFavorite(Yii::app()->user->getId(),$data->track_name)) ? Yii::app()->themeManager->baseUrl."/default/images/favorite.png" : Yii::app()->themeManager->baseUrl."/default/images/favorite-disabled.png"', ... ), ... ), ... ),