28.4. Вспомогательные классы вида
Пред. | Глава 28. Zend_View | След.

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

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

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

### 28.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>

### 28.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".
    ?>

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

Пред. | Уровень выше | След.
28.3. Скрипты вида | Начало | Глава 29. Zend_XmlRpc