| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- Reviewed: no -->
- <sect1 id="zend.view.controllers">
- <title>Скрипты контроллеров</title>
- <para>
- В контроллере вы создаете и конфигурируете экземпляр
- <classname>Zend_View</classname>. Затем вы устанавливаете переменные для этого
- экземпляра и приказываете ему сгенерировать выходные данные, используя
- указанный скрипт вида.
- </para>
- <sect2 id="zend.view.controllers.assign">
- <title>Установка переменных</title>
- <para>
- Ваш скрипт контроллера должен установить
- необходимые переменные до того, как будет передано
- управление скрипту вида. Обычно вы можете устанавливать переменные
- по одной через объявление свойств экземпляра вида.
- </para>
- <programlisting language="php"><![CDATA[
- $view = new Zend_View();
- $view->a = "Hay";
- $view->b = "Bee";
- $view->c = "Sea";
- ]]></programlisting>
- <para>
- Однако это может показаться утомительным, если вы уже имеете
- набор значений для присвоения в массиве или объекте.
- </para>
- <para>
- Метод <code>assign()</code> дает возможность устанавливать значения
- из массива или объекта "партиями". Следующий пример делает
- то же самое, что и предыдущий с последовательной установкой
- переменных.
- </para>
- <programlisting language="php"><![CDATA[
- $view = new Zend_View();
- // определение массива из пар ключ-значение, где
- // ключ является именем переменной,
- // а значение - значением устанавливаемой переменной
- $array = array(
- 'a' => "Hay",
- 'b' => "Bee",
- 'c' => "Sea",
- );
- $view->assign($array);
- // делаем то же самое с открытыми свойствами объекта;
- // обратите внимание, что при установке мы приводим объект к массиву
- $obj = new StdClass;
- $obj->a = "Hay";
- $obj->b = "Bee";
- $obj->c = "Sea";
- $view->assign((array) $obj);
- ]]></programlisting>
- <para>
- Вы также можете использовать этот метод для
- последовательной установки c передачей имени переменной
- и ее значения.
- </para>
- <programlisting language="php"><![CDATA[
- $view = new Zend_View();
- $view->assign('a', "Hay");
- $view->assign('b', "Bee");
- $view->assign('c', "Sea");
- ]]></programlisting>
- </sect2>
- <sect2 id="zend.view.controllers.render">
- <title>Выполнение скрипта вида</title>
- <para>
- После того, как вы определили все необходимые переменные, контроллер
- должен дать <classname>Zend_View</classname> команду выполнить указанный
- скрипт вида. Делайте это посредством вызова метода
- <code>render()</code>. Обратите внимание, что этот метод будет
- возвращать результат рендеринга, но не выводить его,
- поэтому вам нужно самостоятельно вывести его посредством
- <code>echo</code> или <code>print</code>, в том месте,
- где это нужно.
- </para>
- <programlisting language="php"><![CDATA[
- $view = new Zend_View();
- $view->a = "Hay";
- $view->b = "Bee";
- $view->c = "Sea";
- echo $view->render('someView.php');
- ]]></programlisting>
- </sect2>
- <sect2 id="zend.view.controllers.script-paths">
- <title>Пути к скриптам вида</title>
- <para>
- По умолчанию <classname>Zend_View</classname> ищет скрипты
- вида относительно вызывающего скрипта.
- Например, если скрипт контроллера находится в директории
- "/path/to/app/controllers" и он вызывает скрипт вида
- следующим образом: <varname>$view->render('someView.php')</varname>, то
- <classname>Zend_View</classname> будет искать скрипт вида по пути
- "/path/to/app/controllers/someView.php".
- </para>
- <para>
- Очевидно, что ваши скрипты вида могут находиться в любом другом
- месте. Чтобы указать <classname>Zend_View</classname>, где искать скрипты вида,
- используйте метод <code>setScriptPath()</code>.
- </para>
- <programlisting language="php"><![CDATA[
- $view = new Zend_View();
- $view->setScriptPath('/path/to/app/views');
- ]]></programlisting>
- <para>
- Теперь, когда вы вызываете <varname>$view->render('someView.php')</varname>,
- он будет искать файл "/path/to/app/views/someView.php".
- </para>
- <para>
- Вы можете "складывать" в стек пути,
- используя метод <code>addScriptPath()</code>. Если вы добавили
- пути в стек, то <classname>Zend_View</classname> будет искать запрошенный
- скрипт вида по этим путям, начиная с пути, добавленного последним.
- Это дает возможность замещать скрипты видов, принятые по умолчанию,
- другими, это позволяет создавать специальные "темы" и "скины"
- для всех или только определенных видов.
- </para>
- <programlisting language="php"><![CDATA[
- $view = new Zend_View();
- $view->addScriptPath('/path/to/app/views');
- $view->addScriptPath('/path/to/custom/');
- // теперь, когда вы вызываете $view->render('booklist.php'), Zend_View
- // будет искать "/path/to/custom/booklist.php",
- // затем "/path/to/app/views/booklist.php",
- // и, наконец, "booklist.php" в текущем каталоге.
- ]]></programlisting>
- <note>
- <title>Никогда не используйте пользовательский ввод при установке
- путей к скриптам вида</title>
- <para>
- <classname>Zend_View</classname> использует пути к скриптам для поиска
- и рендеринга скриптов вида. Эти директории должны быть заранее
- известны и находиться под вашим контролем.
- <emphasis>Никогда</emphasis> не устанавливайте пути к скриптам
- вида на основе пользовательского ввода.
- Например, для атаки может использоваться следующий ввод:
- </para>
- <programlisting language="php"><![CDATA[
- // $_GET['foo'] == '../../../etc'
- $view->addScriptPath($_GET['foo']);
- $view->render('passwd');
- ]]></programlisting>
- <para>
- Хотя этот пример надуманный, он ясно демонстрирует
- потенциальную уязвимость. Если вы <emphasis>не можете</emphasis>
- обойтись без использования пользовательского ввода при установке
- пути к скриптам вида, то должным образом фильтруйте ввод и
- удостоверяйтесь, что полученный путь находится под контролем
- вашего приложения.
- </para>
- </note>
- </sect2>
- </sect1>
- <!--
- vim:se ts=4 sw=4 et:
- -->
|