11
Статические и динамические страницы в одном контроллере
cakephp
Tagged Under : cakephp, controller, pages
В CakePHP есть замечательный стандартный контроллер pages который позволяет нам отображать статические страницы просто создав новый файл.
Но очень часто нам требуется иметь как статические страницы так и динамические, содержание которых хранится в БД. Ниже я приведу пример как это можно реализовать используя один контроллер.
Предположим у вас есть метод в контроллере pages с именем view:
function view($id = null) { if (!$id) { $this->Session->setFlash(__('Invalid Page.', true)); $this->redirect(array('action'=>'index')); } $page = $this->Page->find('first', array('conditions'=>array('name'=>$id))); $this->set('page', $page); }
Этот метод выводит содержание динамической страницы.
Теперь сделаем так, чтобы данный метод мог выводить и статические и динамические страницы.
Прежде всего добавим в контроллер pages новый метод display. Он находится в стандартном контроллере pages и имеет вид:
function display() { $path = func_get_args(); $count = count($path); if (!$count) { $this->redirect('/'); } $page = $subpage = $title = null; if (!empty($path[0])) { $page = $path[0]; } if (!empty($path[1])) { $subpage = $path[1]; } if (!empty($path[$count - 1])) { $title = Inflector::humanize($path[$count - 1]); } $this->set(compact('page', 'subpage', 'title')); $this->render(join('/', $path)); }
После того как мы добавили новый метод, нам необходимо модифицировать метод view для достижения поставленной цели:
function view($id = null) { if (!$id) { $this->Session->setFlash(__('Invalid Page.', true)); $this->redirect(array('action'=>'index')); } $page = $this->Page->find('first', array('conditions'=>array('name'=>$id))); if ($page){ $this->set('page', $page); }else{ $this->display($id); } }
Рассмотрим подробнее проделанные изменения. Вначале мы попробуем найти страницу с заданным именем в БД, если она там найденна то выведем ее, если нет, то, вызываем новый метод display, который ищет в “/app/views/pages/” файл с названием которое передается в параметре метода и выводит его.
Готово! Теперь чтобы вывести статичную страницу достаточно создать файл с расширением “ctp” в каталоге “/app/views/pages/”, а чтобы вывести динамическую страницу, достаточно добавить ее в БД.

Взял на вооружение. Спс