cakekphp 3:使用语言参数生成当前页面的链接

时间:2016-12-19 13:46:21

标签: url cakephp parameters url-routing cakephp-3.0

我觉得这应该很简单,但我不能让它发挥作用。 我想创建一个指向当前页面的链接,无论可能是什么,并且只需更改“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']);

2 个答案:

答案 0 :(得分:0)

生成网址时,路由器默认只会自动填充plugincontrolleraction密钥(也是_ext,但这里并不过分相关。)< / p>

您有两个额外的路由元素langid(我只假设它的名称为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'
            ]
        ]
    );
});

这样,指定的langid键将使用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));       
}