管理者が独自の再帰的なページ構造を構築する CMS があります。すべてのページには独自の「url-key」があります。次に、url-key をページ構造と組み合わせて使用して URL 構造を構築し、次の構造を取得します。
{rootpage url-key}/{subpage url-key}
必要に応じて、多言語サポートがオンになり、言語プレフィックスも取得します。
{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);
}
}
}
$page->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-routes を処理するカスタム ルーター/ルートを作成することを考えていました。これにより、cms-url の組み立ても容易になります。
誰かがこの問題についてアドバイスをくれることを願っています。