0

CakePHP 2.3 Web サイトの i18n に このソリューションを使用しました。

ユーザーがこの URL にいる場合:example.com/myController/myAction/param1/param2
へのリンクを提供したいexample.com/eng/myController/myAction/param1/param2 これは、ビュー ファイル内の次のコードでうまく機能します。

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

しかし、ユーザーがこの URL にいる場合:example.com/fre/myController/myAction/param1/param2
彼をこの URL にリンクすることはできません:example.com/eng/myController/myAction/param1/param2

これで完全な URL を取得できます。

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

しかし、私はすべての言語のためにこれを作る必要があります. または、 から最初の 22 文字を取り除くこともでき$fullURLます。しかし、それらは良い解決策ではないようです。何か提案はありますか?

編集:ヘルパー/ビューファイル内でこれを使用しました:

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)."/";
  }
}

より良い代替案をお勧めいただければ幸いです。

4

1 に答える 1

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 ) );
}

ビューで次のように使用します。

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

$languages は、使用可能なすべての言語を含む配列です。リンク自体の周りの HTML をスキップしました。こちらの手順に従って、ルートと言語の切り替えを設定しました。

于 2013-04-11T11:46:55.570 に答える