В скрипте вида часто бывает так, что необходимо выполнять определенный набор функций повторно; например, формирование даты, генерация элементов формы, отображение ссылок. Вы можете использовать вспомогательные классы для выполнения этих действий.
Чтобы применять вспомогательные классы ("помощников") в своем скрипте вида,
вызывайте их, используя $this->имяПомощника()
.
Zend_View
загрузит класс Zend_View_Helper_ИмяПомощника
,
создаст его объект, и вызовет его метод имяПомощника()
.
Этот объект находится постоянно внутри экземпляра Zend_View
и повторно используется во всех вызовах $this->имяПомощника()
.
Zend_View
снабжен начальным набором вспомогательных
классов, все они имеют отношение к генерации элементов форм.
Каждый из них автоматически выполняет соответствующее экранирование
выходных данных. Это:
formButton($name, $value, $attribs)
: Создает элемент
<input type="button" />
.
formCheckbox($name, $value, $attribs, $options)
:
Создает элемент <input type="checkbox" />
(флажок опций). Параметр $options
является массивом,
в котором первым значением является "выбранное" (checked) значение,
вторым — "невыбранное" значение (по умолчанию это '1' и '0').
Если $value
соответствует "выбранному" значению,
то этот флажок опций будет выбран.
formFile($name, $value, $attribs)
: Создает
элемент <input type="file" />
.
formHidden($name, $value, $attribs)
: Создает
элемент <input type="hidden" />
.
formPassword($name, $value, $attribs)
: Создает
элемент <input type="password" />
.
formRadio($name, $value, $attribs, $options)
: Создает
последовательность элементов <input type="radio" />
(переключатель опций). В массиве $options
ключ
элемента является значением переключателя, значение
элемента является текстом к переключателю. Переключатель опций
со значением $value
будет предварительно выбран.
formReset($name, $value, $attribs)
: Создает
элемент <input type="password" />
.
formSelect($name, $value, $attribs, $options)
:
Создает блок <select>...</select>
,
с одной опцией <option>
на каждый
элемент массива $options
. В массиве
$options
ключ элемента является значением опции,
значение элемента является текстом опции. Опция со значением
$value
будет предварительно выбрана.
formSubmit($name, $value, $attribs)
: Создает
элемент <input type="submit" />
.
formText($name, $value, $attribs)
: Создает
элемент <input type="text" />
.
formTextarea($name, $value, $attribs)
: Создает
блок <textarea>...</textarea>
.
Использование их в скрипте вида очень простое, вот пример. Обратите внимание, что это все, что вам нужно для их вызова — они будут загружаться и инстанцироваться самостоятельно, когда будут нужны.
<?php // внутри вашего скрипта вида $this ссылается на экземпляр Zend_View // // предположим, что вы уже имеете последовательность опций // в виде массива ('us' => 'United States', 'il' => // 'Israel', 'de' => 'Germany') именем $countries <!-- // inside your view script, $this refers to the Zend_View instance. // // say that you have already assigned a series of select options under // the name $countries as array('us' => 'United States', 'il' => // 'Israel', 'de' => 'Germany'). --> ?> <form action="action.php" method="post"> <p><label>Your Email: <?php echo $this->formText('email', 'you@example.com', array('size' => 32)) ?> </label></p> <p><label>Your Country: <?php echo $this->formSelect('country', 'us', null, $this->countries) ?> </label></p> <p><label>Would you like to opt in? <?php echo $this->formCheckbox('opt_in', 'yes', null, array('yes', 'no')) ?> </label></p> </form>
Результирующие выходные данные этого скрипта вида будут выглядеть наподобие этого:
<form action="action.php" method="post"> <p><label>Your Email: <input type="text" name="email" value="you@example.com" size="32" /> </label></p> <p><label>Your Country: <select name="country"> <option value="us" selected="selected">United States</option> <option value="il">Israel</option> <option value="de">Germany</option> </select> </label></p> <p><label>Would you like to opt in? <input type="hidden" name="opt_in" value="no" /> <input type="checkbox" name="opt_in" value="yes" checked="checked" /> </label></p> </form>
Как и для скриптов вида, ваш контроллер может задать
стек путей, в которых Zend_View
должен искать
вспомогательные классы. По умолчанию Zend_View
ищет вспомогательные классы в Zend/View/Helper/*
. Вы
можете приказать Zend_View
искать в других местах,
используя методы setHelperPath()
и
addHelperPath()
. Кроме этого, вы можете указать префикс
класса, используемый для вспомогательных классов, он
обеспечивает пространство имен. Если префикс не указан, то по
умолчанию используется 'Zend_View_Helper_'.
<?php $view = new Zend_View(); // Устанавливает путь /path/to/more/helpers с префиксом 'My_View_Helper' $view->setHelperPath('/path/to/more/helpers', 'My_View_Helper'); ?>
Вы можете "складывать" в стек пути, используя метод
addHelperPath()
. Если вы добавили
пути в стек, то Zend_View
будет искать запрошенный
вспомогательный класс в этих путях, начиная с пути, добавленного
последним. Это дает возможность добавлять (или даже замещать)
к начальному набору свои собственные вспомогательные классы.
<?php $view = new Zend_View(); // Добавить /path/to/some/helpers с префиксом для классов 'My_View_Helper' $view->addHelperPath('/path/to/some/helpers', 'My_View_Helper); // Добавить /other/path/to/helpers с префиксом для классов 'Your_View_Helper' $view->addHelperPath('/other/path/to/helpers', 'Your_View_Helper'); // теперь, когда вы вызываете $this->helperName(), Zend_View будет искать // "/other/path/to/helpers/HelperName.php" с классом "My_View_Helper_HelperName", // затем "/path/to/some/helpers/HelperName" с классом "Your_View_Helper_HelperName", // и под конец "Zend/View/Helper/HelperName.php" с классом "Zend_View_Helper_HelperName". ?>
Написание собственных вспомогательных классов является довольно простым делом — просто следуйте этим правилам:
Имя класса должно быть Zend_View_Helper_*
,
где * является именем самого "помощника". Например, если
вы написали "помощника", называющегося "specialPurpose",
имя класса должно быть "Zend_View_Helper_SpecialPurpose"
(обратите внимание на использование главных букв).
Имя класса должно быть, как минимум, заканчиваться именем
"помощника", в котором имена начинаются с заглавной буквы. Т.е.
если вы написали "помощника" с именем "specialPurpose", то
минимальное имя класса должно быть "SpecialPurpose". Вы можете
(и должны) давать классам имена с префиксом, рекомендуется
использовать 'View_Helper' как часть этого префикса с или без
завершающего знака подчеркивания.
Класс должен иметь открытый метод, имя которого
соответствует имени "помощника". Это метод, который будет
вызываться, когда ваш шаблон вызывает
$this->specialPurpose()
. В нашем примере с помощником
"specialPurpose" объявление требуемого метода должно быть
public function specialPurpose()
.
Обычно класс не должен выполнять вывод, вместо этого он должен возвращать значение для вывода. Возвращаемое значение должно быть экранировано должным образом.
Класс должен быть в файле, названном по имени метода. Снова используя пример с помощником "specialPurpose", мы должны дать файлу имя "SpecialPurpose.php".
Размещайте вспомогательный класс где-либо в одном из находящихся в стеке путей
к "помощникам", и Zend_View
будет автоматически загружать,
инстанцировать, сохранять и выполнять его.
Вот пример кода нашего помощника "SpecialPurpose":
<?php class My_View_Helper_SpecialPurpose { protected $_count = 0; public function specialPurpose() { $this->_count++; $output = "I have seen 'The Jerk' {$this->_count} time(s)."; return htmlspecialchars($output); } } ?>
Далее в скрипте вида вы можете вызывать помощника SpecialPurpose столько раз, сколько вам нужно. Он будет инстанцирован один раз, и сохраняется в течение существования экземпляра Zend_View.
<?php // помните, что в скрипте вида $this ссылается на экземпляр Zend_View 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).