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
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"