Статические и динамические страницы в одном контроллере

cakephp

Tagged Under : , ,

В 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/”, а чтобы вывести динамическую страницу, достаточно добавить ее в БД.

Комментарии:

Оставить комментарий