2009-08-17 113 views
5

我正在開發一個具有產品類別和產品的CI的電子商務網站。我想要路由URL以便它將轉到產品控制器,然後爲第一個段運行getCategoryByName函數,然後爲第二個段運行getProductByName。以下是我有:CodeIgniter路由

 
URL: 
products/docupen/rc805 
 
routes.php: 
$route['products/([a-z]+)'] = "products/getCategoryByName/$1"; 
$route['products/([a-z]+)/([a-z0-9]+)'] = "products/$1/getProductByName/$2"; 

但它不工作。 「docupen」是類別,「rc805」是產品。

在此先感謝。


謝謝大家的幫助。這就是我所需要的。

 
$route['products/:any/:num'] = "products/getProductByID"; 
$route['products/:any/:any'] = "products/getProductByName"; 
$route['products/:any'] = "products/getCategoryByName"; 

回答

11

我的答案在科林的答案上稍微有些不足。

當我在CodeIgniter中玩弄路由時,我得出結論:路由的順序很重要。當它找到第一個有效的路由時,它不會執行列表中的其他路由。如果它沒有找到任何有效的路線,那麼它將處理默認路線。

我的路線,我打得四處爲我的特殊項目的工作如下:

$route['default_controller'] = "main"; 
$route['main/:any'] = "main"; 
$route['events/:any'] = "main/events"; 
$route['search/:any'] = "main/search"; 
$route['events'] = "main/events"; 
$route['search'] = "main/search"; 
$route[':any'] = "main"; 

如果我進入「http://localhost/index.php/search/1234/4321」這將被路由到主/搜索,然後我可以使用$this->uri->segment(2);檢索1234

在你的情況我會嘗試(順序很重要):

$route['products/:any/:any'] = "products/getProductByName"; 
$route['products/:any'] = "products/getCategoryByName"; 

我不知道足夠的路線,你想要的方式(products/$1/getProductByName/$2),但我不知道你將如何創建一個控制器來處理這種特定形式的URI。使用Colin在您的控制器中提到的$this->uri->segment(n);語句,您應該能夠做到您想要的。

5

您應該使用URI class從您的網址檢索「DocuPen的」和「rc805」段。然後,您可以在需要的任何功能中使用這些值。

例如,如果您的網址是www.yoursite.com/products/docupen/rc805,你會用你的產品控制器以下檢索段,並將其分配給變量:

$category = $this->uri->segment(2); //docupen 
$product = $this->uri->segment(3); //rc805 

然後不過,您可以使用$ category和$ product。

2

CodeIgniter路由不適合正則表達式。他們得到支持,而不是我永遠不能讓他們工作。這樣可以更容易地捕捉到他們

$route['products/(:any)'] = "products/getCategoryByName/$1"; 
$route['products/(:any)/(:any)'] = "products/$1/getProductByName/$2";