2012-05-28 67 views
0

在我的默认布局我想显示的链接指向当前页面,但不同的前缀。我使用前缀'语言'来使用像www.site.com/eng/controller/action/param这样的地址。蛋糕PHP链接到当前页面有不同的前缀

我试图$this->Html->link('eng', array('language' => 'eng'));

但这创建了网址链接eng/controller/action没有传递的参数,没有命名的参数,并且没有网址参数。

我该怎么做?我宁愿优雅的解决方案就像1行代码 - 我知道这是可以做到的,但无法找到它:(

回答

1

试试这个:

// helper method, possibly AppHelper, or in AppController and set a view var 
function getCurrentParams() { 
    $route = Router::currentRoute(); 
    $params = $this->request->params; 
    $pass = $params['pass']; 
    $named = $params['named']; 
    unset($params['pass'], $params['named']); 
    if (!empty($route->options['pass'])) { 
     $pass = array(); 
    } 
    return array_merge($params, $named, $pass); 
} 

$params = $this->SomeHelper->getCurrentParams(); 
$params['language'] = 'eng'; 
// use $params for your link now 
0

$this->Html->link('eng', array('language' => 'eng', 'pass'));

+0

我知道这一点 - 我想补充传递到当前操作的所有ARGS - >其实我想链接指向同一个URL,它是当前页面,但与不同的前缀... – user606521

0

像这样的东西应该工作:

$url = Router::parse($this->here); 
$url['language'='end'; 
$this->Html->link('eng', $url); 

它不是。一条线,但你可以将其压缩成一条线,但它会很不可读。

你可以在一个辅助/功能这将是一个行调用它包虽然;-)

+0

您的代码不会在100%的工作 - 我不得不用$这个 - >请求 - >网址,而不是$这个 - >这里,因为这个第二个返回之前的东西控制器的名称被解析为控制器的名称。而我也需要在这个url中获得参数... – user606521

+0

对不起,直接输入到stackoverflow未经测试。如果你需要的参数,你可以使用array_merge $ this-> params with url url – RichardAtHome

+0

这是行不通的:url是/ controller/action/pass [0]:某事... – user606521

0

在我的情况下,这个简单的解决方案的工作呢!

<?php 
App::uses('HtmlHelper', 'View/Helper'); 
class MyHtmlHelper extends HtmlHelper { 
    public function url($url = null, $full = false) { 
     if(!isset($url['language']) && isset($this->params['language']) && is_array($url)) { 
      $url['language']= $this->params['language']; 
     } 
     if(count($url) == 1 && isset($url['language'])){ 
      $params = $this->params; 
      $url = array_merge($params['pass'],$url); 
     } 
     return parent::url($url, $full); 
    } 
} 

和AppController的

public $helpers = array(
    ... 
    'Html' => array('className' => 'MyHtml') 
    ... 
);