<?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
<sect1 id="zend.view.introduction">

    <title>Введение</title>

    <para>
        <classname>Zend_View</classname> является классом для работы с частью вид (view)
        паттерна модель-вид-контроллер (model-view-controller). То есть он
        предназначен для того, чтобы помочь отделить скрипты видов от
        скриптов моделей и контроллеров. Он предоставляет систему помощников,
        фильтрации вывода и экранирования переменных.
    </para>

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

    <para>
        По существу применение <classname>Zend_View</classname> состоит из двух шагов:

        1.  Ваш скрипт контроллера создает экземпляр <classname>Zend_View</classname> и
        объявляет переменные этого экземпляра.

        2. Контроллер приказывает <classname>Zend_View</classname> воспроизвести
        данный вид, посредством этого производится контроль за скриптом
        вида, который генерирует выходные данные вида.
    </para>

    <sect2 id="zend.view.introduction.controller">

        <title>Скрипт контроллера</title>

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

        <programlisting language="php"><![CDATA[
// использование модели для получения данных о заголовках и авторах книг
$data = array(
    array(
        'author' => 'Hernando de Soto',
        'title' => 'The Mystery of Capitalism'
    ),
    array(
        'author' => 'Henry Hazlitt',
        'title' => 'Economics in One Lesson'
    ),
    array(
        'author' => 'Milton Friedman',
        'title' => 'Free to Choose'
    )
);

// теперь присваиваем данные по книгам экземпляру Zend_View
Zend_Loader::loadClass('Zend_View');
$view = new Zend_View();
$view->books = $data;

// и выполняем скрипт вида "booklist.php"
echo $view->render('booklist.php');
]]></programlisting>

    </sect2>

    <sect2 id="zend.view.introduction.view">

        <title>Скрипт вида</title>

        <para>
            Теперь нам нужен сопутствующий скрипт вида "booklist.php".
            Это такой же скрипт PHP, как и остальные, за одним исключением:
            он выполняется в области видимости экземпляра <classname>Zend_View</classname>,
            это означает, что <varname>$this</varname> ссылается на
            экземпляр <classname>Zend_View</classname>. Переменные, присваиваемые в
            контроллере для скрипта вида, являются открытыми свойствами
            экземпляра <classname>Zend_View</classname>. Таким образом, базовый скрипт
            вида может выглядеть следующим образом:
        </para>

        <programlisting language="php"><![CDATA[
<?php if ($this->books): ?>

    <!-- Таблица из нескольких книг. -->
    <table>
        <tr>
            <th>Author</th>
            <th>Title</th>
        </tr>

        <?php foreach ($this->books as $key => $val): ?>
        <tr>
            <td><?php echo $this->escape($val['author']) ?></td>
            <td><?php echo $this->escape($val['title']) ?></td>
        </tr>
        <?php endforeach; ?>

    </table>

<?php else: ?>

    <p>Нет книг для отображения.</p>

<?php endif; ?>
]]></programlisting>

        <para>
            Обратите внимание, что мы используем метод <code>escape()</code>
            для экранирования переменных.
        </para>

    </sect2>

    <sect2 id="zend.view.introduction.options">
        <title>Опции</title>

        <para>
            <classname>Zend_View</classname> имеет несколько опций, которые могут
            использоваться для управления поведением ваших скриптов вида:
        </para>

        <itemizedlist>
            <listitem>
                <para>
                    <code>basePath</code> - базовый путь, начиная от которого
                    устанавливаются пути скриптов, помощников и фильтров.
                    Предполагается, что используется следующая структура
                    директорий:
                </para>

                <programlisting language="php"><![CDATA[
base/path/
    helpers/
    filters/
    scripts/
]]></programlisting>

                <para>
                    Эта опция может быть установлена через методы
                    <code>setBasePath()</code>, <code>addBasePath()</code> или
                    опцию <code>basePath</code> для конструктора.
                </para>
            </listitem>

            <listitem><para>
                <code>encoding</code> - кодировка, которую следует использовать
                при вызове функций <code>htmlentities()</code>,
                <code>htmlspecialchars()</code> и др. По умолчанию используется
                ISO-8859-1 (latin1). Может быть установлена через метод
                <code>setEncoding()</code> или опцию <code>encoding</code> для
                конструктора.
            </para></listitem>

            <listitem><para>
                <code>escape</code> - обратный вызов, который следует
                использовать для метода <code>escape()</code>. Может быть
                установлен через метод <code>setEscape()</code> или опцию
                <code>escape</code> для конструктора.
            </para></listitem>

            <listitem><para>
                <code>filter</code> - фильтр, который следует использовать после
                рендеринга скрипта вида. Может быть установлен через методы
                <code>setFilter()</code>, <code>addFilter()</code>, или опцию
                <code>filter</code> для конструктора.
            </para></listitem>

            <listitem><para>
                <code>strictVars</code> - если опция установлена, то
                <classname>Zend_View</classname> генерирует уведомления (notices) и
                предупреждения (warnings), когда производится обращение к
                неинициализированной переменной. Опция может быть
                установлена посредством вызова <code>strictVars(true)</code> или
                передачи опции <code>strictVars</code> конструктору.
            </para></listitem>
        </itemizedlist>
    </sect2>

    <sect2 id="zend.view.introduction.shortTags">
        <title>Короткие теги в скриптах вида</title>

        <para>
            В нашей документации и примерах мы применяем короткие теги PHP:
            <code>&lt;?</code> and <code>&lt;?=</code>. Кроме того, мы обычно
            используем <ulink
                url="http://us.php.net/manual/en/control-structures.alternative-syntax.php">альтернативный
                синтаксис для управляющих структур</ulink>. Их удобно
            использовать при написании скриптов вида, они делают конструкции
            более лаконичными и позволяют размещать операторы без лишних
            переходов на другую строку.
        </para>

        <para>
            Несмотря на это, многие разработчики
            предпочитают использовать длинную форму записи для обеспечения
            валидности или переносимости кода. Например, в рекомендуемой
            конфигурации PHP
            (файл php.ini.recommended) опция <code>short_open_tag</code>
            отключена. Также, если вы используете XML в своих скриптах
            вида, то с короткими открывающими тегами PHP они не будут проходить
            валидацию.
        </para>

        <para>
            Кроме того, если вы используете короткие теги, и опция
            <code>short_open_tag</code> отключена, то скрипты вида будут либо
            приводить к ошибкам выполнения, либо просто выводить пользователю
            код, включенный в эти теги.
        </para>

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

        <itemizedlist>
            <listitem>
                <para>
                    Включить короткие теги в своем файле <code>.htaccess</code>:
                </para>

                <programlisting language="apache"><![CDATA[
php_value "short_open_tag" "on"
]]></programlisting>

                <para>
                    Это будет действовать только в том случае, если у вас есть
                    права на создание и использование файлов <code>.htaccess</code>.
                    Эта директива также может быть добавлена в
                    конфигурационный файл <code>httpd.conf</code>.
                </para>
            </listitem>

            <listitem>
                <para>
                    Включить обертку потока (stream wrapper), которая будет
                    на лету преобразовывать короткие теги в полные:
                </para>

        <programlisting language="php"><![CDATA[
$view->setUseStreamWrapper(true);
]]></programlisting>

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

        <note>
            <title>Обертка потока для скриптов вида снижает производительность</title>

            <para>
                Использование обертки потока <emphasis>снижает</emphasis>
                производительность вашего приложения.
                Мы рекомендуем включать короткие
                теги, переписывать свои скрипты вида с тем, чтобы
                использовалась полная форма записи тегов, либо использовать
                продуманную стратегию частичного или полного кэширования
                содержимого страниц.
            </para>
        </note>
    </sect2>

    <sect2 id="zend.view.introduction.accessors">
        <title>Вспомогательные аксессоры</title>

        <para>
            Скорее всего, вам никогда не понадобится вызывать
            <code>assign()</code>, <code>render()</code> и другие
            перечисленные ниже методы
            для установки/добавления фильтров, помощников, путей к скриптам
            вида. Тем не менее, если требуется расширить класс
            <classname>Zend_View</classname> или нужен доступ к его внутреннему коду,
            то можно использовать следующие аксессоры:
        </para>

        <itemizedlist>
            <listitem>
                <para>
                    <code>getVars()</code> возвращает все установленные
                    переменные.
                </para>
            </listitem>

            <listitem>
                <para>
                    <code>clearVars()</code> удаляет все присвоенные переменные,
                    полезен, если вы хотите повторно использовать объект вида,
                    но хотите контролировать доступность переменных.
                </para>
            </listitem>

            <listitem>
                <para>
                    <code>getScriptPath($script)</code> возвращает вычисленный
                    путь к данному скрипту вида.
                </para>
            </listitem>

            <listitem>
                <para>
                    <code>getScriptPaths()</code> возвращает все
                    зарегистрированные пути к скриптам вида.
                </para>
            </listitem>

            <listitem>
                <para>
                    <code>getHelperPath($helper)</code> возвращает вычисленный
                    путь к классу помощника, имя которого передается в
                    качестве параметра.
                </para>
            </listitem>

            <listitem>
                <para>
                    <code>getHelperPaths()</code> возвращает все
                    зарегистрированные пути к классам помощников.
                </para>
            </listitem>

            <listitem>
                <para>
                    <code>getFilterPath($filter)</code> возвращает вычисленный
                    путь к классу фильтра, имя которого передается в
                    качестве параметра.
                </para>
            </listitem>

            <listitem>
                <para>
                    <code>getFilterPaths()</code> возвращает все
                    зарегистрированные пути к классам фильтров.
                </para>
            </listitem>
        </itemizedlist>
    </sect2>
</sect1>
<!--
vim:se ts=4 sw=4 et:
-->
