2011-07-30 61 views
0

我試圖趁Custom URL Rule Classes的Yii中R1.8Yii的R1.8使用自定義URL規則類

我試圖採取一些看起來像單位啓用/視圖/ ID/24,而是顯示在數據庫中由名稱標識的組織名稱(即動態地將www.mysite.com/orgs/view/id/24更改爲www.mysite.com/jaysshop)。不幸的是我沒有得到它的工作。

這裏是我的代碼:

class OrgsUrlRule extends CBaseUrlRule 
{ 
    public $connectionID = 'db'; 

    public function createUrl($manager,$route,$params,$ampersand) 
    { 
     if ($route==='orgs/view/id') //even tried 'orgs/view' or 'orgs/index' 
     { 
      if (isset($params['Name'])) 
       return $params['Name']; 
      else if (isset($params['Name'])) 
       return $params['Name']; 
     } 
     return false; 
    } 

    public function parseUrl($manager,$request,$pathInfo,$rawPathInfo) 
    { 
     if (preg_match('%^(\w+)(/(\w+))?$%', $pathInfo, $matches)) 
     { 
     } 
     return false; 
    } 
} 

urlManager:

array(
    'class' => 'application.components.OrgsUrlRule', 
    'connectionID' => 'db', 
), 
+0

這並不完全清楚你想在這裏做什麼。是客戶輸入orgs/view/id/24網址,並且您想將他重定向到jaysshop?或者你是否試圖在你的代碼中顯示url?我想你可能對createUrl函數有錯誤的想法。當您在您的網站某處使用createUrl功能時,會使用該功能。如果你想實際採取一個網頁瀏覽並想「翻譯」網址,那麼你需要使用parseUrl函數。 – Blizz

+0

@Blizz我明白你在說什麼,但在Yii r1.8(上面鏈接)中提供了這個新功能,它顯示了urlManager處理url重寫。就像您可以在urlManger中使用'events'=>'events/index'一樣,讓用戶輸入www.mysite.com/events而不是www.mysite.com/events/index。當我閱讀它時,自定義URL規則類應該允許你在更廣泛但粒度更細的情況下做同樣的事情。 – enfield

+0

@Blizz在這個論壇的問題,[需要URL的用戶名,類似於Facebook](http://www.yiiframework.com/forum/index.php?/topic/10829-need-of-url-with-username他們弄清楚了我想用變量做什麼,但是在Yii r1.8發佈的附加功能發佈之前,我想了解並使用 – enfield

回答

2

我給你,你要採取從URL商店的名稱引發的假設這個例子中,

public function parseUrl($manager,$request,$pathInfo,$rawPathInfo) 
{ 
    $aParts = explode('/', $pathInfo); 
    if (count($aParts) == 1) // It's only 1 piece, so a possible "shop name" 
    { 
     if (isAValidNameForAShop($aParts[0])) 
     { 
     $_REQUEST['id'] = $aParts[0]; // Store it to retrieve it in the controller 
     return 'orgs/view'; 
     } 
    } 
    return FALSE; // Seems like something else, we don't apply 
} 
:它

例如控制器/行動

希望能幫助你一點。

+0

@ Blizz,感謝您的參與。我會盡力並將這個明天納入。 – enfield