2016-12-19 8 views
0

Я считаю, что это должно быть очень просто, но я не могу заставить его работать. Я хочу создать ссылку на текущую страницу, что бы это ни было, и просто изменить параметр «lang». В основном, чтобы иметь ссылку в углу, которая меняет язык, но оставляет вас на одной странице.cakekphp 3: Создание ссылки на текущую страницу с параметром языка

Моя лучшая попытка еще это:

//current url: 'da/articles/view/1' 
$this->Url->build(['lang' => 'en']); 
//returns '/en/articles/view' 

Итак, как я могу получить его, чтобы сохранить переданную из параметров 1, который, конечно, является идентификатор статьи? Имейте в виду, у меня есть другие контроллеры, для которых я хотел бы, чтобы это работало так просто делать это не будет делать, хотя это работает:

$this->Url->build(['controller' => 'Articles', 'action' => 'view', 1, 'lang' => 'en']); 

ответ

0

При генерации адреса, маршрутизатор по умолчанию будет только автоматически заполнять plugin, controller и action ключей (также _ext, но это не слишком важно здесь).

У вас есть два дополнительных элемента маршрута, lang и id (я только предположить, что его назвали id), поэтому передавая только один из них (lang) не будет работать, он будет соответствовать другой маршрут (один, где id ISN 't определено).

Вы можете решить эту проблему, например, сохраняющегося в id и/или lang элементов, это то, что вариант persist есть для:

Router::scope('/', function (\Cake\Routing\RouteBuilder $routes) { 
    $routes->connect(
     '/:lang/:controller/:action/:id', 
     [], 
     [ 
      'lang' => 'da|en', 
      'pass' => [ 
       'lang', 
       'id' 
      ], 
      'persist' => [ 
       'lang', 
       'id' 
      ] 
     ] 
    ); 
}); 

Таким образом, указанные lang и id ключи будут заполнены значениями из URL-адреса, если они явно не переданы, что позволяет вам создавать URL-адреса, передавая только один из них (учитывая, что текущий URL-адрес соответствует маршруту, который, конечно же, сохраняет эти элементы).

Аналогичные результаты могут быть достигнуты с использованием фильтров URL (они применяются в глобальном масштабе), что в настоящее время является единственным способом, описанным в Поваренной книге. Опция persist, вероятно, была забыта после it had been reintroduced (первоначально она была удалена для версии 3.0).

Смотрите также

+0

Спасибо, но, как упоминалось у меня есть несколько контроллеров, и они могут иметь различные параметры, так что мне действительно нужно, чтобы быть в состоянии использовать это с основной маршрутизации, как это : $ routes-> connect ('/: action/*'); –

+0

@JonasKvistJensen В вашем примере «базовой маршрутизации» нет каких-либо элементов маршрута, которые вы указали в своем вопросе ... вы также не упомянули произвольные параметры, только другие контроллеры, которые будут рассмотрены в примере в мой ответ. Возможно, вы захотите обновить свой вопрос надлежащим контекстом, чтобы лучше отразить вашу проблему. – ndm

0

Сейчас я использую это решение, которое работает. Но, похоже, не должно быть более простой способ:

$current_url = Router::parse($this->request->here); 
unset($current_url['plugin']); 
unset($current_url['_matchedRoute']); 
foreach($current_url['pass'] as $pass) 
    $current_url[] = $pass; 

unset($current_url['pass']); 

foreach($langs as $key => $lang){ 
    $current_url['lang'] = $key; 
    echo $this->Html->tag('li', $this->Html->link($lang, $current_url));  
}