| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350 |
- <?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><?</code> and <code><?=</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:
- -->
|