2012-01-07 57 views
0

goodmorning,Yii urlmanager瘋狂規則

我的網站還有一個問題。 我已經開發了一個類似於yellowpages.com的網站(當然不是很相似但只是想法)

現在,他們要求我做一些SEO和URL重寫的瘋狂東西。

我會用我的main.php

'urlManager'=>array(
     'urlFormat'=>'path', 
        'showScriptName'=>false, 
     'rules'=>array( 
          'surf/category/<id:[0-9]+>/page/<page:[0-9]+>'=>'naviga/categoria/', 
          'surf/subcategory/<id:[0-9]+>/page/<page:[0-9]+>'=>'naviga/sottocategoria/', 
          'surf/page/<page:[0-9]+>'=>'surf/', 
          'contact' =>'site/contact/', 
          'write-mail/<id:[0-9]+>' =>'site/contact/', 
          'privacy' =>'site/page/view/privacy', 
          'register'=>'site/page/view/register', 

          '<controller:\w+>/<id:\d+>'=>'<controller>/view', 
      '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>', 

      '<controller:\w+>/<action:\w+>'=>'<controller>/<action>', 

         ), 
    ), 

現在請求開始..... T_T 他們想要的網址就會類似的東西:

http://domain.com/category-name/代替http://domain.com/surf/category/3( EX)

http://domain.com/category-name/sub-category-name/而不是http://domain.com/surf/subcategory/3

http://domain.com/category-name/sub-category-name/society-name/而不是http://domain.com/detail/2

顯然其餘的鏈接必須與最後3個控制器規則一起工作.... 有人可以幫我嗎?我是在一個非常尷尬的境地....他們會踢我的屁股,如果我找不到週二的解決方案.....

T_T

在此先感謝您的幫助。

回答

8

你的事後超出了基於yii基本正則表達式的url規則的範圍。你需要的是你自己的自定義url規則類。

在配置:

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

在保護/組件/ CategoryUrlRule.php:

class CategoryUrlRule extends CBaseUrlRule { 
    public function createUrl($manager,$route,$params,$ampersand) { 
     if ($route==='naviga/categoria') { 
      return $params['categoryname']; 
     }elseif ($route==='naviga/sottocategoria') { 
      return $params['categoryname'].'/'.$params['subcategoryname']; 
     }else{ 
      return false; // this rule does not apply 
     } 
    } 

    public function parseUrl($manager,$request,$pathInfo,$rawPathInfo) { 
     if (preg_match('%^(\w+)(/(\w+))?$%', $pathInfo, $matches)) { 
      $category=$matches[1]; 
      if(!empty($matches[2]) 
       $subcategory=$matches[2]; 

      // Check in db 
      Yii:app()->db-> //... 

      if(){ // There is a match from db check above 
       if(isset($subcategory)){ 
        $_GET['subcategory']=$subcategory; 
        return 'naviga/sottocategoria'; 
       }else{ 
        $_GET['category']=$category; 
        return 'naviga/categoria'; 
       } 
      } 
     } 
    } 
} 

Using Custom URL Rule Classes

+0

這只是創建一個新的規則檢查,並且不要覆蓋現有的規則權? – Aliceiw 2012-01-09 11:16:50

+0

排序,在你的url規則數組中,每一個都將被檢查以查看請求url是否匹配。因此,如果您的第一個網址匹配了所有內容,其他人將永遠不會看到,除非第一條規則返回了錯誤 – 2012-01-23 09:51:17

+0

如何使自定義規則僅適用於請求類型? – 2012-12-21 15:05:14