2010-11-09 109 views
0

我需要一些幫助爲我的產品目錄構建路由。我whant有網址是這樣的:Zend Framework產品目錄路由

/產品/電子/ 14

/產品/電子/計算機

/產品/電子/電腦/筆記本電腦/ 4

地址最後的數字顯示當前列表頁碼。

+0

您可以在以下兩個答案注意的重要一點,我們他們都使用了名爲「產品」的控制器,而不是「產品」。這是爲了避免與默認路由器發生衝突。 – Phil 2010-11-09 23:15:13

回答

3

我認爲你需要定義你自己的自定義路由(我更喜歡正則表達式,因爲它的速度)。

我假設你有3個級別的類別 - 如果你需要更多的寫一個循環來爲你創建路線。根據需要修改控制器和操作。我認爲頁面參數是必需的 - 如果不修改正則表達式。

$router = Zend_Controller_Front::getInstance()->getRouter(); 

//main category route 
$router->addRoute(
    'category_level_0', 
    new Zend_Controller_Router_Route_Regex(
     '/products/(\w+)/(\d+)', 
     array(
      'controller' => 'product', 
      'action'  => 'category', 
      'module'  => 'default' 
     ), 
     array(
      1 => 'category_name', 
      2 => 'page_nr' 
     ), 
     '/products/%s/%d' 
    ) 
); 

//sub category route 
$router->addRoute(
    'category_level_1', 
    new Zend_Controller_Router_Route_Regex(
     '/products/(\w+)/(\w+)/(\d+)', 
     array(
      'controller' => 'product', 
      'action'  => 'category', 
      'module'  => 'default' 
     ), 
     array(
      1 => 'category_name', 
      2 => 'sub_category_name' 
      3 => 'page_nr' 
     ), 
     '/products/%s/%s/%d' 
    ) 
); 

//sub sub category route :) 
$router->addRoute(
    'category_level_2', 
    new Zend_Controller_Router_Route_Regex(
     '/products/(\w+)/(\w+)/(\w+)/(\d+)', 
     array(
      'controller' => 'product', 
      'action'  => 'category', 
      'module'  => 'default' 
     ), 
     array(
      1 => 'category_name', 
      2 => 'sub_category_name' 
      3 => 'sub_sub_category_name' 
      4 => 'page_nr' 
     ), 
     '/products/%s/%s/%s/%d' 
    ) 
); 
+1

+1我忘了正則表達式路由器比標準更快。看到你需要定義正則表達式參數匹配(請參閱我的答案),這個答案是更好的答案。 – Phil 2010-11-09 23:14:29

+0

可能想要將默認頁碼設置爲「1」 – Phil 2010-11-09 23:17:24

1

你將不得不新增多個路徑,像

$router->addRoute('level1cat', new Zend_Controller_Router_Route(
    'products/:cat1/:page', 
    array(
     'controller' => 'product', 
     'action'  => 'index', 
     'page'  => 1 
    ), 
    array(
     'cat1' => '\w+', 
     'page' => '\d+' 
    ) 
)); 

$router->addRoute('level2cat', new Zend_Controller_Router_Route(
    'products/:cat1/:cat2/:page', 
    array(
     'controller' => 'product', 
     'action'  => 'index', 
     'page'  => 1 
    ), 
    array(
     'cat1' => '\w+', 
     'cat2' => '\w+', 
     'page' => '\d+' 
    ) 
)); 

$router->addRoute('level3cat', new Zend_Controller_Router_Route(
    'products/:cat1/:cat2/:cat3/:page', 
    array(
     'controller' => 'product', 
     'action'  => 'index', 
     'page'  => 1 
    ), 
    array(
     'cat1' => '\w+', 
     'cat2' => '\w+', 
     'cat3' => '\w+', 
     'page' => '\d+' 
    ) 
)); 

你可能想每個路由使用不同的控制器動作,這取決於你如何實際處理數據。

注意,這是完全未經測試,只是我目前最好的猜測(使用.NET的現在,甚至不能嘲笑它)