Zend Framework основан на MVC (Model-View-Controller), где вид может получать доступ к модели, ну и выполнять некоторую логику отображения. Да даже не обязательно работа с моделью. Работа с датой, формой или что-то подобное очень удачно решается с использование помощников вида. Конечно, можно прям в файле вида всё это делать, но это загрязняет код, очевидно же.
Помимо того, что мы делает код читабельным, выделение подобных функций в помощник вида позволяет многократно использовать его. Как я уже сказал, та же работа с датой, много где используется. Выделив в отдельный класс работу с датой, можно будет многократно использовать этот код.
Что такое помощник вида?
Когда я впервые читал про помощник вида, то не понимал, зачем он нужен, если все действия перед отображением в виде можно обработать предварительно в контроллере. Действительно, если контроллер небольшой, то это нормально. Если эти действия применительны только к данному виду, то тоже логично всё в контроллере сделать. Другое дело, если контроллер раздут или для повторного использования в других Views’ах.
Помощник вида это класс, реализующий какую-то логику вида. После регистрации помощника в объекте вида, можно использовать его, как будто это его обычный метод. Как уже сказал, помощники вида обычно используются в следующих случаях:
- Доступ к моделям.
- Сложная или повторяемая логика отображения.
- Преобразование и форматирование данных модели.
Ключевое тут — «обычно«. Я, к примеру, не люблю, когда работа с базой/моделью в различных местах приложения происходит. Данные для отображения в виде подготавливаю в контроллере, в Views просто отображаю. Так что помощник вида использую для форматирования данных или для какой-то повторяемой логики отображения.
Создание и регистрация своего помощника вида
Стоит сразу сказать, что в Zend есть куча стандартных помощников для удобства работы. Лежат они в Zend\View\Helper. Ну, и следовательно имена у них по типу Zend_View_Helper_Doctype. То есть с префиксов ‘Zend_View_Helper_’ все. Если хотите написать свой хелпер, то можно в имени класса использовать этот префикс и закинуть файл в папку со стандартными помощниками.
Самое главное — помощники обязательно должны иметь префикс, чтобы не произошло путаницы со стандартными классами. Но лежат они могут и в другой папке. Только в этом случае необходимо будет зарегистрировать хелпер. Но…по порядку.
Название класса помощника должно начинаться с большой буквы. Файл с ним должен иметь такое же имя. То есть, если вы хотите создать свой помощник вида ShowLinks, то и файл должен быть ShowLinks.php. В нём обязательно надо определить метод, имя которого такое же, как и название класса, но начинается с буквы нижнего регистра, то есть showLinks
.
1.
class
Helpers_ShowLinks
2.
{
3.
public
function
showLinks()
4.
{
5.
...
6.
}
7.
8.
}
Так как префикс мы используем не стандартный, то необходимо зарегистрировать наш помощник вида командой addHelperPath()
. Я обычно помощники регистрирую в методе init()
контроллера. Тогда он будет во всех Action’ах контроллера доступен. Может и в конкретном экшене зарегить, тогда он будет доступен только в нём. Регистрация в контролере будет выглядеть так:
1.
...
2.
$this
->view->addHelperPath( Zend_Registry::get(
'config'
)->paths->helpers,
'Helpers'
);
3.
...
Zend_Registry::get('config')->paths->helpers
это путь, который вы в конфиге Zend’а прописали. То есть, команда регистрации ставит в соответствие путь и префикс. Она означает, что все классы с префиксов ‘Helpers_’ необходимо искать в указанной нами папке.
Если мы не наследуем наш помощник от стандартного класса, то необходимо определить метод setView()
. Класс в итоге будет таким:
01.
class
Helpers_ShowLinks
02.
{
03.
public
$view
;
04.
public
function
showLinks(
$params
= null)
05.
{
06.
...
07.
}
08.
09.
public
function
setView(Zend_View_Interface
$view
)
10.
{
11.
$this
->view =
$view
;
12.
}
13.
}
Остаётся только показать, как вызвать помощник в представлении (виде):
1.
<?php
echo
$this
->showLinks(); ?>
То есть, метод помощника вызывается как собственный метод вида. Довольно удобно. Как видите, помощник вида может на входе принимать какие-то параметры, если это необходимо. Помощники хранят состояние. Можно продемонстрировать на примере с framework.zend.com.
01.
class
My_View_Helper_SpecialPurpose
extends
Zend_View_Helper_Abstract
02.
{
03.
protected
$_count
= 0;
04.
public
function
specialPurpose()
05.
{
06.
$this
->_count++;
07.
$output
=
"I have seen 'The Jerk' {$this->_count} time(s)."
;
08.
return
htmlspecialchars(
$output
);
09.
}
10.
}
Теперь вызовем в виде повторно метод:
1.
echo
$this
->specialPurpose();
2.
echo
$this
->specialPurpose();
3.
echo
$this
->specialPurpose();
Увидим на экране: I have seen ‘The Jerk’ 1 time(s). I have seen ‘The Jerk’ 2 time(s). I have seen ‘The Jerk’ 3 time(s).