2015-01-28 1 views
4

나는 모든 경로가 get 매개 변수로 전달되는 일부 경로를 다시 작성할 수있는 Yii에 몇 가지 규칙이 있습니다.매개 변수 값에 따라 경로 다시 쓰기 Yii

'<department>' => 'products/index', 
'<department>/<category>' => 'products/index', 

내가 바로 지금이 www.mysite.com/Books+ 같은 URL을 명시 적으로 내가

예를 원하는 URL을 변경됩니다 매개 변수 값의 따라 규칙을 작성하려면 % 26 +이 규칙으로 인해 다시 작성된 연필 '<department>' => 'products/index', 괜찮습니다.

나는 그 URL을 www.mysite.com/books-pencils로 변경하려고합니다. 누군가가 그 값을 비교하는 규칙을 작성하는 방법을 알고 있다면 deparment 속성을 사용하고 원하는대로 다시 씁니다.

감사

모든

답변

1

당신은 당신에게 특별한 요청을 처리하기 위해 사용자 정의 클래스를 사용할 수 있습니다. 나는이 같은 STH를 사용하고 , 데이터베이스에서 내 사용자 지정 URL을 얻을 수 있습니다 :

'urlManager'=>array(
      'rules'=>array(
       array(
        'class' => 'application.components.UrlRule', 
       ), 
      ), 
     ), 

그런 다음이 유사한 당신의 고객 사양 클래스를 만들 :이 있다면

<?php 

Yii::import("CBaseRule"); 

class UrlRule extends CBaseUrlRule 
{ 
    public function createUrl($manager,$route,$params,$ampersand) 
    { 
     // check for my special case of URL route, if not found, then return the unchaged route 
     preg_match("/^(.+)\/(.+)$/", $route, $r); 
     if(!is_array($r) or !isset($r[1]) or !isset($r[2])) { 
      return $route; 
     } 

     // handle your own route request, and create your url 
     $url = 'my-own-url/some-thing'; 

     // check for any params, which i also want to add 
     $urlParams = $manager->createPathInfo($params,"=","&"); 

     $return = trim($url,'/'); 
     $return.= $urlParams ? "?" . $urlParams : ""; 

     return $return; 
    } 

    public function parseUrl($manager,$request,$pathInfo,$rawPathInfo) 
    { 

     // handle my special url request 
     $controller = '....'; 
     $action = '.....'; 

     // return the controller/action that should be used  
     return lcfirst($controller)."/".$action; 
    } 
} 

는 나도 몰라 무엇을 당신은 원했지만 적어도이 클래스에서는 요청 된 URL로 필요한 모든 것을 할 수 있습니다. 예 : 301 리디렉션을 사용하여 유사한 URL을 많은 수의 URL로 리디렉션하는 것처럼 parseUrl 함수에서

0

첫째, 당신이 URL을 변경하려는 경우, 당신은 (이 경우 301에) 리디렉션을 수행해야합니다. 이 로직을 구현하려면 custom URL rule class을 사용할 수 있습니다.

URL 관리 프로그램 구성 :

'rules' => array(
    // custom url rule class 
    array(
     'class' => 'application.components.MyUrlRule', 
    ), 
) 

MyUrlRule 클래스 :

class MyUrlRule extends CBaseUrlRule 
{ 
    public function createUrl($manager,$route,$params,$ampersand) 
    { 
     // Logic used to create url. 
     // If you do not create urls using Yii::app()->createUrl() in your app, 
     // you can leave it empty. 
    } 

    public function parseUrl($manager,$request,$pathInfo,$rawPathInfo) 
    { 
     // modify url 
     $pathInfoCleaned = strtolower(preg_replace('+%26+', '-', $pathInfo)); 

     // redirect if needed 
     if ($pathInfo !== $pathInfoCleaned) { 
      $request->redirect($pathInfoCleaned, true, 301); 
     } 

     // parse params from url 
     $params = explode('/', $pathInfo); 
     if (isset($params[0])) { 
      $_GET['department'] = $params[0]; 
      if (isset($params[1])) { 
       $_GET['category'] = $params[1]; 
      } 
     } 

     return 'products/index'; 
    } 
}