Zend:在依赖通用页面控制器时清理网址?

时间:2009-12-16 00:44:59

标签: zend-framework

我正在使用的应用程序具有页面结构设置,因此当您创建新页面并查看它时,URI为:

http://site.com/page/open/title/Contact Us

客户要求我们需要缩短网址,例如,先前的URI应该类似于http://site.com/contact-us/

有一个通用页面控制器的原因是因为这些页面在管理区域中具有可编辑的内容区域,并且使用这种类型的结构更容易控制它们。

关于缩短它们的要求,我应该怎么做呢?例如,我应该为20个页面中的每个页面创建控制器并以某种方式重新路由它们,或者在我的初始页面控制器中设置一些方法作为open/title/的快捷方式,例如page/name/Contact Us?我认为依赖自定义重写规则是一个肮脏的解决方案,我不应该使用任何,也许我错了?

顺便说一句,其中一些页面也会有自定义的动态内容,比如表单,所以它们并不都是纯粹的html / static。任何建议都表示赞赏。

2 个答案:

答案 0 :(得分:2)

你必须为页面标题创建“slug”。它会像'联系我们'并保存它

然后使用标准路由器功能

routes.showarticles.type = "Zend_Controller_Router_Route_Regex"
routes.showarticles.route = "articles(?:/([a-zA-Z\-]+))?"
routes.showarticles.reverse = "articles/%s"
routes.showarticles.defaults.controller = "posts"
routes.showarticles.defaults.action = "show-articles"
routes.showarticles.map.1 = "slug"
routes.showarticles.defaults.slug = slug

类似这样的事情

或者你可以做类似stackoverflow,包括url中的page_id和可选的slug部分 像

  

http://zagon.org/articles/ku-ka-re-ku/56/edet-kujvashev-na-velosipede-7

     

http://zagon.org/articles/ku-ka-re-ku/56

修改

protected function _initRoutes()
{
    if ($this->hasOption('routes')) {
        $this->bootstrap('frontController');
        $frontController = $this->getResource('frontController');
        /* @var $router Zend_Controller_Router_Rewrite */
        $router = $frontController->getRouter();
        $router->addConfig(new Zend_Config($this->getOption('routes')));
    }
}

答案 1 :(得分:0)

您可以使用zend routing或mod_rewrite来处理此问题。 我的逻辑是

- If URL exists, route to the matched one
- If URL does not exist, check if space is present 
        - Replace space with '-' (or other delimiter) then do the checking again. 
        - If no space is present, display a 404 or redirect to front page.