可选的param Zend Route Regex

时间:2010-06-03 12:46:27

标签: regex zend-framework router zend-controller-router

如何使用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)

所以,要获得今天所有评价最高的项目,我将会:搜索?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&amp; t = d”并且我在“本周”上显示,则链接为:“搜索?s = mv&amp; t = w”而不是“search?s = tr&amp; t = w”,因为默认值。

我必须指定默认值,否则会收到错误。

有什么想法吗?

谢谢, 本杰明。

2 个答案:

答案 0 :(得分:0)

我没有使用正则表达式路由,但我看到了这个错误。基本上,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 = ".*"

答案 1 :(得分:0)

你确定要这样做吗?有几次我试图“对抗框架”,但发现框架知道更好(笑)。我能建议另一种方式吗? (Google可能会更好:让您的网址更“人性化”)。使用

等网址
/top-rated-widgets/today
/most-viewed-widgets/this-month
/most-commented-widgets 

用你的网站替换“小部件”,例如“视频”,“博客帖子”,“单轮脚踏车”等。

然后上述每条路线到您的搜索控制器