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