2011-02-14 126 views
0

我有一个CMS,其中管理员构建自己的递归页面结构。每个页面都有自己的“url-key”。接下来的URL键组合使用与页面结构来构建URL结构,使您得到以下结构:Zend Framework - cms页面路由

{rootpage url-key}/{subpage url-key} 

可选,多语言supporst是,你还可以得到一个语言前缀:

{language code}/{rootpage url-key}/{subpage url-key} 

我几乎通过为每个页面提供自己的静态路由然后将它们链接在一起来获得上述工作。

/** 
* Initializes the sites navigation. 
* 
* @param array $pages An array with the cms pages to initialize 
*/ 
protected function _initNavigation(array $pages = null) 
{ 
    $root = true; 

    if ($pages === null) { 
     $pages = Sjr_App::get()->getModel('page')->getTree(); 
     $root = true; 
    } 

    $front = Zend_Controller_Front::getInstance(); 
    $router = $front->getRouter(); 

    foreach ($pages as $page) { 

     $router->addRoute($page->getRouteName(), $page->getRoute()); 

     if ($page->children) { 
      $this->_initNavigation($page->children); 
     } 
    } 
} 

$页面级> getRoute():

/** 
* Gets the routing for the page. 
* 
* @return Zend_Controller_Router_Route_Abstract 
*/ 
public function getRoute() 
{ 
    if ($this->_route === null) { 

     $this->_route = new Zend_Controller_Router_Route_Static($this->url_key, 
      $this->getNavigationData() 
     ); 

     if ($this->parent) { 
      $parentRoute = $this->parent->getRoute(); 
      $this->_route = $parentRoute->chain($this->_route); 
     } 
    } 
    return $this->_route; 
} 

接下来,如果支持多语言,我在前面加上所有的语言路线路线:

foreach ($front->getRouter()->getRoutes() as $routeName => $route) { 
    if ($routeName != 'lang') { 
     $front->getRouter()->addRoute($routeName, $this->_languageRoute->chain($route)); 
    } 
} 

所有的路由都正确组装。但是,一旦一页和/或是一个孩子,路线不匹配。

但是除了它还没有工作,即时通讯也想知道这是否是最好的方法。页面结构可能会变得很大,这意味着它也会创建很多路由对象。我不确定这对性能有什么影响。

另外我想写一个自定义的路由器/路由来处理1路由中的所有cms路由。这也会使组装cms-urls变得更容易。

我希望有人能就这个问题给我一些建议。

回答

1

我认为你的方法应该工作(原则上)。当我在处理类似的事情时,有一件事情让我不能使用路由链作为'树',在那里你有一个顶层路由,下面有多个路由选项。

所以,如果您有:

/something 
/something/foo 
/something/bar 

这些都需要三个完全独立的路线。您不能为/通过添加/ foo和/ bar重用某个路由对象,期望路由器能够确定使用哪一个路由对象。如果你的$ this-> parent方法重用页面,这可能是你的问题所在。

但是,我认为你很想知道这是否是最好的方法。它应该适用于小型站点,但是在循环中检查路由直到找到匹配,如果站点有10,000个页面,那么这将是一个相当慢的路由过程,并且路由器将执行大量重复性任务。

另一种方法是使用自定义路由类,它可以根据数据库中的键检查相关路由部分。这样你就可以用一条路线完成所有的工作,这将会更快。

我把一个blog post回来一段时间,用一些代码示例说明如何以这种方式实现虚荣URL,因此虽然这是一个不同的问题,但解决方案是相同的(自定义路由类),因此它可能会指向您正确的方向。

+0

谢谢!这似乎是我所希望的所有答案。我会去读你的博客,然后写下我自己的路线。 – sroes 2011-02-15 19:18:54