2014-09-03 2 views
2

Я создаю CMS, используя CakePHP framework. Каждая страница, созданная с помощью CMS будет иметь свой уникальный URL-псевдоним, также в зависимости от структуры виртуальной папки, например:Автоматическая маршрутизация для псевдонимов страниц в CakePHP

  • www.site.com/level-1/about-us
  • www.site.com/level -2/наш сервис-

пользователь доступно создать свою собственную страницу, которая первоначально будет иметь следующий адрес: www.site.com/pages/<page_id>, а затем создать URL-псевдоним для него www.site.com/<page_alias>

Page псевдонимы хранятся в базе данных. Как настроить маршруты, чтобы автоматически отражать эти изменения, например, когда пользователь CMS добавляет новую страницу на веб-сайт? Имея в виду, он также может обновить эти псевдонимы в будущем через CMS.

Маршруты файл имеет следующий

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

Добавление каждого нового псевдонима в маршрутах файл вручную крайне не удобно. Представьте себе новостной сайт, на котором будут сотни статей с их уникальными псевдонимами. Есть ли элегантное решение для этого?

+0

его, как это должно быть сделано в загрузчике или что-то или может быть в beforeFilter() из приложения controller.but каждый раз fetchning данные и определить маршрут займет много времени. –

ответ

0

Нам нужно проверить, не является ли page_alias не первоначальным контроллером, который мы планировали, например. если у вас есть StateController, чем/states/index, следует ссылаться на функцию индекса, а не на page 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

Смежные вопросы