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