我正在使用CakePHP框架创建CMS。通过CMS创建的每个页面都将具有其唯一的URL别名,具体取决于虚拟文件夹结构,例如:
用户可以创建自己的页面,该页面最初将具有以下地址:
www.site.com/pages/<page_id>
然后为其创建网址别名www.site.com/<page_alias>
页面别名存储在数据库中。 如何配置路由以自动反映这些更改,例如,当CMS用户向网站添加新页面时?考虑到他也可以通过CMS更新这些别名。
路由文件包含以下内容
Router::connect(
'/pages/**',
array('controller' => 'pages', 'action' => 'show')
);
手动添加路径文件中的每个新别名非常不方便。想象一下,一个新闻网站将有数百篇文章及其独特的别名。 对此有优雅的解决方案吗?
答案 0 :(得分:1)
您可以从数据库中获取别名并将其放入路径中。此实现使用缓存来防止在每个请求上加载路由。
$menus = '';
//Cache::delete('routemenus'); You can uncomment this to delete cache if you change menus
if($menus = Cache::read('routemenus') === false){
echo 'load from db';
$menusModel = ClassRegistry::init('Menu');
$menus = $menusModel->find('all', array('conditions' => array('parent_id' => '1')));
Cache::write('routemenus', $menus);
}
foreach($menus as $menuitem){
Router::connect('/' . $menuitem['Menu']['code'] . '/:action/*', array('controller' => $menuitem['MenuType']['code'], 'action' => 'index'));
}
Router::connect('/', array('controller' => 'homepage', 'action' => 'index'));
http://bakery.cakephp.org/articles/iworm/2010/01/10/how-to-implement-dynamic-route-in-cakephp
答案 1 :(得分:0)
我们需要检查page_alias是否不是我们想要的原始控制器。如果你有StatesController而不是/ states / index应该引用索引函数而不是状态page_alias。为此,您需要在保存时忽略具有控制器名称或已定义的路径库的slugs。
接下来,您必须确定是否存在page_alias slug 你可以为此扩展CakeRoute。
查看此http://mark-story.com/posts/view/using-custom-route-classes-in-cakephp 它可以更好地实现您想要做的事情。