Украшение URL-адресов с помощью правил urlManager работает только в одну сторону.

Я следовал этому tut (копия это) для создания собственного правила для именованных параметров. В моем массиве правил я добавил 2 верхние строки для разбора параметра Assortment[groupCategory] назад и вперед.

  'urlManager'=>array( 
        'showScriptName'=>false, 
        'urlFormat'=>'path',
        'rules'=>array(      
             'assortment/<Assortment[groupCategory]:\d+>'=> 'assortment/index',
             'assortment/<Assortment%5BgroupCategory%5D:\d+>'=> 'assortment/index', 
             '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
             '<controller:\w+>/<action:\w+>'=>'<controller>/<action>', 
         ),
       ),

Это работает вперед: с http://tarex.ru/assortment/index/Assortment[groupCategory]/1 yii распознает Assortment[groupCategory] как параметр GET, равный 1.

Но если из формы я запрашиваю

  • http://tarex.ru/assortment/index?Assortment[groupCategory]=2 or
  • http://tarex.ru/assortment/index?Assortment%5BgroupCategory%5D=2

он не преобразует его в удобочитаемый ulr, например:

http://tarex.ru/assortment/index/Assortment[groupCategory]/2

Почему? Тут говорят, что это двусторонний менеджер URL.

С другой стороны, при создании URL-адреса с маршрутом post/index и тегом параметра компонент urlManager также будет использовать это правило для создания желаемого URL-адреса /index.php/posts/yii. По этой причине мы говорим, что urlManager — это двусторонний менеджер URL.


person Igor Savinkin    schedule 22.11.2014    source источник


Ответы (1)


он не преобразует его в удобочитаемый ulr

Да, Yii не преобразует URL-адрес в адресной строке браузера или в параметре действия формы. Все происходит «за кулисами».

Я рекомендую вам переписать правило

'assortment/<Assortment[groupCategory]:\d+>'=> 'assortment/index'

to

'assortment/<groupCategory:\d+>'=> 'assortment/index'

Таким образом, если вы перейдете по URL-адресу http://tarex.ru/assortment/index/1, в контроллере с именем AssortmentController будет вызван метод actionIndex(). И ему будет передан параметр $groupCategory = 1. Для обработки переданной переменной вам, вероятно, потребуется изменить сигнатуру методов на:

public function actionIndex( $groupCategory ) {}

«Обратный путь» будет, если вы создадите URL-адрес, получив параметры таким образом:

echo Yii::app()->controller->createUrl( 'assortment/index', array( 'groupCategory' => 1 ) ) ;

URL-адрес /assortment/index/1 должен быть создан.

person Maug Lee    schedule 22.11.2014
comment
могу ли я использовать Assortment[groupCategory], составной, в качестве параметра, а не groupCategory? - person Igor Savinkin; 22.11.2014
comment
Боюсь, это Assortment[groupCategory] будет работать только «в одну сторону». Потому что при присвоении значения $Assortment[groupCategory] вы присваиваете элементу массива. Вы знаете, скобки нельзя использовать в имени переменной PHP. В чем причина их использования? - person Maug Lee; 22.11.2014
comment
Или вы можете попробовать echo Yii::app()->controller->createUrl( 'assortment/index', array( 'Assortment[groupCategory]' => 1 ) ) ; :) - person Maug Lee; 22.11.2014
comment
Assortment[groupCategory] идет с Active Record ORM, используемым в Yii. Это завершается [Моделями][yiiframework.com/doc/ guide/1.1/en/form.model] и [Активные записи][yiiframework.ru/doc/guide/ru/database.ar] в Yii. Но я попробую ваше предложение. Не будет ли предложенное вами правило переопределять правило, применяемое к параметру id: '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>' ? - person Igor Savinkin; 22.11.2014
comment
спасибо за ваше объяснение. Я прорвался через управление URL-адресами. - person Igor Savinkin; 22.11.2014
comment
В диспетчере URL будет буферизовано первое соответствующее правило. Поэтому, если вы поместите конкретное правило над '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>' — первое будет иметь приоритет. - person Maug Lee; 22.11.2014