Zend Framework — Инициализация основных параметров view и layout для модуля

Zend Framework автоматически сам не умеет подгружать layout-ы и конфигурировать объект view в соответствии с настройками модуля, прописанными в конфигурационном файле. Эта задача возложена на плечи разработчика. Приведенный плагин будет автоматически применять некоторые параметры к данным объектам, если эти параметры прописаны в конфигурационном файле. Данный плагин не зависит от предыдущего плагина объединения конфигурационных файлов. Ему не важно, в каком файле будет прописана конфигурация для модуля.

Плагин инициализирует следующие параметры модуля, если они прописаны:

modulename.resources.layout.layoutPath = "/относительный/путь/от/директории/модуля/"
modulename.resources.layout.layout = "имя шаблона"
modulename.resources.view.doctype = "тип документа для тэга DOCTYPE"
modulename.resources.view.encoding = "кодировка"
modulename.resources.view.contentType = "Сontent Type"
modulename.resources.view.title = "Заголовок сайта"
modulename.resources.view.titleSeparator = " разделитель для заголовка "
modulename.resources.view.pragmaNoCache = "On/Off" ;включение/выключение кэширования браузером

modulename. следует опустить, если вы используете предыдущий плагин для склейки конфигов и прописываете параметры в файле module.ini. Плюс в application.ini следует проинициализировать все данные параметры без modulename.. Эти параметры будут использоваться по умолчанию, если для конкретного модуля они не заданы. resources.layout.layoutPath в application.ini должен иметь абсолютный путь, как это сделано по умолчанию при создании проекта и включении layout-ов через консольное приложение zf.

Пример для application/configs/application.ini

resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/"
resources.layout.layout = "layout"
resources.view.doctype = "XHTML1_STRICT"
resources.view.encoding = "UTF-8"
resources.view.contentType = "text/html; charset=utf-8"
resources.view.title = "Тестовый проект"
resources.view.titleSeparator = " :: "
resources.view.pragmaNoCache = "On"

Пример для application/modules/admin/configs/module.ini

?Download module.ini
resources.view.title = "Администрирование"
resources.layout.layoutPath = "/layouts/scripts" ;шаблон будет подгружаться из /application/modules/admin/layouts/scripts

Собственно, реализация:

<?php
/**
 * Module view & layout config
 * Инициализирует свойства объектов view и layout из конфига для
 * выбранного модуля.
 *
 * @category   RV
 * @package    RV_Controller
 * @subpackage Plugins
 * @copyright  Copyright (c) 2010 Roman V. Konovaltsev
 * @author     Roman V. Konovaltsev
 * @version    1.0
 */
 
/**
 * @see Zend_Controller_Plugin_Abstract
 */
require_once 'Zend/Controller/Plugin/Abstract.php';
 
class RV_Controller_Plugin_ModuleConfigLV extends Zend_Controller_Plugin_Abstract {
    public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request) {
 
        $layout = Zend_Layout::getMvcInstance ();
        $front = Zend_Controller_Front::getInstance ();
        $bootstrap = $front->getParam('bootstrap');
        $options = $bootstrap->getOptions();
        $view = $bootstrap->getResource('view');
        $module = $this->getRequest()->getModuleName();
 
        // Set defaults
        $pragmaNoCache = (isset($options['resources']['view']['pragmaNoCache']) && strtolower($options['resources']['view']['pragmaNoCache']) == 'on')? true : false;
        $dLayout = isset($options['resources']['layout']['layout'])? $options['resources']['layout']['layout'] : $layout->getLayout();
        $dLayoutPath = isset($options['resources']['layout']['layoutPath'])? $options['resources']['layout']['layoutPath'] : $layout->getLayoutPath();
        $dViewDoctype = isset($options['resources']['view']['doctype'])? $options['resources']['view']['doctype'] : $view->doctype()->getDocType();
        $dViewEncoding = isset($options['resources']['view']['encoding'])? $options['resources']['view']['encoding'] : $view->getEncoding();
        $dViewContentType = isset($options['resources']['view']['contentType'])? $options['resources']['view']['contentType'] : NULL;  
        $dViewHeadTitle = isset($options['resources']['view']['title'])? $options['resources']['view']['title'] : NULL;  
        $dViewHeadTitleSeparator = isset($options['resources']['view']['titleSeparator'])? $options['resources']['view']['titleSeparator'] : NULL;  
 
        if(isset($options[$module]['resources']['layout']['layout']))
            $layout->setLayout($options[$module]['resources']['layout']['layout']);
        else
            $layout->setLayout($dLayout);
 
        if(isset($options[$module]['resources']['layout']['layoutPath']))
            $layout->setLayoutPath($front->getModuleDirectory().$options[$module]['resources']['layout']['layoutPath']);
        else
            $layout->setLayoutPath($dLayoutPath);
 
        if(isset($options[$module]['resources']['view']['doctype']))
            $view->doctype($options[$module]['resources']['view']['doctype']);
        else
            $view->doctype($dViewDoctype);
 
        if(isset($options[$module]['resources']['view']['encoding']))
            $view->setEncoding($options[$module]['resources']['view']['encoding']);
        else
            $view->setEncoding($dViewEncoding);
 
        // Set Content Type
        if (isset($options[$module]['resources']['view']['contentType']))
            $view->headMeta()->appendHttpEquiv('Content-Type', $options[$module]['resources']['view']['contentType']);
        elseif(!is_null($dViewContentType))
            $view->headMeta()->appendHttpEquiv('Content-Type', $dViewContentType);
 
        // Set Head Title
        if (isset($options[$module]['resources']['view']['title']))
            $view->headTitle($options[$module]['resources']['view']['title']);
        elseif(!is_null($dViewHeadTitle))
            $view->headTitle($dViewHeadTitle);
 
        // Set Separator
        if (isset($options[$module]['resources']['view']['titleSeparator']))
            $view->headTitle()->setSeparator($options[$module]['resources']['view']['titleSeparator']);
        elseif(!is_null($dViewHeadTitleSeparator))
            $view->headTitle()->setSeparator($dViewHeadTitleSeparator);
 
        if(isset($options[$module]['resources']['view']['pragmaNoCache']))
        {
            $pragmaNoCache = strtolower($options[$module]['resources']['view']['pragmaNoCache']) == 'on'? true : false;
        }
 
        if($pragmaNoCache)
        {
            $view->headMeta()->appendHttpEquiv('expires', 'Wed, 26 Feb 1997 08:21:57 GMT')
                             ->appendHttpEquiv('pragma', 'no-cache')
                             ->appendHttpEquiv('Cache-Control', 'no-cache');
        }
    }
}

Для работы данного кода необходимо положить данный файл по адресу
/path/to/your/project/library/RV/Controller/Plugin/ModuleConfigLV.php
и прописать следующее в application.ini:

autoloaderNamespaces.RV = "RV_"
resources.frontController.plugins.moduleConfigLV = "RV_Controller_Plugin_ModuleConfigLV"

см. также

Вы можете отслеживать комментарии к этой записи с помощью RSS 2.0. Вы можете оставить комментарий, или использовать trackback с вашего сайта.

Добавить комментарий

XHTML: Можно использовать эти теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>