Neurons to bytes

Установка title, keywords и description на страницы сайта в Zend Framework

Итак, в один прекрасный момент работы с 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! :)

Also interesting

Tag after , , , ,


(required)


(required but won't be displayed)