2009-08-17 10 views
5

Je développe un site de commerce électronique avec CI qui a des catégories de produits et des produits. Je veux router l'URL pour qu'elle passe au contrôleur de produits, puis exécutez la fonction getCategoryByName pour le premier segment, puis exécutez getProductByName pour le second segment. Voici ce que j'ai:CodeIgniter Routage

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

Mais sa ne fonctionne pas. "docupen" est la catégorie, et "rc805" est le produit.

Merci d'avance.


Merci à tous pour votre aide. C'est ce que j'ai fini avec pour ce dont j'avais besoin.

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

Répondre

11

Ma réponse se base un peu sur la réponse de Colin. Quand j'ai joué avec les routes dans CodeIgniter, je suis arrivé à la conclusion que l'ordre des routes était important. Quand il trouve la première route valide, il ne fera pas les autres routes dans la liste. S'il ne trouve aucune route valide, il traitera la route par défaut.

Mes itinéraires que je joué avec mon projet particulier travaillé comme suit:

$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"; 

Si je suis entré dans « http://localhost/index.php/search/1234/4321 » Il serait mis en déroute au menu principal/recherche et je peux ensuite utiliser $this->uri->segment(2); pour récupérer le 1234 .

Dans votre scénario, je voudrais essayer (l'ordre est très important):

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

Je ne sais pas assez pour acheminer la façon dont vous voulez (products/$1/getProductByName/$2), mais je ne sais pas comment vous créer un contrôleur pour gérer cette forme particulière d'URI. En utilisant les instructions $this->uri->segment(n); mentionnées par Colin dans votre contrôleur, vous devriez être capable de faire ce que vous voulez.

5

Vous devez utiliser le URI class pour récupérer les segments "DocuPen" et "rc805" de votre URL. Vous pouvez ensuite utiliser ces valeurs dans toutes les fonctions dont vous avez besoin.

Par exemple, si votre URL est www.yoursite.com/products/docupen/rc805, vous pouvez utiliser les éléments suivants dans votre contrôleur de produits pour récupérer les segments et les affecter à des variables:

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

Ensuite, vous pouvez utiliser $ category et $ product comme bon vous semble.

2

Les routes CodeIgniter ne fonctionnent pas bien avec regex. Ils sont soutenus, pas je ne peux jamais les faire travailler. Il serait beaucoup plus facile de les attraper comme ceci

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