35.4. Вспомогательные классы вида

В скрипте вида часто бывает так, что необходимо выполнять определенный набор функций повторно; например, формирование даты, генерация элементов формы, отображение ссылок. Вы можете использовать вспомогательные классы для выполнения этих действий.

Чтобы применять вспомогательные классы ("помощников") в своем скрипте вида, вызывайте их, используя $this->имяПомощника(). Zend_View загрузит класс Zend_View_Helper_ИмяПомощника, создаст его объект, и вызовет его метод имяПомощника(). Этот объект находится постоянно внутри экземпляра Zend_View и повторно используется во всех вызовах $this->имяПомощника().

35.4.1. Начальные вспомогательные классы

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>
        

35.4.2. Пути к вспомогательным классам

Как и для скриптов вида, ваш контроллер может задать стек путей, в которых 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".
?>
        

35.4.3. Написание собственных вспомогательных классов

Написание собственных вспомогательных классов является довольно простым делом — просто следуйте этим правилам:

  • Имя класса должно быть 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).