В моем контроллере:
$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"', ... ), ... ), ... ),