2014-09-03 32 views
2

我使用CakePHP框架創建CMS。通過CMS創建的每個頁面都會有其獨特的URL的別名,也依賴於虛擬文件夾結構,例如:在CakePHP中自動路由頁面別名

  • www.site.com/level-1/about-us
  • www.site.com/level -2 /我們的服務

用戶可以創建自己的頁面,這將初步具備以下地址: www.site.com/pages/<page_id>,然後創建網址別名,它www.site.com/<page_alias>

頁的別名都存儲在數據庫中。 如何自動配置路線以反映這些更改,例如,當CMS用戶向網站添加新頁面時?考慮到他還可以通過CMS更新這些別名。

路由文件具有以下

Router::connect(
    '/pages/**', 
    array('controller' => 'pages', 'action' => 'show') 
); 

添加每一個新的別名路線手動檔是很不方便。設想一個新聞網站,將有數百篇文章與他們獨特的別名。 這是否有一個優雅的解決方案?

+0

它就像它在引導或事情做了或可能會在應用程序controller.but每次fetchning數據的beforeFilter()和定義路由將需要大量的時間。 – 2014-09-03 12:01:51

回答

0

我們需要檢查page_alias是否不是我們想要的原始控制器。如果StatesController比/ states/index應該引用索引函數而不是狀態page_alias。爲此,您需要在保存時忽略帶有控制器名稱的段落或已定義的路線基礎。

接下來,您將必須確定是否存在page_alias slug 您可以爲此擴展CakeRoute。

看看這個http://mark-story.com/posts/view/using-custom-route-classes-in-cakephp 它有一個更好的實現你想要做的事情。

0

您可以從數據庫中獲取別名並將其放入路由。此實現使用緩存來防止在每個請求中加載路由。

$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