2009-08-17 1 views
5

Я разрабатываю сайт электронной коммерции с CI, который имеет категории продуктов и продукты. Я хочу перенаправить URL-адрес, чтобы он перешел к контроллеру продуктов, затем запустил функцию getCategoryByName для первого сегмента, а затем запустил getProductByName для второго сегмента. Вот что у меня есть:CodeIgniter Routing

 
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. Используя операторы $this->uri->segment(n);, упомянутые Колином в вашем контроллере, вы сможете делать то, что хотите.

5

Вы должны использовать URI class для получения "DocuPen" и "rc805" сегменты из вашего URL. Затем вы можете использовать эти значения в любых функциях, которые вам нужны.

Например, если ваш URL является 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";