2010-11-09 5 views
0

J'ai besoin d'aide pour créer des itinéraires pour mon catalogue de produits. Je whant d'avoir urls quelque chose comme ceci:Zend Framework catalogue produits routes

/produits/électronique/14

/produits/électronique/ordinateurs

/produits/électronique/ordinateurs/ordinateurs portables/4

Les derniers numéros indiqués dans les URL affichent le numéro de la page en cours.

+0

Un point important que vous remarquerez peut-être dans les deux réponses ci-dessous, nous Les deux ont utilisé un contrôleur nommé "produit" et non "produits". Ceci afin d'éviter les conflits avec le routeur par défaut. – Phil

Répondre

3

Je pense que vous devez définir vos propres routes personnalisées (je préfère regex pour cela en raison de sa vitesse).

Je suppose que vous avez 3 niveaux de catégories - si vous avez besoin de plus écrire une boucle pour créer des itinéraires pour vous. Modifiez les contrôleurs et les actions selon vos besoins. J'ai supposé que page param est nécessaire - sinon modifier les expressions rationnelles.

$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 J'ai oublié le routeur regex est plus rapide que la norme. Vu que vous auriez besoin de définir l'appariement des paramètres regex (voir ma réponse), cette réponse est la meilleure. – Phil

+0

Peut vouloir définir les numéros de page par défaut à "1" – Phil

1

Vous devez ajouter plusieurs itinéraires, quelque chose comme

$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+' 
    ) 
)); 

Vous pouvez utiliser différentes actions de contrôleur par trajet, il est à vous comment vous gérez les données.

Remarque, ce qui est totalement non testé et est juste ma meilleure estimation au moment (travail dans .NET en ce moment, ne peut pas se moquer de même vers le haut)