Zend_Controller_Router_Route_Regex Необязательные параметры с обратным - PullRequest
3 голосов
/ 23 марта 2012

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

Это то, что у меня сейчас есть

        $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 со следующим кодом

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

В результате получается / Синий-Виджеты / и не отправляет страницу по 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

/ Blue-Widgets / page / 1 / limit /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); 

Они фактически заносятся в / Blue-Widgets / page / 2 / limit / 10

Когда я действительно хочу перевести их в / Blue-Widgets /page / 2

Как я могу сделать это с Zend Framework.

Ответы [ 2 ]

2 голосов
/ 24 марта 2012

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

  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 голосов
/ 17 апреля 2012

Вы указали неверные индексы соответствия 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);
...