2014-12-02 73 views
0

的部分渲染我需要做網址與一些被作爲查詢字符串,如參數應用的:Yii的UrlManager URL

site.com/controller/action/param1/param2?param3=value & param4 =值

有人可以幫我解決這個問題嗎?

回答

0

我找到了解決方案。 我創建了從CBaseUrlRule擴展的組件。

class CCustomUrlRule extends CBaseUrlRule { 

private $url; 

public function init() 
{ 
    if ($this->name === null) { 
     $this->name = __CLASS__; 
    } 
} 
    public function createUrl($manager,$route,$params,$ampersand) 
    { 
     if ($route === 'controller/index') { 
      $this->url = 'controller/'; 

     if (isset($params['param1'])) { 
      $this->url .= 'param1/' . $params['param1'] .'/'; 
     } 

     if (isset($params['param2'])) { 
      $this->url .= 'param2/' . $params['param2'] .'/'; 
     } 

     $this->url = substr($this->url, 0, -1); 

     if (isset($params['param3']) || isset($params['param4'])) { 
      $this->url .= '?'; 

      if (isset($params['param3']) && isset($params['param4'])) { 
       $this->url .= 'param3=' . $params['param3'] .'&'; 
       $this->url .= 'param4=' . $params['param4']; 
      } 
      elseif (isset($params['param3'])) { 
       $this->url .= 'param3=' . $params['param3']; 
      } 
      else { 
       $this->url .= 'param4=' . $params['param4']; 
      } 
     } 
     return $this->url; 
    } 
    return false; 
}  

    public function parseUrl($manager,$request,$pathInfo,$rawPathInfo) 
    { 
     return false; 
    } 
} 

我知道 - 它是匹配代碼,但它是工作和易於定製。

+0

但在這種情況下,你會得到'site.com/controller/action/param1/param1val/param2/param2val?param3 = value&param4 = value',並且在你想要的問題中你可以得到'site.com/controller/action/param1/param2 ?param3 = value&param4 = value' – Goodnickoff 2014-12-04 06:40:37

+0

對不起,我英語不好,可能不夠正確描述問題 – 2014-12-04 09:59:11

1

應將此規則配置:

'rules'=>array(
    array('controller/action', 'pattern'=>'controller/action/<param1:\w+>/<param2:\w+>'), 
) 

,並創建相同的URL:

Yii::app()->createAbsoluteUrl(
    'controller/action', 
    array('param1'=>'param1value', 'param2'=>'param2value', 'param3'=>'param3value', 'param4'=>'param4value' 
); 

,你會得到這個網址:

http://example.com/controller/action/param1value/param2value?param3=param3value&param4=param4value

,並得到參數將是

$_GET['param1'] //'param1value' 
$_GET['param2'] //'param2value' 
$_GET['param3'] //'param3value' 
$_GET['param4'] //'param4value' 
+0

如果參數的數量改變了? 我可以制定一個通用的規則,但指定不應該被處理的參數嗎? – 2014-12-03 08:06:57

+0

@Briareos勞倫斯當然你不能。您應該指定哪些參數將在路徑中表示('/ controller/action/param1value/param2value'),哪些將被添加到查詢中(在問號?之後)。 – Goodnickoff 2014-12-03 08:28:36