我有一个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变得更容易。
我希望有人能就这个问题给我一些建议。
谢谢!这似乎是我所希望的所有答案。我会去读你的博客,然后写下我自己的路线。 – sroes 2011-02-15 19:18:54