Помощники вида в Zend Framework

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).

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *