2012-11-11 24 views
2

我正在使用基於URL的語言,並且我有一個頁面,其中包含傳入參數的URL。重定向傳入參數 - CakePHP

我不喜歡URL中的查詢字符串('?x = y')或名爲params('x:y'),所以我用http:// localhost/cakeapp/us/controller/action/param1 /參數2 /參數3

在我AppController的(例如用戶請求,我檢查,如果沒有語言被定義URL是否有語言定義的的http://本地主機/ cakeapp /控制器/動作/參數1 /參數2/param3),那麼我想簡單地將用戶重定向到具有相同參數的語言定義的URL。

在短: 我想重定向:

的http://本地主機/ cakeapp /控制器/動作/參數1 /參數2 /參數3

的http:// localhost/cakeapp/us/controller/action/param1/param2/param3

我使用;

$這 - >重定向(

路由器:: URL(陣列( '語言'=> $這 - >會話級>讀( 'Config.language'), '基地'= > false))

);

但它重定向用戶的http://本地主機/ cakeapp /美國/控制器/動作不帶參數。

有沒有一種方法可以使用Router :: url與傳入的$ this-> passedArgs變量來構建url。

回答

0

我認爲你需要確保你傳遞的參數重定向方法:

function controllerAction($param1, $param2, $param3) { 

    $this->redirect(

     Router::url(array('language' => $this->Session->read('Config.language'), 'base' => false)), 
     $param1, 
     $param2, 
     $param3 
    ); 

} 

或以某種方式至少將您的參數到重定向方法,無論怎樣是最適合你的。我認爲你可以做到這一點也一樣,如果你不直接傳遞參數作爲參數到您的控制器的操作方法:

$this->redirect(

    Router::url(array('language' => $this->Session->read('Config.language'), 'base' => false)), 
    $this->request->params['named'][0], 
    $this->request->params['named'][1], 
    $this->request->params['named'][2] 
); 
+0

看起來好,但我想知道爲什麼它會重定向到正確的控制器和操作,即使我沒有將它們傳遞給重定向方法?但我必須通過參數? –

+0

我不知道有多少參數收入。那麼我怎麼能通過params重定向方法?他們在$ this-> passedArgs中。我無法將數組傳遞給重定向方法(它需要params爲字符串),如果我使用_implode(「/」,$ this-> passedArgs)_,它會將URL轉換爲%2F的(編碼)。 –

0

這應該工作:

Router::connect(
    '/cakeapp/:language/:controller/:action/*', 
    array(), 
    array('language'=>'[a-z]{2}') 
); 
Router::redirect(
    '/*', 
    '/cakeapp/us/'.substr(Router::url(null, false), 
    strpos(Router::url(null, false), '/', 1)) 
); 

你可以離開了字符串操作中第二行,如果你沒有應用程序前綴;像這樣:

Router::connect(
    '/:language/:controller/:action/*', 
    array(), 
    array('language'=>'[a-z]{2}') 
); 
Router::redirect('/*', '/us/'.Router::url(null, false)); 
+0

謝謝,現在這個棘手的部分:我的網站可以在網址中使用多種語言,因此它不僅是「_us_」。如何使它變得動態呢?它可以是「_en_,_de_,_it_等」 –

+0

路由是一個PHP文件,所以你可以例如在上面的'Router ::'命令之前確定你想要重定向到的語言代碼,把它放到一個變量中,說$ languageCode,並修改上面的'redirect'行到'Router :: redirect('/ *','/ cakeapp /'。languageCode。'/'。substr ...' – domsom