CButtonColumn для другой модели в CGridView

Я показываю CGridView для другой связанной модели на странице view&id=n. Необходимые отношения включены в файлы модели, и все отлично работает. Единственное, что кнопки в CButtonColumn связаны с соответствующими действиями модели, страница которой открывается, а я хочу, чтобы они были связаны с действиями связанной модели.

Чтобы понять, что я имею в виду, вот мой код. В view.php модели Order:

$dataProvider=new CActiveDataProvider('OrderContents', array(
'criteria'=>array(
    'condition'=>'order_id='.$model->id,
    'with'=>array('order'),
),
'pagination'=>array(
    'pageSize'=>20,
),
));

$this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'orders-contents-grid',
    'dataProvider'=>$dataProvider,
    'columns'=>array(
            'id',
            'comp_name',
            'quantity',
            'comment',
            array(
                    'class'=>'CButtonColumn',
            ),
    ),
));

Таким образом, я хочу, чтобы кнопки в CButtonColumn были связаны с соответствующими действиями для модели OrderContents, а теперь связаны с действиями модели Order. Есть ли простой способ добиться этого? Я проверил API как для CButtonColumn, так и для CGridView, чтобы узнать, могу ли я получить там какое-либо вдохновение, но мне не повезло.


person Azimuth    schedule 14.06.2012    source источник


Ответы (3)


На самом деле вам даже не нужно создавать пользовательскую кнопку, если все, что вы хотите сделать, это изменить URL-адреса. Посмотрите на viewButtonUrl, updateButtonUrl и deleteButtonUrl для CButtonColumn.

Вы бы отрегулировали URL-адреса, как показано в другом ответе.

person acorncom    schedule 14.06.2012

Вот пример использования атрибута viewButtonUrl с CButtonColumn. Мне было нелегко выяснить, как предоставить настраиваемый URL-адрес, но, немного повозившись, я в конце концов его получил. Я подумал, что поделюсь им с другими, кто может видеть эту тему. Обратите внимание, что PHP для создания URL-адреса передается в виде строки. Действительно?:

    $this->widget('zii.widgets.grid.CGridView', array(
      'id'=>'artwork-grid',
      'dataProvider'=>$dataProvider,
      'columns'=>array(
        'id',
        'artwork_id',
        'description',
        array(
          'class'=>'CButtonColumn',
          'viewButtonUrl'=>'Yii::app()->createUrl(\'admin/artwork/\'. $data->id)',
          'updateButtonUrl'=>'Yii::app()->createUrl(\'admin/artwork/update/\'. $data->id)',
          'deleteButtonUrl'=>'Yii::app()->createUrl(\'admin/artwork/delete/\'. $data->id)',
        ),
      ),
    ));

Может быть, есть лучший способ сделать это там. Я бы хотел увидеть!

person nikhiltri    schedule 26.11.2012
comment
+1 Более чистое решение путем прямой установки URL-адреса внутри viewButtonUrl, updateButtonUrl и deleteButtonUrl с помощью CButtonColumn. - person phemios; 11.10.2013

Создайте пользовательскую кнопку.

array(
       'class'=>'CButtonColumn',
       'buttons'=>array(
                        'myButton'=>array(
                             'label'=>'label of the button', //hover text
                             'imageUrl'=> 'link to an image',//icon of the button
                             'url'=>'Yii::app()->createUrl("controller/action")', //target of the button
                        ),
       'template'=>'{myButton}' //and others
     ),

Полный список параметров можно найти здесь.

person adamors    schedule 14.06.2012
comment
любая идея, что должно быть url? Должен ли я использовать абсолютный URL? А где находятся стандартные иконки для кнопок? - person Azimuth; 14.06.2012
comment
url должно быть что-то вроде Yii::app()->createUrl("controller/action"). Значки по умолчанию загружаются в папку ресурсов, но вы можете использовать для этого любой URL-адрес, если он абсолютный. - person adamors; 14.06.2012
comment
Спасибо. Также нужно будет передать идентификатор. Любая идея, как это получить? Я имею в виду 'url'=>'Yii::app()->createUrl("controller/action&id=somehow_get_current_id")' - person Azimuth; 14.06.2012
comment
Вы можете сделать Yii::app()->createUrl("controller/action", array("id"=>$data->id), если ваша модель имеет свойство id. $data представляет вашу модель при анализе CGridView. - person adamors; 14.06.2012