CakePHP获取没有语言前缀的当前URL

时间:2013-04-10 23:46:37

标签: php cakephp url-routing cakephp-2.3

我将this solution用于我的CakePHP 2.3网站的i18n。

此网址中的用户:example.com/myController/myAction/param1/param2
我想提供example.com/eng/myController/myAction/param1/param2的链接 这适用于我的视图文件中的此代码:

<a href="/eng<?php echo $this->here;?>">English</a>

但是,当此网址中的用户:example.com/fre/myController/myAction/param1/param2
我无法将他与此网址相关联:example.com/eng/myController/myAction/param1/param2

我可以通过以下方式获取完整的网址:

fullURL = Router::url( $this->here, true );
$strippedURL = str_replace("http://example.com/fre/myController/myAction/param1/param2","myController/myAction/param1/param2",$fullURL)

但我需要为每种语言都做到这一点。或者我可以从$fullURL中删除前22个字符。但它们似乎不是很好的解决方案。 你有什么建议吗?

编辑:在我的帮助/查看文件中,我使用了这个:

function getRelURL() {
  $controller = $this->request->params['controller'];
  $action = $this->request->params['action'];
  $URL = "/".$controller."/".$action."/";
  foreach ($this->request->params['pass'] as $p) {
      $URL .= urlencode($p)."/";
  }
}

如果你能推荐更好的选择,我会很高兴。

1 个答案:

答案 0 :(得分:0)

我使用了稍微不同的方法似乎运行良好,即使我没有使用命名参数和所有其他路由功能进行测试。 我在AppHelper中创建了以下函数:

public function urlLanguage($lang) {
    static $hereUrl=null;

    if (empty($hereUrl)) {
        $hereUrl = $this->request->params;
        unset ( $hereUrl ['models'] );
        unset ( $hereUrl ['named'] );
        unset ( $hereUrl ['paging'] );
        if (isset ( $hereUrl ['pass'] )) {
            foreach ( $hereUrl ['pass'] as $pass ) {
                $hereUrl [] = $pass;
            }
            unset ( $hereUrl ['pass'] );
        }
    }
    return array_merge( $hereUrl, array ('language' => $lang ) );
}

并在View中使用它,如下所示:

foreach ($languages as $lang=>$langDesc) {
    echo $this->Html->link($languageDesc, $this->Html->urlLanguage($lang));
}

其中$ languages是一个包含所有可用语言的数组。我跳过链接本身的HTML。 我按照here的说明设置了路由和语言切换。