Необязательный параметр Zend Route Regex - PullRequest
3 голосов
/ 03 июня 2010

Как сделать опции параметров регулярного выражения маршрута с Zend?

Я пытаюсь создать хорошо отформатированные URL («search? S = mp & t = w» вместо «search / index / s / mp / t / w») для поисковых фильтров, напр. :

Популярность

  • Самые популярные (s = mp)
  • Самые просматриваемые (s = mv, по умолчанию)
  • Лучший рейтинг (s = tr)
  • С наибольшим количеством комментариев (s = mc)

Период

  • Весь период (t = a, по умолчанию)
  • Сегодня (t = d)
  • На этой неделе (t = w)
  • в этом месяце (t = m)

Итак, чтобы получить все предметы с самым высоким рейтингом с сегодняшнего дня, у меня будет: search? S = tr & t = d

Для маршрутов регулярных выражений я должен указать значения по умолчанию, и проблема в том, что помощник вида URL генерирует ссылки со значениями по умолчанию, а не с текущими значениями.

Вот мой маршрут:

resources.router.routes.search.type = "Zend_Controller_Router_Route_Regex"
resources.router.routes.search.route = "search\?s\=(.+)\&t\=(.+)"
resources.router.routes.search.map.1 = s
resources.router.routes.search.map.2 = t
resources.router.routes.search.defaults.module = front
resources.router.routes.search.defaults.controller = search
resources.router.routes.search.defaults.action = index
resources.router.routes.search.defaults.s = mv
resources.router.routes.search.defaults.t = a
resources.router.routes.search.reverse = "search?s=%s&t=%s"

и ссылки:

<div class="filters note">
    <div class="filters-content">
        <h3>Popularity</h3>
        <ul class="filters-list">
            <li>
                <a href="<?=$this->url(array('s' => 'mp'), 'search')?>">
                    Most popular
                </a>
            </li>
            <li>
                <a href="<?=$this->url(array('s' => 'mv'), 'search')?>">
                    Most viewed
                </a>
            </li>
            <li>
                <a href="<?=$this->url(array('s' => 'tr'), 'search')?>">
                    Top rated
                </a>
            </li>
            <li>
                <a href="<?=$this->url(array('s' => 'mc'), 'search')?>">
                    Most commented
                </a>
            </li>
        </ul>
    </div>
</div>
<div class="filters period">
    <div class="filters-content">
        <h3>Period</h3>
        <ul class="filters-list">
            <li>
                <a href="<?=$this->url(array('t' => 'a'), 'search')?>">
                    All period
                </a>
            </li>
            <li>
                <a href="<?=$this->url(array('t' => 'd'), 'search')?>">
                    Today
                </a>
            </li>
            <li>
                <a href="<?=$this->url(array('t' => 'w'), 'search')?>">
                    This week
                </a>
            </li>
            <li>
                <a href="<?=$this->url(array('t' => 'm'), 'search')?>">
                    This month
                </a>
            </li>
        </ul>
    </div>
</div>

Например, если текущая страница "search? S = tr & t = d" и я нажимаю "На этой неделе" , ссылка будет: "search? s = mv & t = w " вместо " search? s = tr & t = w " из-за значений по умолчанию.

Я должен указать значения по умолчанию или получаю ошибку.

Есть идеи?

Спасибо, Бенджамин.

Ответы [ 2 ]

0 голосов
/ 07 августа 2010

Вы уверены, что хотите сделать это таким образом? Несколько раз я пытался «бороться с фреймворком», но узнал, что фреймворк знал лучше (с улыбкой). Могу ли я предложить другой способ? (что Google может понравиться лучше: делает ваши URL-адреса более «дружелюбными»). Используйте URL-адреса, такие как

/top-rated-widgets/today
/most-viewed-widgets/this-month
/most-commented-widgets 

где вы заменяете "виджеты" тем, о чем ваш сайт, например, "видео", "сообщения в блоге", "unicycles".

тогда каждый из вышеперечисленных маршрутов к вашему поисковому контроллеру

0 голосов
/ 03 июня 2010

Я не использовал маршруты регулярных выражений, но я видел эту ошибку. В основном, для частей defaults.[param] нужны значения. У меня свой маршрут, я устанавливаю их пустыми:

; Navigation ID Route (uses navigation id)
resources.router.routes.nav.route = "p/:id/:title/*"
resources.router.routes.nav.defaults.module = "default"
resources.router.routes.nav.defaults.controller = "index"
resources.router.routes.nav.defaults.action = "index"
resources.router.routes.nav.defaults.id = 
resources.router.routes.nav.defaults.title = 
resources.router.routes.nav.reqs.id = "\d+"
resources.router.routes.nav.reqs.title = ".*"
...