# Скрипты контроллеров

В контроллере вы создаете и конфигурируете экземпляр Zend_View. Затем вы устанавливаете переменные для этого экземпляра и приказываете ему сгенерировать выходные данные, используя указанный скрипт вида.

## Установка переменных

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

    $view = new Zend_View();
    $view->a = "Hay";
    $view->b = "Bee";
    $view->c = "Sea";

Однако это может показаться утомительным, если вы уже имеете набор значений для присвоения в массиве или объекте.

Метод `assign()` дает возможность устанавливать значения из массива или объекта "партиями". Следующий пример делает то же самое, что и предыдущий с последовательной установкой переменных.

    $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);

Вы также можете использовать этот метод для последовательной установки c передачей имени переменной и ее значения.

    $view = new Zend_View();
    $view->assign('a', "Hay");
    $view->assign('b', "Bee");
    $view->assign('c', "Sea");

## Выполнение скрипта вида

После того, как вы определили все необходимые переменные, контроллер должен дать Zend_View команду выполнить указанный скрипт вида. Делайте это посредством вызова метода `render()`. Обратите внимание, что этот метод будет возвращать результат рендеринга, но не выводить его, поэтому вам нужно самостоятельно вывести его посредством `echo` или `print`, в том месте, где это нужно.

    $view = new Zend_View();
    $view->a = "Hay";
    $view->b = "Bee";
    $view->c = "Sea";
    echo $view->render('someView.php');

## Пути к скриптам вида

По умолчанию Zend_View ищет скрипты вида относительно вызывающего скрипта. Например, если скрипт контроллера находится в директории "/path/to/app/controllers" и он вызывает скрипт вида следующим образом: `$view->render('someView.php')`, то Zend_View будет искать скрипт вида по пути "/path/to/app/controllers/someView.php".

Очевидно, что ваши скрипты вида могут находиться в любом другом месте. Чтобы указать Zend_View, где искать скрипты вида, используйте метод `setScriptPath()`.

    $view = new Zend_View();
    $view->setScriptPath('/path/to/app/views');

Теперь, когда вы вызываете `$view->render('someView.php')`, он будет искать файл "/path/to/app/views/someView.php".

Вы можете "складывать" в стек пути, используя метод `addScriptPath()`. Если вы добавили пути в стек, то Zend_View будет искать запрошенный скрипт вида по этим путям, начиная с пути, добавленного последним. Это дает возможность замещать скрипты видов, принятые по умолчанию, другими, это позволяет создавать специальные "темы" и "скины" для всех или только определенных видов.

    $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" в текущем каталоге.

Никогда не используйте пользовательский ввод при установке путей к скриптам вида

Zend_View использует пути к скриптам для поиска и рендеринга скриптов вида. Эти директории должны быть заранее известны и находиться под вашим контролем. Никогда не устанавливайте пути к скриптам вида на основе пользовательского ввода. Например, для атаки может использоваться следующий ввод:

    // $_GET['foo'] == '../../../etc'
    $view->addScriptPath($_GET['foo']);
    $view->render('passwd');

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