В скрипте вида часто бывает так, что необходимо выполнять определенный набор функций повторно; например, формирование даты, генерация элементов формы, отображение ссылок. Вы можете использовать вспомогательные классы для выполнения этих действий.
Чтобы применять вспомогательные классы ("помощников") в своем скрипте вида,
вызывайте их, используя $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).