2009-08-17 19 views
5

Estoy desarrollando un sitio web de comercio electrónico con CI que tiene categorías de productos y productos. Quiero enrutar la URL para que vaya al controlador de productos, luego ejecute la función getCategoryByName para el primer segmento y luego ejecute getProductByName para el segundo segmento. Aquí es lo que tengo:Enrutamiento 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"; 

Pero no su trabajo. "docupen" es la categoría, y "rc805" es el producto.

Gracias de antemano.


Gracias a todos por su ayuda. Esto es lo que terminé con lo que necesitaba.

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

Respuesta

11

Mi respuesta se basa un poco en la respuesta de Colin.

Cuando jugué con las rutas en CodeIgniter, llegué a la conclusión de que el orden de las rutas era importante. Cuando encuentre la primera ruta válida, no hará las otras rutas en la lista. Si no encuentra ninguna ruta válida, manejará la ruta predeterminada.

Mis rutas que he jugado un poco con mi proyecto en particular trabajaron como sigue:

$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 entré "http://localhost/index.php/search/1234/4321" Es serían encaminados a principal/Búsqueda y luego puedo utilizar $this->uri->segment(2); para recuperar el 1234 .

En el escenario me gustaría tratar (orden es muy importante):

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

No sé lo suficiente para encaminar la manera que quería (products/$1/getProductByName/$2), pero no estoy seguro de cómo se crearía un controlador para manejar esta forma particular de URI. Usando las declaraciones $this->uri->segment(n); mencionadas por Colin en su controlador, debería poder hacer lo que quiera.

5

Se debe utilizar la URI class para recuperar los "DocuPen" y "segmentos rc805" de su URL. A continuación, puede usar esos valores en cualquier función que necesite.

Por ejemplo, si su URL es www.yoursite.com/products/docupen/rc805, se utiliza lo siguiente en el controlador de productos para recuperar los segmentos y asignarlos a variables:

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

Entonces puede usar $ category y $ product como lo necesite.

2

Las rutas de CodeIgniter no funcionan bien con regex. Son compatibles, no puedo lograr que funcionen. Sería mucho más fácil atraparlos así

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