我觉得这应该很简单,但我不能让它发挥作用。 我想创建一个指向当前页面的链接,无论可能是什么,并且只需更改“lang”参数。基本上在角落里有一个链接可以改变语言,但会让你在同一页面上。
我最好的尝试是:
//current url: 'da/articles/view/1'
$this->Url->build(['lang' => 'en']);
//returns '/en/articles/view'
那么,我如何让它保留传递的参数1,这当然是文章的ID?请注意,我有其他控制器,我希望它能够工作,所以尽管它有效,但这样做不会这样做:
$this->Url->build(['controller' => 'Articles', 'action' => 'view', 1, 'lang' => 'en']);
答案 0 :(得分:0)
生成网址时,路由器默认只会自动填充plugin
,controller
和action
密钥(也是_ext
,但这里并不过分相关。)< / p>
您有两个额外的路由元素lang
和id
(我只假设它的名称为id
),因此只传递其中一个(lang
)不起作用,它将匹配不同的路线(未定义id
的路线。)
您可以通过例如保留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过滤器(它们全局适用)可以实现类似的结果,这是目前Cookbook中记录的唯一方法。在it had been reintroduced之后persist
选项可能被遗忘了(最初它已被删除为3.0)。
另见
答案 1 :(得分: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));
}