собственные правила в рутинге

используя Codeigniter мне понравилась фича в которой я сам определял какие будут пути и как они повлияют на мое приложение

к примеру я мог задать правило при котором путь

http://localhost/en/…s/read/24/print

мог восприниматься моим приложением как обращение к контроллеру books, методу read

причем в методе принимались 2 переменные, первая $pag которая получала значение 24 и вторая $type - значение print

так же обрабатывалось что если у меня встречаются после домена значения en - es - de то это значение присваивалось переменной $language, если же таких переменных там не было, то $language принимало значение ru

вопрос знатокам! ;)

могу ли я использовать такой же подход в Yii ???

заранее спасибо!

Конечно же!

В файл config/main.php пишется следующее:



	'components'=>array(


	    ...


	    'urlManager'=>array(


		...


	         'rules'=>array(


	            'books/read/<pag:d+>/<type>'          => 'controller/action',


	            '<language>/books/read/<pag:d+>/<type>'          => 'controller/action',


		)


		...


спасибо, думаю подойдет, а как я могу получить значение language ?

Yii::app()->language, Yii::app()->sourceLanguage, Yii::app()->request->preferredLanguage… Смотря какой нужен, но в общем случае первая конструкция.

я имел ввиду этот language

   'components'=>array(


       ...


       'urlManager'=>array(


      ...


            'rules'=>array(


               'books/read/<pag:d+>/<type>'          => 'controller/action',


               '<language>/books/read/<pag:d+>/<type>'          => 'controller/action',


      )


      ...


значение которого мы передаем через URL

$_GET['language']

Quote

link=topic=3027.msg16501#msg16501 date=1246431030]

$_GET['language']

вы уверены?

потому как var_dump($_GET)

не содержит переменной с данным именем

так же просьба учесть что адрес у нас вида

http://localhost/en/…s/read/24/print

а правило

'<language>/books/read/<pag:\d+>/<type>'          => 'books/read',

и переменная language фигурирует только в правиле, а следовательно массив $_GET о ней ничего не знает…

я то уверен. а вы уверены что делаете принтовку в контроллере books -> actionRead ?

Вот урл:

http://dbhelp.ru/ru/books/

Вот правило:

'<language>/books/' => 'post/empty',

Вот экшинс:



	    public function actionEmpty()


	    {


	    	print_r($_GET);


	    	die();


        }

можете в урла "ru" изменит на любое другое и увидите что всё нормально приходит в $_GET переменную language. Правило я упростил, но на работоспособность не как не влияет.

так что скорее всего это вы что то нетам прописали

Quote

link=topic=3027.msg16508#msg16508 date=1246433423]

так что скорее всего это вы что то нетам прописали

думаю проблема в этом так что вы правы, и спасибо за помощь!

я пробовал присвоить это значение в конфиге переменной

<?php


 return array(


...


     'sourceLanguage' => 'ru',


     'language' => $_GET['language'],


...

жаль что не получилось :(

пожалуйста :)

ну да, так незя :)

по поводу того как менять язык в приложении читайте вот эту статью http://www.yiiframew…oc/cookbook/26/

Что не получилось ? А вы уверены, что правильно заданы правила? Вместо



'<language>/books/read/<pag:d+>/<type>' => 'controller/action'


нужно



'<language:w+>/books/read/<pag:d+>/<type>' => 'controller/action'


Забыли указать регулярное выражение. В последнем случае $_GET['language'] получит то, что необходимо.

Quote

link=topic=3027.msg16517#msg16517 date=1246436973]

по поводу того как менять язык в приложении читайте вот эту статью http://www.yiiframew…oc/cookbook/26/

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

Quote

Что не получилось ? А вы уверены, что правильно заданы правила? Вместо


'<language>/books/read/<pag:d+>/<type>' => 'controller/action'


нужно



'<language:w+>/books/read/<pag:d+>/<type>' => 'controller/action'


Забыли указать регулярное выражение. В последнем случае $_GET['language'] получит то, что необходимо.

а почему тогда переменную <type> можно использовать без регулярки??? ;)

это не повлияет на результат

Quote

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

ничего не мешает создать свой базовый контроллер TestController унаследованный от CController. А все ваши контроллеры уже наследовать от TestController. В TestController естественно добавляете всю работу с языком, и неприйдеться клонировать код :)

Quote

link=topic=3027.msg16574#msg16574 date=1246459079]

ничего не мешает создать свой базовый контроллер TestController унаследованный от CController. А все ваши контроллеры уже наследовать от TestController. В TestController естественно добавляете всю работу с языком, и неприйдеться клонировать код :)

хорошая идея, встречный вопрос - где должен находиться TestController, в какой папке?

Например, в components. Вообще абсолютно всё равно. Главное его подключить или прописать путь в автозагрузку.

Кидайте в components, либо создайте отдельную папку (но незабудьте в конфиге прописать путь к ней)

Quote

Например, в components. Вообще абсолютно всё равно. Главное его подключить или прописать путь в автозагрузку.

а как прописать его в автозагрузку?

кстати возможно ли указать динамическое правило типа

'<lang:(ru|en)>/<controller>/<action>'  =>  '$2/$3'

чтобы не прописывать отдельной строчкой каждый контроллер и action так как их может быть довольно много

Логично если он находится в каталог protected/components

Quote

а как прописать его в автозагрузку?

если будет в папке компонентов - само загрузиться. ничего прописывать не надо.