Установка title, keywords и description на страницы сайта в Zend Framework
08/07/2009 17:30
Итак, в один прекрасный момент работы с Zend Framework вам понадобится устанавливать title, description и keywords или какую-либо другую информацию к своим страницам, получая эту информацию из БД.
Можно долго думать, как сделать это наиболее правильно, как долго думал я. Но в итоге, посовещавшись с некоторыми людьми, я пришел к выводу, что лучшего решения, как сделать плагин для фронт-контроллера - не найти.
Поэтому, я написал эту функциональность в виде готового плагина.
class Project_Controller_Plugin_Meta extends Zend_Controller_Plugin_Abstract
{
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
// Get data from model user-defined method
$sitemap = new Sitemap;
$this->page_data = $sitemap->getNodeInfoByUri( $request->getRequestUri() );
Zend_Registry::set('page_data', $this->page_data);
}
public function postDispatch(Zend_Controller_Request_Abstract $request)
{
// Set title, keywords and description
$layout = Zend_Layout::getMvcInstance();
$view = $layout->getView();
$view->headTitle($this->page_data['title']);
$view->headMeta($this->page_data['description'], 'description');
$view->headMeta($this->page_data['keywords'], 'keywords');
}
}
Как видно по названию плагина - структура библиотек моего приложения следует соглашению об именовании ZF, и повторяет структуру его библиотек для удобства. Все плагины загружаются автоматически при помощи Zend_Loader_Autoloader. Точно так же загружается и плагин из предыдущего поста.
К фронт-контроллеру плагин подключается следующим образом:
$front->registerPlugin(new Project_Controller_Plugin_Meta(), 110);
Теперь разберемся, что же происходит внутри плагина и как он работает. В методе preDispatch() нашего плагина мы получаем информацию о странице из БД, используя модель Sitemap и основываясь на текущем URI. Затем сохраняем полученную информацию в свойстве объекта плагина и в Zend_Registry.
Мы получаем информацию из БД именно в методе preDispatch() для того, чтобы она была доступна так же и в действии (action), чтобы нам не пришлось делать еще один SQL запрос, если мы захотим работать с информацией о странице внутри действия.
Затем, в методе postDispatch() мы получаем экземпляр объекта Zend_Layout и зарегистрированный в нём объект Zend_View. Он то нам и нужен. Дальше, при помощи помощников вида headTitle и headMeta мы устанавливаем в макет (layout) нужную информацию.
В макете, в секции head, выводим заголовок и мета-теги следующим образом:
<head>
<?php echo $this->headTitle() ?>
<?php echo $this->headMeta() ?>
</head>
Вот и все. Юзайте Zend Framework! :)