Предположим, что вам необходимо создать свой объект вида view в приложении Zend Framework. О том, как правильно это сделать, узнаете в этом уроке.
Создайте новый файл library/App/View.php:
class App_View extends Zend_View
{
// custom methods here
}
Так же не забудьте добавить пространство имён App_ в application.ini:
autoloadernamespaces[] = "App_"
Всё, что нам необходимо сделать так это сообщить Zend_Application, о том, что у нас есть свой собственный класс. Это может быть реализовано двумя путями: непосредственно в Bootstrap.php или предварительно создав отдельный ресурс.
_initView() в Bootstrap.php
На первый взгляд тут всё довольно-таки просто. В application/Bootstrap.php, мы добавили наш собственный метод, который создаёт объект вида:
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
protected function _initView()
{
$view = new App_View();
$viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer();
$viewRenderer->setView($view);
Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
return $view;
}
}
Данный метод мы назвали _initView() для того, чтобы он заменил собой уже существующий метод. Однако такой способ приведёт к тому, что данные вида resources.что-то из application.ini будут полностью игнорироваться, так что введём несколько изменений:
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
protected function _initView()
{
$resources = $this->getOption('resources');
$options = array();
if (isset($resources['view'])) {
$options = $resources['view'];
}
$view = new App_View($options);
if (isset($options['doctype'])) {
$view->doctype()->setDoctype(strtoupper($options['doctype']));
if (isset($options['charset']) && $view->doctype()->isHtml5()) {
$view->headMeta()->setCharset($options['charset']);
}
}
if (isset($options['contentType'])) {
$view->headMeta()->appendHttpEquiv('Content-Type', $options['contentType']);
}
$viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer();
$viewRenderer->setView($view);
Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
return $view;
}
}
Данная версия функции принимает во внимание ресурсы из application.ini и очень похожа на встроенную функциональность, которую предоставляет Zend Framework.
Собственные ресурсы
Теперь самое время переопределить Zend_Application_Resource_View нашим ресурсам вида. Для этого создадим класс App_Resource_View и расположим его в library/App/Resource/View.php. Всё, что нам нужно, так это переопределить метод getView():
class App_Resource_View extends Zend_Application_Resource_View
{
public function getView()
{
if (null === $this->_view) {
$options = $this->getOptions();
$this->_view = new App_View($options);
if (isset($options['doctype'])) {
$this->_view->doctype()->setDoctype(strtoupper($options['doctype']));
if (isset($options['charset']) && $this->_view->doctype()->isHtml5()) {
$this->_view->headMeta()->setCharset($options['charset']);
}
}
if (isset($options['contentType'])) {
$this->_view->headMeta()->appendHttpEquiv('Content-Type', $options['contentType']);
}
}
return $this->_view;
}
}
Для того, чтобы заставить Zend_Application загрузить наш собственный ресурс просто добавьте данную строку application.ini:
pluginPaths.App_Resource = "App/Resource"