2012-03-23 3 views
3

Я успешно создал свой маршрут с использованием Regex. У меня есть несколько дополнительных параметров на моем маршруте, которые я не хочу показывать в помощнике URL, если пользователь не указал их. Как я могу это сделать?Zend_Controller_Router_Route_Regex Дополнительные параметры с обратным

Это то, что я в настоящее время

 $route = new Zend_Controller_Router_Route_Regex(
     '([a-zA-Z-_0-9-]+)-Widgets(?:/page/(\d+))?(?:/limit/(\d+))', 
     array(
      'controller' => 'widget', 
      'action'  => 'list', 
     ), 
     array(
      1 => 'color', 
      2 => 'page', 
      3 => 'limit' 

     ), 
     '%s-Widgets/' 
    ); 

    $router->addRoute('color_widgets', $route); 

Я затем вызвать URL Helper с помощью следующего кода

 echo $this->url(array('page' => $page), 'color_widgets', false); 

Это приводит к/Blue-Widgets/и не отправляет страницу в URL , Я могу это исправить, изменив реверс в маршрутизаторе

$route = new Zend_Controller_Router_Route_Regex(
     '([a-zA-Z-_0-9-]+)-Widgets(?:/page/(\d+))?(?:/limit/(\d+))', 
     array(
      'controller' => 'widget', 
      'action'  => 'list', 
      'page'  => 1 
     ), 
     array(
      1 => 'color', 
      2 => 'page', 
      3 => 'limit' 

     ), 
     '%s-Widgets/page/%d' 
    ); 

Однако это не решает мою проблему, у меня есть Url

/Сине-Widgets/страница/1/предел/10 Предел Безразлично «т показать, опять-таки я могу исправить это следующим

$route = new Zend_Controller_Router_Route_Regex(
     '([a-zA-Z-_0-9-]+)-Widgets(?:/page/(\d+))?(?:/limit/(\d+))', 
     array(
      'controller' => 'widget', 
      'action'  => 'list', 
      'page'  => 1, 
      'limit'  => 10 
     ), 
     array(
      1 => 'color', 
      2 => 'page', 
      3 => 'limit' 

     ), 
     '%s-Widgets/page/%d/limit/%d' 
    ); 

проблема с этим пользователь находится /Blue-Widgets/и я хочу, чтобы принять их на следующей странице Синий Виджеты с помощью следующего кода

 echo $this->url(array('page' => $page), 'color_widgets', false); 

Они фактически были приняты к /Сине-Widgets/страница/2/предел/10

Когда я на самом деле хочу, чтобы взять их в /Сине-Widgets/страница/2

Как может Я выполняю это с помощью Zend Framework.

ответ

2

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

  1. Написать другой маршрут для каждого дополнительного параметра (не рекомендуется)
  2. Используйте другую структуру маршрута

Вы могли бы, например, изменить свой маршрут:

$route = new Zend_Controller_Router_Route(
    'widgets/:color/*', 
    array(
     'controller' => 'widget', 
     'action'  => 'list', 
     'page'  => 1, 
     'limit'  => 10 
    ), 
    array(
     'color' => '[a-zA-Z-_0-9-]+', 
     'page' => '\d+', 
     'limit' => '\d+', 
    ) 
); 

Другой вариант - создать собственный собственный класс маршрутов, который может анализировать и строить правильный uri.

+0

Спасибо, я старался не писать собственный маршрут. Я попробую использовать Router_Route. – user1287238

0

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

$route = new Zend_Controller_Router_Route_Regex(
'([a-zA-Z-_0-9-]+)-Widgets(?:/page/(\d+))?(?:/limit/(\d+))', 
array(
    'controller' => 'widget', 
    'action'  => 'list', 
), 
array(
    1 => 'color', 
    3 => 'page', 
    5 => 'limit' 
), 
'%s-Widgets/' 
); 

$router->addRoute('color_widgets', $route);