<?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
<sect1 id="zend.view.helpers" xmlns:xi="http://www.w3.org/2001/XInclude">

    <title>Помощники видов</title>

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

    <para>
        Помощник представляет собой просто класс. Скажем, нам нужен помощник
        'fooBar'. По умолчанию имя класса помощника начинается с
        <code>'Zend_View_Helper_'</code> (вы можете указать другой префикс при
        установке путей к помощникам видов), последней частью имени класа
        является имя помощника. Все слова этой части должны писаться слитно,
        первые буквы слов - в верхнем регистре (TitleCapped); таким образом мы
        получаем имя класа <classname>Zend_View_Helper_FooBar</classname>. Класс должен
        содержать как минимум один метод, названный по имени помощника в формате
        camelCase: <code>fooBar()</code>.
    </para>

    <note>
        <title>Следите за регистром</title>
        <para>
            Имена помощников всегда должны быть в стиле camelCased, т.е. они
            никогда не начинаются с символа в верхнем регистре. Имя класса
            имеет стиль MixedCase (т.е. начинается с символа в верхнем регистре),
            но реально выполняемый метод должен быть в стиле camelCase.
        </para>
    </note>

    <note>
        <title>Используемый по умолчанию путь к помощникам</title>

        <para>
            Используемый по умолчанию путь к помощникам всегда указывает на
            помощники Zend Framework-а, т.е. 'Zend/View/Helper/'. Даже если вы
            вызываете <code>setHelperPath()</code> для перезаписи существующих
            путей, этот путь всегда будет использоваться для обеспечения работы
            помощников, входящих в поставку Zend Framework-а
        </para>
    </note>


    <para>
        Для того, чтобы использовать помощника в своем скрипте вида, вызывайте
        его, используя <code>$this->имяПомощника()</code>.
        В этом случае <classname>Zend_View</classname> загрузит класс
        <code>Zend_View_Helper_ИмяПомощника</code>, создаст его экземпляр и
        вызовет его метод <code>имяПомощника()</code>. Экземпляр объекта
        сохраняется в экземпляре <classname>Zend_View</classname> и будет повторно
        использоваться им во всех будущих вызовах
        <code>$this->имяПомощника()</code>.
    </para>

    <sect2 id="zend.view.helpers.initial">

        <title>Начальный набор помощников</title>

        <para>
            <classname>Zend_View</classname> поставляется с начальным набором помощников,
            большинство из которых связано с генерацией элементов форм и
            автоматически экранирует весь вывод. Кроме этого, есть помощники для
            создания HTML-списков, URL-ов на основе маршрутов, и объявления
            переменных. В настоящее время в поставляемый набор входят:
        </para>

        <itemizedlist>

            <listitem><para>
                <code>declareVars():</code> В основном предназначен для
                использования вместе с <code>strictVars()</code>. Этот
                помощник может использоваться для объявления переменных
                шаблонов, которые не обязательно присутствуют в объекте
                вида, и для установки значений по умолчанию.
                Массивы, переданные методу в качестве аргуметов, будут
                использованы для установки значений по умолчанию; иначе, если
                переменная не существует, то ее значением будет пустая строка.
            </para></listitem>

            <listitem><para>
                <code>fieldset($name, $content, $attribs):</code> Создает
                XHTML-элемент <code>fieldset</code> (набор полей). Если массив
                <code>$attribs</code> содержит в ключ 'legend', то это значение
                используется для элемента <code>legend</code>. Элемент
                <code>fieldset</code> будет содержать в себе значение
                параметра <code>$content</code>, переданного помощнику.
            </para></listitem>

            <listitem><para>
                <code>form($name, $attribs, $content):</code> Генерирует
                XHTML-элемент <code>form</code> (форма). Все элементы массива
                <code>$attribs</code> и добавляются как аттрибуты тега
                <code>form</code>. Если параметр <code>$content</code> передан и
                не имеет значение false, то это содержимое добавляется между
                открывающим и закрывающим тегами формы. Если же
                <code>$content</code> имеет булево значение false (значение по
                умолчанию), то будет сгенерирован только открывающий тег формы.
            </para></listitem>

            <listitem><para>
                <code>formButton($name, $value, $attribs)</code>: Создает элемент
                <code>&lt;button /&gt;</code>.
            </para></listitem>
            
            <listitem>
                <para>
                    <code>formCheckbox($name, $value, $attribs, $options)</code>:
                    Создает элемент <code>&lt;input type="checkbox" /&gt;</code>
                    (флажок опций).
                </para>

                <para>
                    По умолчанию, если не был передан параметры <code>$value</code>
                    и <code>$options</code>, то значение '1' соотвествует
                    выбранному состоянию, '0' - не выбранному. Если был передан
                    параметр <code>$value</code>, но
                    не передан <code>$options</code>, то значение
                    <code>$value</code> соотвествует выбранному состоянию.
                </para>

                <para>
                    <code>$options</code> должен быть массивом. Если это
                    индексный массив, то первое значение соответствует
                    выбранному состоянию, второе - не выбранному состоянию,
                    все остальные значения игнорируются. Вы можете также
                    передавать массив с ключами 'checked' и 'unChecked'.
                </para>

                <para>
                    Если параметр $options был передан, и <code>$value</code>
                    соответствует значению в выбранном состоянии, то элемент
                    будет помечен как выбранный. Вы можете также помечать
                    элемент как выбранный или не выбранный путем передачи
                    значения булевого типа для атрибута 'checked'.
                </para>

                <para>
                    Наверное, лучше всего проиллюстрировать это примерами:
                </para>

                <programlisting role="php"><![CDATA[
// '1' и '0' в качестве значений для выбранного/ не выбранного состояний
// флажок не выбран
echo $this->formCheckbox('foo');

// '1' и '0' в качестве значений для выбранного/ не выбранного состояний
// флажок выбран
echo $this->formCheckbox('foo', null, array('checked' => true));

// 'bar' и '0' в качестве значений для выбранного/ не выбранного состояний
// флажок не выбран
echo $this->formCheckbox('foo', 'bar');

// 'bar' и '0' в качестве значений для выбранного/ не выбранного состояний
// флажок выбран
echo $this->formCheckbox('foo', 'bar', array('checked' => true));

// 'bar' и 'baz' в качестве значений для выбранного/ не выбранного состояний
// флажок не выбран
echo $this->formCheckbox('foo', null, null, array('bar', 'baz');

// 'bar' и 'baz' в качестве значений для выбранного/ не выбранного состояний
// флажок не выбран
echo $this->formCheckbox('foo', null, null, array(
    'checked' => 'bar',
    'unChecked' => 'baz'
));

// 'bar' и 'baz' в качестве значений для выбранного/ не выбранного состояний
// флажок выбран
echo $this->formCheckbox('foo', 'bar', null, array('bar', 'baz');
echo $this->formCheckbox('foo',
                         null,
                         array('checked' => true),
                         array('bar', 'baz');

// 'bar' и 'baz' в качестве значений для выбранного/ не выбранного состояний
// флажок не выбран
echo $this->formCheckbox('foo', 'baz', null, array('bar', 'baz');
echo $this->formCheckbox('foo',
                         null,
                         array('checked' => false),
                         array('bar', 'baz');
]]></programlisting>

                <para>
                    Во всех случаях разметка предваряется скрытым элементом
                    <code>&lt;input type="hidden" /&gt;</code>
                    со значением для не выбранного состояния. Таким образом,
                    и в том случае, если флажок опций не был выбран, вы будете
                    получать корректное значение, возвращаемое вашей форме.
                </para>
            </listitem>

            <listitem>
                <para>
                    <code>formErrors($errors, $options):</code> Генерирует
                    ненумерованный список XHTML для вывода сообщений об ошибках.
                    <code>$errors</code> должен быть строкой или массивом строк.
                    <code>$options</code> должен заключать в себе все аттрибуты,
                    которые вы хотите поместить в открывающий тег списка.
                </para>

                <para>
                    Вы можете указать альтернативный открывающий, закрывающий и
                    разделяющий код путем вызова нескольких методов данного
                    помощника:
                </para>

                <itemizedlist>
                    <listitem><para>
                            <code>setElementStart($string)</code>; по умолчанию
                            используется
                            '&lt;ul class="errors"%s"&gt;&lt;li&gt;', где %s
                            заменяется аттрибутами, указанными в
                            <code>$options</code>.
                    </para></listitem>

                    <listitem><para>
                            <code>setElementSeparator($string)</code>; по
                            умолчанию используется '&lt;/li&gt;&lt;li&gt;'.
                    </para></listitem>

                    <listitem><para>
                            <code>setElementEnd($string)</code>; по умолчанию
                            используется '&lt;/li&gt;&lt;/ul&gt;'.
                    </para></listitem>
                </itemizedlist>
            </listitem>

            <listitem><para>
                <code>formFile($name, $attribs)</code>: Создает
                элемент <code>&lt;input type="file" /&gt;</code>.
            </para></listitem>

            <listitem><para>
                <code>formHidden($name, $value, $attribs)</code>: Создает
                элемент <code>&lt;input type="hidden" /&gt;</code>.
            </para></listitem>

            <listitem><para>
                <code>formLabel($name, $value, $attribs):</code> Создает элемент
                &lt;label&gt;, устанавливая значение аттрибута <code>for</code>
                равным значению <code>$name</code>, и содержимое элемента равным
                значению <code>$value</code>. Если в <code>$attribs</code> был
                передан <code>disable</code>, то ничего не будет возвращено.
            </para></listitem>

            <listitem><para>
                <code>formMultiCheckbox($name, $value, $attribs, $options,
                    $listsep):</code>
                Создает список флажков опций. <code>$options</code> должен
                быть ассоциативным массивом, который может быть произвольной
                глубины. <code>$value</code> может быть скалярным значением или
                массивом выбранных значений, которые соответствуют ключам в
                массиве <code>$options</code>. <code>$listsep</code> по
                умолчанию является переносом строки в HTML ("&lt;br /&gt;"). По
                умолчанию этот элемент интерпретируется как массив - все флажки
                опций имеют одно и то же имя и передаются как массив.
            </para></listitem>

            <listitem><para>
                <code>formPassword($name, $value, $attribs)</code>: Создает
                элемент <code>&lt;input type="password" /&gt;</code>.
            </para></listitem>

            <listitem><para>
                <code>formRadio($name, $value, $attribs, $options)</code>: Создает
                последовательность элементов <code>&lt;input type="radio" /&gt;</code>
                (переключатель опций). В массиве <code>$options</code> ключ
                является значением переключателя, значение является содержимым
                элемента <code>label</code> к переключателю. Переключатель опций
                со значением <code>$value</code> будет предварительно выбранным.
            </para></listitem>

            <listitem><para>
                <code>formReset($name, $value, $attribs)</code>: Создает
                элемент <code>&lt;input type="reset" /&gt;</code>.
            </para></listitem>

            <listitem><para>
                <code>formSelect($name, $value, $attribs, $options)</code>:
                Создает блок <code>&lt;select&gt;...&lt;/select&gt;</code>,
                с опциями <code>&lt;option&gt;</code>, соотвествующими
                элементам массива <code>$options</code>. В массиве
                <code>$options</code> ключ является значением опции,
                значение - текстом опции. Опция со значением
                <code>$value</code> будет предварительно выбранной.
            </para></listitem>

            <listitem><para>
                <code>formSubmit($name, $value, $attribs)</code>: Создает
                элемент <code>&lt;input type="submit" /&gt;</code>.
            </para></listitem>

            <listitem><para>
                <code>formText($name, $value, $attribs)</code>: Создает
                элемент <code>&lt;input type="text" /&gt;</code>.
            </para></listitem>

            <listitem><para>
                <code>formTextarea($name, $value, $attribs)</code>: Создает
                блок <code>&lt;textarea&gt;...&lt;/textarea&gt;</code>.
            </para></listitem>

            <listitem><para>
                <code>url($urlOptions, $name, $reset):</code> Создает строку
                URL, основываясь на машруте с именем <code>$name</code>.
                <code>$urlOptions</code> должен быть ассоциативным массивом пар
                ключ-значение для использования в данном маршруте.
            </para></listitem>

            <listitem><para>
                <code>htmlList($items, $ordered, $attribs, $escape):</code>
                Генерирует маркированный или нумерованный список на основе
                <code>$items</code>. Если <code>$items</code> является
                многомерным массивом, то будут построены вложенные списки. Если
                <code>$escape</code> установлен в true (значение по умолчанию),
                то все пункты будут экранированы с использованием механизма,
                зарегистрированного в объекте вида. Передавайте значение false,
                если хотите использовать разметку в своих списках. Если
                <code>$ordered</code> установлен в false (значение по
                умолчанию), то генерируется маркированный список, иначе -
                нумерованный.
            </para></listitem>

        </itemizedlist>

        <para>
            Использовать их в скрипте вида очень просто, вот пример.
            Обратите внимание, все, что вам нужно - это вызывать их,
            помощники будут загружаться и инстанцироваться автоматически, по
            мере необходимости.
        </para>

        <programlisting role="php"><![CDATA[
// в скрипте вида $this ссылается на экземпляр Zend_View
//
// предположим, вы уже имеете последовательность опций $countries
// в виде массива ('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>
]]></programlisting>

        <para>
            Результирующие выходные данные этого скрипта вида будут выглядеть
            примерно следующим образом:
        </para>

        <programlisting role="php"><![CDATA[
<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>
]]></programlisting>

        <xi:include href="Zend_View-Helpers-Action.xml">
            <xi:fallback><xi:include href="../../en/module_specs/Zend_View-Helpers-Action.xml" /></xi:fallback>
        </xi:include>
        <xi:include href="Zend_View-Helpers-Cycle.xml">
            <xi:fallback><xi:include href="../../en/module_specs/Zend_View-Helpers-Cycle.xml" /></xi:fallback>
        </xi:include>
        <xi:include href="Zend_View-Helpers-Partial.xml">
            <xi:fallback><xi:include href="../../en/module_specs/Zend_View-Helpers-Partial.xml" /></xi:fallback>
        </xi:include>
        <xi:include href="Zend_View-Helpers-Placeholder.xml">
            <xi:fallback><xi:include href="../../en/module_specs/Zend_View-Helpers-Placeholder.xml" /></xi:fallback>
        </xi:include>
        <xi:include href="Zend_View-Helpers-Doctype.xml">
            <xi:fallback><xi:include href="../../en/module_specs/Zend_View-Helpers-Doctype.xml" /></xi:fallback>
        </xi:include>
        <xi:include href="Zend_View-Helpers-HeadLink.xml">
            <xi:fallback><xi:include href="../../en/module_specs/Zend_View-Helpers-HeadLink.xml" /></xi:fallback>
        </xi:include>
        <xi:include href="Zend_View-Helpers-HeadMeta.xml">
            <xi:fallback><xi:include href="../../en/module_specs/Zend_View-Helpers-HeadMeta.xml" /></xi:fallback>
        </xi:include>
        <xi:include href="Zend_View-Helpers-HeadScript.xml">
            <xi:fallback><xi:include href="../../en/module_specs/Zend_View-Helpers-HeadScript.xml" /></xi:fallback>
        </xi:include>
        <xi:include href="Zend_View-Helpers-HeadStyle.xml">
            <xi:fallback><xi:include href="../../en/module_specs/Zend_View-Helpers-HeadStyle.xml" /></xi:fallback>
        </xi:include>
        <xi:include href="Zend_View-Helpers-HeadTitle.xml">
            <xi:fallback><xi:include href="../../en/module_specs/Zend_View-Helpers-HeadTitle.xml" /></xi:fallback>
        </xi:include>
        <xi:include href="Zend_View-Helpers-HtmlObject.xml">
            <xi:fallback><xi:include href="../../en/module_specs/Zend_View-Helpers-HtmlObject.xml" /></xi:fallback>
        </xi:include>
        <xi:include href="Zend_View-Helpers-InlineScript.xml">
            <xi:fallback><xi:include href="../../en/module_specs/Zend_View-Helpers-InlineScript.xml" /></xi:fallback>
        </xi:include>
        <xi:include href="Zend_View-Helpers-Json.xml">
            <xi:fallback><xi:include href="../../en/module_specs/Zend_View-Helpers-Json.xml" /></xi:fallback>
        </xi:include>
        <xi:include href="Zend_View-Helpers-Navigation.xml">
            <xi:fallback><xi:include href="../../en/module_specs/Zend_View-Helpers-Navigation.xml" /></xi:fallback>
        </xi:include>
        <xi:include href="Zend_View-Helpers-Translate.xml">
            <xi:fallback><xi:include href="../../en/module_specs/Zend_View-Helpers-Translate.xml" /></xi:fallback>
        </xi:include>
    </sect2>

    <sect2 id="zend.view.helpers.paths">

        <title>Пути к классам помощников</title>

        <para>
            Как и для скриптов вида, ваш контроллер может задать
            стек путей, в которых <classname>Zend_View</classname> должен искать
            классы помощников. По умолчанию <classname>Zend_View</classname>
            ищет классы помощников в <code>Zend/View/Helper/*</code>. Используя
            методы <code>setHelperPath()</code> и <code>addHelperPath()</code>,
            вы можете укзать <classname>Zend_View</classname>, чтобы он искал классы
            помощников в других местах. Кроме этого, вы можете указать префикс
            класса, используемый для помощников, находящихся в данном пути;
            префикс обеспечивает пространство имен. Если префикс не указан, то
            по умолчанию используется 'Zend_View_Helper_'.
        </para>

        <programlisting role="php"><![CDATA[
$view = new Zend_View();

// Устанавливает путь /path/to/more/helpers с префиксом 'My_View_Helper'
$view->setHelperPath('/path/to/more/helpers', 'My_View_Helper');
]]></programlisting>

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

        <programlisting role="php"><![CDATA[
$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 будет искать
// "/path/to/some/helpers/HelperName" с классом
// "Your_View_Helper_HelperName", затем "/other/path/to/helpers/HelperName.php"
// с классом "My_View_Helper_HelperName", и под конец
// "Zend/View/Helper/HelperName.php" с классом "Zend_View_Helper_HelperName".
]]></programlisting>

    </sect2>

    <sect2 id="zend.view.helpers.custom">

        <title>Написание собственных помощников</title>

        <para>
            Написать собственного помощника довольно легко, просто следуйте
            этим правилам:
        </para>

        <itemizedlist>

            <listitem><para>
                Хотя это и не является совершенно необходимым, мы рекомендуем
                при создании своего помощника реализовывать интерфейс
                <classname>Zend_View_Helper_Interface</classname>
                или наследовать от класса <classname>Zend_View_Helper_Abstract</classname>.
                Добавленные в версии 1.6.0, они определяют только метод
                <code>setView()</code>, но в будущих релизах
                мы планируем реализовать паттерн "стратегия", который
                значительно упростит следование правилам по именованию,
                изложенным ниже. Следование этой рекомендации сейчас
                поможет в будущем избежать изменений в вашем коде.
            </para></listitem>

            <listitem><para>
                Имя класса должно, как минимум, заканчиваться именем
                помощника в стиле MixedCaps (СмешанныйРегистр). Т.е. если вы
                пишете помощника с именем "specialPurpose", то наиболее короткое
                имя класса должно быть "SpecialPurpose". Вы можете
                (и должны) давать классам имена с префиксом, рекомендуется
                использовать 'View_Helper' как часть этого префикса:
                "My_View_Helper_SpecialPurpose". Вам нужно будет передать этот
                префикс с или без завершающего знака подчеркивания методу
                <code>addHelperPath()</code> или <code>setHelperPath()</code>.
            </para></listitem>

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

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

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

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

        <para>
            Вот пример кода нашего помощника <code>SpecialPurpose</code>:
        </para>

        <programlisting role="php"><![CDATA[
class My_View_Helper_SpecialPurpose extends Zend_View_Helper_Abstract
{
    protected $_count = 0;
    public function specialPurpose()
    {
        $this->_count++;
        $output = "I have seen 'The Jerk' {$this->_count} time(s).";
        return htmlspecialchars($output);
    }
}
]]></programlisting>

        <para>
            Далее в скрипте вида вы можете вызывать помощника
            <code>SpecialPurpose</code> сколько угодно раз. Он будет
            инстанцирован один раз, и существует, пока существует
            экземпляр <classname>Zend_View</classname>.
        </para>

        <programlisting role="php"><![CDATA[
// помните, что в скрипте вида $this ссылается на экземпляр Zend_View
echo $this->specialPurpose();
echo $this->specialPurpose();
echo $this->specialPurpose();
]]></programlisting>

        <para>
            Результат должен быть примерно следующим:
        </para>
        <programlisting role="php"><![CDATA[
I have seen 'The Jerk' 1 time(s).
I have seen 'The Jerk' 2 time(s).
I have seen 'The Jerk' 3 time(s).
]]></programlisting>

        <para>
            Иногда бывает, что нужен доступ к объекту <classname>Zend_View</classname> -
            например, нужно получить зарегистрированное значение кодировки
            или произвести рендеринг другого скрипта вида как часть
            действий, выполняемых вашим помощником. Для того, чтобы можно было
            получить доступ к объекту вида, ваш класс помощника должен иметь
            метод <code>setView($view)</code>, его пример показан ниже:
        </para>

        <programlisting role="php"><![CDATA[
class My_View_Helper_ScriptPath
{
    public $view;

    public function setView(Zend_View_Interface $view)
    {
        $this->view = $view;
    }

    public function scriptPath($script)
    {
        return $this->view->getScriptPath($script);
    }
}
]]></programlisting>

        <para>
            Если ваш класс помощника имеет метод <code>setView()</code>, то он
            будет вызываться при первом инстанцировании класса помощника и его
            передаче текущему объекту вида. Реализация
            сохранения объекта вида и доступа к нему в вашем классе помощника
            остаются на ваше усмотрение.
        </para>
        
        <para>
            Если вы наследуете своего помощника от
            <classname>Zend_View_Helper_Abstract</classname>, то вам не нужно определять
            этот метод, поскольку он уже определен в родительском классе.
        </para>

    </sect2>

</sect1>
<!--
vim:se ts=4 sw=4 et:
-->
