# Введение

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

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

По существу применение Zend_View состоит из двух шагов: 1. Ваш скрипт контроллера создает экземпляр Zend_View и объявляет переменные этого экземпляра. 2. Контроллер приказывает Zend_View воспроизвести данный вид, посредством этого производится контроль за скриптом вида, который генерирует выходные данные вида.

## Скрипт контроллера

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

    // использование модели для получения данных о заголовках и авторах книг
    $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');

## Скрипт вида

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

    <?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; ?>

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

## Опции

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

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

      base/path/
          helpers/
          filters/
          scripts/

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

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

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

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

- `strictVars` - если опция установлена, то Zend_View генерирует уведомления (notices) и предупреждения (warnings), когда производится обращение к неинициализированной переменной. Опция может быть установлена посредством вызова `strictVars(true)` или передачи опции `strictVars` конструктору.

## Короткие теги в скриптах вида

В нашей документации и примерах мы применяем короткие теги PHP: `<?` and `<?=`. Кроме того, мы обычно используем альтернативный синтаксис для управляющих структур. Их удобно использовать при написании скриптов вида, они делают конструкции более лаконичными и позволяют размещать операторы без лишних переходов на другую строку.

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

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

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

- Включить короткие теги в своем файле `.htaccess`:

      php_value "short_open_tag" "on"

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

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

      $view->setUseStreamWrapper(true);

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

Обертка потока для скриптов вида снижает производительность

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

## Вспомогательные аксессоры

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

- `getVars()` возвращает все установленные переменные.

- `clearVars()` удаляет все присвоенные переменные, полезен, если вы хотите повторно использовать объект вида, но хотите контролировать доступность переменных.

- `getScriptPath($script)` возвращает вычисленный путь к данному скрипту вида.

- `getScriptPaths()` возвращает все зарегистрированные пути к скриптам вида.

- `getHelperPath($helper)` возвращает вычисленный путь к классу помощника, имя которого передается в качестве параметра.

- `getHelperPaths()` возвращает все зарегистрированные пути к классам помощников.

- `getFilterPath($filter)` возвращает вычисленный путь к классу фильтра, имя которого передается в качестве параметра.

- `getFilterPaths()` возвращает все зарегистрированные пути к классам фильтров.