Yii CGridView изменить имя контроллера (для генерации URL) - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть представление с информацией о компании, и я добавил список заказов, сделанных этой компанией (отдельная модель и контроллер).Все работает, однако CGridView, который используется для отображения списка заказов, отображается (renderPartial()) с контроллера компании, и поэтому контроллером по умолчанию CGridView является company вместо order, что приводит к тому, что все автоматически сгенерированные URL-адреса, такие как кнопки обновления / удаления, являются недействительными, поскольку они генерируются как /company/delete?id= и должны ссылаться на контроллер order.Я обошел это, вручную создав URL-адреса для кнопок действий:

$columns[] = array(
        'class' => 'CButtonColumn',
        'buttons' => array(
            'delete' => array(
                'label' => 'Download',
                'url' => 'CController::createUrl("/order/delete", array("id"=>$data->id))',
                'options' => array('class' => 'download'),
            ),
        ),  
        'template' => '{delete}',
);

Но мне не нравится этот подход, так как для этого требуется создание каждого URL-адреса вручную.Я попытался установить controller поле CGridView, но оно доступно только для чтения.Как я могу изменить контроллер / модель по умолчанию, над которой работает CGridView?

Я также вижу, что CGridView генерирует скрытый div 'keys' с идентификаторами элементов, и эти ключи имеют update URLс неправильным именем контроллера, поэтому мне действительно нужно как-то изменить контроллер, над которым работает CGridView, так как я не хочу рисковать, обновляя записи в неправильных контроллерах.

Редактировать Iпопытался создать экземпляр контроллера и использовать его для создания виджета:

$ctrl = Yii::app()->createController('order')[0];
$ctrl->widget('zii.widgets.grid.CGridView', $grid);

Но хотя свойство владельца (только для чтения) созданного виджета является хорошим (OrderController), URL-адреса действийвсе еще генерируются с фактическим путем (/company/) вместо /order/.

1 Ответ

0 голосов
/ 18 апреля 2019

Когда вы используете относительные маршруты (например, delete), Yii будет использовать текущий контекст запроса для разрешения маршрута.Таким образом, не имеет значения, какой контроллер используется для визуализации виджета, маршрут Yii::app()->controller будет использоваться в качестве основы для относительных маршрутов.

В этом случае мало что можно сделать - если ваш виджет долженне зависит от контекста, вы должны использовать абсолютные маршруты для URL:

[
    'class' => 'CButtonColumn',
    'deleteButtonUrl' => 'Yii::app()->controller->createUrl("/order/delete",array("id"=>$data->primaryKey))',
    // ...
],

Если вы не хотите повторять это в нескольких местах, вы можете создать виджет или помощник, который подготовит настройки CGridView.

...