2010-11-09 2 views
0

Мне нужна помощь в создании маршрутов для моего каталога продуктов. Я whant иметь URLS что-то вроде этого:Каталог продуктов Zend Framework

/Продукция/электроника/14

/продукция/электроника/Компьютеры

/продукция/электроника/Компьютеры/ноутбуки/4

Последние номера в URL-адресах показывают текущий номер страницы списка.

+0

Один важный момент, вы можете заметить, в обоих ответах ниже, мы «Оба использовали контроллер под названием« продукт », а не« продукты ». Это делается для предотвращения конфликтов с маршрутизатором по умолчанию. – Phil

ответ

3

Я думаю, вам нужно определить свои собственные маршруты (я предпочитаю регулярное выражение для этого из-за его скорости).

Я предполагаю, что у вас есть 3 уровня категорий - если вам нужно больше написать цикл для создания маршрутов для вас. Измените контроллеры и действия для ваших нужд. Я предположил, что параметр страницы необходим - если не изменять регулярные выражения.

$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 Я забыл, что маршрутизатор регулярных выражений быстрее, чем стандарт. Увидев, как вам нужно определить соответствие параметров regex (см. Мой ответ), этот ответ является лучшим. – Phil

+0

Возможно, вы хотите установить номера страниц по умолчанию на '1' – Phil

1

Вы должны добавить несколько маршрутов, что-то вроде

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

Вы можете использовать различные действия регулятора на маршруте, это до вас, как вы на самом деле обрабатывать данные.

Заметим, что это совершенно непроверенные и только моя догадка на данный момент (работает в .NET прямо сейчас, не может даже дразнить его)

 Смежные вопросы

  • Нет связанных вопросов^_^