3ton
(Yuretskii)
June 30, 2009, 1:08pm
1
используя Codeigniter мне понравилась фича в которой я сам определял какие будут пути и как они повлияют на мое приложение
к примеру я мог задать правило при котором путь
http://localhost/en/…s/read/24/print
мог восприниматься моим приложением как обращение к контроллеру books, методу read
причем в методе принимались 2 переменные, первая $pag которая получала значение 24 и вторая $type - значение print
так же обрабатывалось что если у меня встречаются после домена значения en - es - de то это значение присваивалось переменной $language, если же таких переменных там не было, то $language принимало значение ru
вопрос знатокам!
могу ли я использовать такой же подход в Yii
заранее спасибо!
rosko
(A)
June 30, 2009, 3:08pm
2
Конечно же!
В файл config/main.php пишется следующее:
'components'=>array(
...
'urlManager'=>array(
...
'rules'=>array(
'books/read/<pag:d+>/<type>' => 'controller/action',
'<language>/books/read/<pag:d+>/<type>' => 'controller/action',
)
...
3ton
(Yuretskii)
June 30, 2009, 8:20pm
3
спасибо, думаю подойдет, а как я могу получить значение language ?
creocoder
(Creocoder)
June 30, 2009, 11:09pm
4
Yii::app()->language, Yii::app()->sourceLanguage, Yii::app()->request->preferredLanguage… Смотря какой нужен, но в общем случае первая конструкция.
3ton
(Yuretskii)
July 1, 2009, 4:20am
5
я имел ввиду этот language
'components'=>array(
...
'urlManager'=>array(
...
'rules'=>array(
'books/read/<pag:d+>/<type>' => 'controller/action',
'<language>/books/read/<pag:d+>/<type>' => 'controller/action',
)
...
значение которого мы передаем через URL
3ton
(Yuretskii)
July 1, 2009, 6:54am
7
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 о ней ничего не знает…
Zolter
(Zolter Od)
July 1, 2009, 7:17am
8
я то уверен. а вы уверены что делаете принтовку в контроллере books -> actionRead ?
Zolter
(Zolter Od)
July 1, 2009, 7:30am
9
Вот урл:
http://dbhelp.ru/ru/books/
Вот правило:
'<language>/books/' => 'post/empty',
Вот экшинс:
public function actionEmpty()
{
print_r($_GET);
die();
}
можете в урла "ru" изменит на любое другое и увидите что всё нормально приходит в $_GET переменную language. Правило я упростил, но на работоспособность не как не влияет.
так что скорее всего это вы что то нетам прописали
3ton
(Yuretskii)
July 1, 2009, 7:34am
10
Quote
link=topic=3027.msg16508#msg16508 date=1246433423]
так что скорее всего это вы что то нетам прописали
думаю проблема в этом так что вы правы, и спасибо за помощь!
я пробовал присвоить это значение в конфиге переменной
<?php
return array(
...
'sourceLanguage' => 'ru',
'language' => $_GET['language'],
...
жаль что не получилось
Zolter
(Zolter Od)
July 1, 2009, 8:29am
11
пожалуйста
ну да, так незя
по поводу того как менять язык в приложении читайте вот эту статью http://www.yiiframew…oc/cookbook/26/
creocoder
(Creocoder)
July 1, 2009, 11:02am
12
Что не получилось ? А вы уверены, что правильно заданы правила? Вместо
'<language>/books/read/<pag:d+>/<type>' => 'controller/action'
нужно
'<language:w+>/books/read/<pag:d+>/<type>' => 'controller/action'
Забыли указать регулярное выражение. В последнем случае $_GET['language'] получит то, что необходимо.
3ton
(Yuretskii)
July 1, 2009, 12:25pm
13
Quote
в вашем случае переменную языка необходимо обрабатывать в каждом контроллере, а мне хотелось бы в одном месте
Quote
Что не получилось ? А вы уверены, что правильно заданы правила? Вместо
'<language>/books/read/<pag:d+>/<type>' => 'controller/action'
нужно
'<language:w+>/books/read/<pag:d+>/<type>' => 'controller/action'
Забыли указать регулярное выражение. В последнем случае $_GET['language'] получит то, что необходимо.
а почему тогда переменную <type> можно использовать без регулярки
это не повлияет на результат
Zolter
(Zolter Od)
July 1, 2009, 2:37pm
14
Quote
в вашем случае переменную языка необходимо обрабатывать в каждом контроллере, а мне хотелось бы в одном месте
ничего не мешает создать свой базовый контроллер TestController унаследованный от CController. А все ваши контроллеры уже наследовать от TestController. В TestController естественно добавляете всю работу с языком, и неприйдеться клонировать код
3ton
(Yuretskii)
July 1, 2009, 4:46pm
15
Quote
link=topic=3027.msg16574#msg16574 date=1246459079]
ничего не мешает создать свой базовый контроллер TestController унаследованный от CController. А все ваши контроллеры уже наследовать от TestController. В TestController естественно добавляете всю работу с языком, и неприйдеться клонировать код
хорошая идея, встречный вопрос - где должен находиться TestController, в какой папке?
samdark
(Alexander Makarov)
July 1, 2009, 5:23pm
16
Например, в components. Вообще абсолютно всё равно. Главное его подключить или прописать путь в автозагрузку.
Zolter
(Zolter Od)
July 1, 2009, 5:50pm
17
Кидайте в components, либо создайте отдельную папку (но незабудьте в конфиге прописать путь к ней)
3ton
(Yuretskii)
July 1, 2009, 5:59pm
18
Quote
Например, в components. Вообще абсолютно всё равно. Главное его подключить или прописать путь в автозагрузку.
а как прописать его в автозагрузку?
кстати возможно ли указать динамическое правило типа
'<lang:(ru|en)>/<controller>/<action>' => '$2/$3'
чтобы не прописывать отдельной строчкой каждый контроллер и action так как их может быть довольно много
rosko
(A)
July 4, 2009, 9:48pm
19
Логично если он находится в каталог protected/components
Zolter
(Zolter Od)
July 4, 2009, 10:39pm
20
Quote
а как прописать его в автозагрузку?
если будет в папке компонентов - само загрузиться. ничего прописывать не надо.