CakePHP Router :: connect () псевдонимы? - PullRequest
1 голос
/ 01 марта 2010

Возможно ли в CakePHP иметь псевдонимы URL в rout.php?Или каким другим способом можно добиться чего-то эквивалентного:

Допустим, у меня есть несколько разбитых на страницы представлений.Среди возможных заказов есть конкретные, которые я хочу привязать к простому URL.Например:

Как добавить параметры в Router :: connect ()?Псевдокод:

Router::connect('/'.__('headlines',true),
        array(
        'controller' => 'posts',
        'action' => 'listView'
        'params' => 'page:1/sort:Post.created/direction:desc',
        )
);

Ответы [ 2 ]

3 голосов
/ 20 декабря 2012

Да, это возможно ... Bootstrap.php загружается перед маршрутами, поэтому, если вы установите что-то вроде:

session_start();
if(isset($_SESSION['lng'])){
    Configure::write('Config.language', $_SESSION['lng']);
}

... и в вашем контроллере приложения в beforeFilter:

$language = 'xy';
Configure::write('Config.language', $language);
$_SESSION['lng'] = $language;

Таким образом, на начальной странице отображается запрос языка, перенаправьте на xy.site.com или www.site.com/xy, что вам нравится. Теперь второй рендер изменится $language и на страницах ссылок и установит $_SESSION['lang'] ...

Все ссылки на маршрутизаторы, такие как:

Router::connect(__('/:gender/search/:looking_for/*'), array('controller' => 'users', 'action' => 'search'));

станет:

Router::connect(__('/:gender/trazi/:looking_for/*'), array('controller' => 'users', 'action' => 'search'));

или

Router::connect(__('/:gender/suche/:looking_for/*'), array('controller' => 'users', 'action' => 'search'));

100% проверено, работает в CakePHP 2.2. Также возможно дальнейшее улучшение, если вы поместите субдомен / анализатор URL-адресов в сам загрузчик ...

3 голосов
/ 01 марта 2010

Обратите внимание, что маршрутизатор «переводит» URL-адрес в контроллеры, действия и параметры, он не «перенаправляет» URL-адреса на другие URL-адреса. Поэтому напишите это так:

Router::connect('/headlines',
    array(
        'controller' => 'posts',
        'action' => 'listView'
        'page' => 1,
        'sort' => 'Post.created',
        'direction' => 'desc'
    )
);

Я не думаю, что '/'.__('headlines', true) сработает, так как приложение недостаточно настроено для того, чтобы что-то переводить, поэтому вы всегда сможете вернуть слово на языке по умолчанию. Кроме того, вы больше не можете переключать язык после этого момента, при первом использовании __() блокирует язык.

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

$headlines = array('en' => 'headlines', 'de' => 'schlagzeilen', ...);
foreach ($headlines as $lang => $headline) {
    Router::connect("/$headline", array('controller' => ..., 'lang' => $lang));
}

Это создаст переменную $this->param['named']['lang'], которую вы должны использовать в любом случае в URL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...