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

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

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

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

Zend_View снабжен начальным набором вспомогательных классов, все они имеют отношение к генерации элеметов форм. Каждый из них автоматически выполняет соответствующую экранизацию выходных данных. Это:

  • formButton($name, $value, $attribs): Создает элемент <input type="button" />.

  • formCheckbox($name, $value, $attribs, $options): Создает элемент <input type="checkbox" /> (флажок опций). Параметр $options является массивом, в котором первым значением является "выбранное" (checked) значение, вторым -- "невыбранное" значение (по умолчанию это '1' and '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>
        

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

Как и для скриптов вида, ваш контроллер может задать стек путей, в которых Zend_View должен искать вспомогательные классы. По умолчанию Zend_View ищет вспомогательные классы в Zend/View/Helper/*. Вы можете приказать Zend_View искать в других местах, используя методы setHelperPath() и addHelperPath().

<?php
$view = new Zend_View();
$view->setHelperPath('/path/to/more/helpers');
?>
        

Вы можете "складывать" в стек пути, испоьзуя метод addHelperPath(). Если вы добавили пути в стек, то Zend_View будет искать запрошенный вспомогательный класс в этих путях, начиная с пути, добавленного последним. Это дает возможность добавлять (или даже замещать) к начальному набору свои собственные вспомогательные классы.

<?php
$view = new Zend_View();
$view->addHelperPath('/path/to/some/helpers');
$view->addHelperPath('/other/path/to/helpers');

// теперь, когда вы вызываете $this->helperName(), Zend_View будет искать
// сначала "/other/path/to/helpers/HelperName.php",
// затем "/path/to/some/helpers/HelperName", и под конец
// "Zend/View/Helpers/HelperName.php".
?>
        

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

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

  • Имя класса должно быть Zend_View_Helper_*, где * является именем самого "помощника". Например, если вы написали "помощника", называющегося "specialPurpose", имя класса должно быть "Zend_View_Helper_SpecialPurpose" (обратите внимание на использование главных букв).

  • Класс должен иметь открытый метод, имя которого соответствует имени "помощника". Это метод, который будет вызываться, когда ваш шаблон вызывает $this->specialPurpose(). В нашем примере c помощником "specialPurpose" объявление требуемого метода должно быть public function specialPurpose().

  • Обычно класс не должен выполнять вывод, вместо этого он должен возвращать значение для вывода. Возвращаемое значение должно быть экранизировано должным образом.

  • Класс должен быть в файле, названном по имени метода. Снова используя пример с помощником "specialPurpose", мы должны дать файлу имя "SpecialPurpose.php".

Размещайте вспомогательный класс где-либо в одном из находящихся в стеке путей к "помощникам", и Zend_View будет автоматически загружать, инстанцировать, сохранять и выполнять его.

Вот пример кода нашего помощника "SpecialPurpose":

<?php
class Zend_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).