Как создать URL-адреса без имен параметров в Yii?

Я использую CGridView для отображения таблицы данных:

/application/protected/views/foo/bar.php

$this->widget('zii.widgets.grid.CGridView', array(
    'id' => 'my-grid',
    'dataProvider' => $dataProvider,
    'filter' => $model,
    'columns' => array(
        'myid',
        ...
        array(
            'class' => 'CButtonColumn',
        ),
    ),
));

Это создало таблицу с тремя ссылками для каждой строки: view, update и delete; например (для view): /index.php/foo/123, где 123 — идентификатор (или значение первичного ключа) элемента.

Теперь я хочу изменить вызов виджета, чтобы получить разные ссылки на кнопки, такие как /index.php/bar/123:

$this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'my-grid',
    'dataProvider' => $dataProvider,
    'filter' => $model,
    'columns' => array(
        'myid',
        ...
        array(
            'class' => 'CButtonColumn',
            'template' => '{view}{update}{delete}',
            'buttons' => array(
                'view' => array(
                    'url' => 'Yii::app()->createUrl("bar", array("myid" => $data->myid))',
                )
            ),
        ),
    ),
));

Ссылка (просмотр), которую я получаю, выглядит так: /index.php/bar/myid/123 -- и запрос заканчивается ошибкой 404.

Как строить ссылки без имени параметра в URL?


Дополнительная информация -- моя конфигурация маршрутизации в /application/protected/config/main.php:

return array(
    ...
    'components'=>array(
        ...
        'urlManager'=>array(
            'urlFormat'=>'path',
            'rules'=>array(
                '<controller:\w+>/<id:\d+>'=>'<controller>/view',
                '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
                '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
            ),
        ),
        ...
    ),
);

person automatix    schedule 19.06.2015    source источник
comment
'url' => 'Yii::app()->createUrl("foo", array("id" => $data->myid))' генерирует /index.php/foo/id/123, а не /index.php/foo/myid/123. Вы уверены, что все верно в вашем вопросе?   -  person hamed    schedule 20.06.2015
comment
Спасибо за подсказку. Да, я опечатался. Я исправил вопрос сейчас. У вас есть идея, как решить проблему?   -  person automatix    schedule 20.06.2015


Ответы (2)


Если у вас есть /index.php/bar/myid/123 в качестве URL-адреса, actionView из BarController должен иметь myid (а не id) в качестве параметра. Вероятно, у вас actionView($id), поэтому проблема в этом. Итак, вам нужно иметь actionView следующим образом:

public function actionView($myid)
{
    ...
}
person hamed    schedule 20.06.2015
comment
Да, это правильно. Но это следующий шаг. Я только что попытался изменить имя аргумента в действии контроллера - безрезультатно: сгенерированный URL-адрес выглядит как /index.php/bar/id/123. Поскольку это не имеет ничего общего с созданием URL. Это важно только на следующем этапе сопоставления URL. Итак, я хочу сначала создать URL-адрес. - person automatix; 20.06.2015

$this->widget('zii.widgets.grid.CGridView', array(
'id'=>'my-grid',
'dataProvider' => $dataProvider,
'filter' => $model,
'columns' => array(
    'myid',
    ...
    array(
        'class' => 'CButtonColumn',
        'template' => '{view}{update}{delete}',
        'buttons' => array(
            'view' => array(
                'url' => 'Yii::app()->createUrl("bar", array("myId" => $data->myid))',
            )
        ),
    ),
),
));

В /protected/config/main.php

    'urlManager'=>array(
        'urlFormat'=>'path',
        'showScriptName' => false, 
        'rules'=>array(
                   '<controller:\w+>/<myId:\d+>'=>'<controller>/view',
        ),
    ),

Изменить вид действия как

    public function actionView($myId){
      $model= User::model()->findByPk($myId);
       $this->render('view' , array('model' => $model));
    }
person Double H    schedule 20.06.2015
comment
Это именно то, что я пробовал и что не работает: /index.php/bar/id/1. Я хочу передать параметр myid в качестве параметра и получить URL-адрес, например /index.php/bar/1. - person automatix; 20.06.2015
comment
Может быть, Над кодом поможет вам. - person Double H; 20.06.2015