<?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
<sect3 id="zend.controller.actionhelpers.redirector">
    <title>Redirector</title>

    <sect4 id="zend.controller.actionhelper.redirector.introduction">
        <title>Введение</title>

        <para>
            Помощник <code>Redirector</code> позволяет использовать объект
            Redirector для удовлетворения нужд в перенаправлении на
            новые URL. Он имеет многие преимущества по сравнению с методом
            <code>_redirect()</code>, такие, как возможность предварительной
            конфигурации поведения на стороне сайта в объекте Redirector или
            использование встроенного интерфейса
            <code>gotoSimple($action, $controller, $module, $params)</code>, подобного
            интерфейсу <code>Zend_Controller_Action::_forward()</code>.
        </para>

        <para>
            <code>Redirector</code> имеет набор методов, которые могут
            использоваться для управления поведением при перенаправлении:
        </para>

        <itemizedlist>
            <listitem>
                <para>
                    <code>setCode()</code> может использоваться для установки
                    кода ответа HTTP, используемого при перенаправлении.
                </para>
            </listitem>

            <listitem>
                <para>
                    <code>setExit()</code> может использоваться для установки
                    принудительного вызова <code>exit()</code> после
                    перенаправления. По умолчанию он установлен в true.
                </para>
            </listitem>

            <listitem>
                <para>
                    <code>setGotoSimple()</code> может использоваться для
                    установки URL, используемого по умолчанию, если методу
                    <code>gotoSimple()</code> не был передан URL. Использует
                    интерфейс
                    <code>Zend_Controller_Action::_forward()</code>:
                    setGotoSimple($action, $controller = null, $module = null, array
                    $params = array());
                </para>
            </listitem>

            <listitem>
                <para>
                    <code>setGotoRoute()</code> может использоваться для
                    установки URL, основываясь на зарегистрированном маршруте.
                    Ему должен передаваться массив пар ключ/значение и имя
                    маршрута, из них будет собран URL в соответствии с типом и
                    определением маршрута.
                </para>
            </listitem>

            <listitem>
                <para>
                    <code>setGotoUrl()</code> может использоваться для установки
                    URL, используемого по умолчанию, если методу
                    <code>gotoUrl()</code> не был передан URL. Принимает единственную строку URL в качестве аргумента.
                </para>
            </listitem>

            <listitem>
                <para>
                    <code>setPrependBase()</code> может использоваться для
                    добавления базового URL объекта запроса в начало URL,
                    заданного через методы <code>setGotoUrl()</code>,
                    <code>gotoUrl()</code>, или
                    <code>gotoUrlAndExit()</code>.
                </para>
            </listitem>

            <listitem>
                <para>
                    <code>setUseAbsoluteUri()</code> может использоваться для
                    принуждения <code>Redirector</code>-а применять
                    абсолютные URI при произведении перенаправления. Когда эта
                    опция установлена, то используются значения
                    <varname>$_SERVER['HTTP_HOST']</varname>,
                    <varname>$_SERVER['SERVER_PORT']</varname> и
                    <varname>$_SERVER['HTTPS']</varname> для формирования полного URI
                    из URL, определенного одним из методов перенаправления. Эта
                    опция по умолчанию отключена, но может быть включена по
                    умолчанию в последующих релизах.
                </para>
            </listitem>
        </itemizedlist>

        <para>
            Кроме этого, в Redirector есть различные методы, выполняющие текущие
            перенаправления:
        </para>

        <itemizedlist>
            <listitem>
                <para>
                    <code>gotoSimple()</code> использует
                    <code>setGotoSimple()</code> (интерфейс, подобный
                    <code>_forward()</code>) для построения
                    URL и перенаправления на него.
                </para>
            </listitem>

            <listitem>
                <para>
                    <code>gotoRoute()</code> использует
                    <code>setGotoRoute()</code> (сборка маршрута) для построения
                    URL и перенаправления на него.
                </para>
            </listitem>

            <listitem>
                <para>
                    <code>gotoUrl()</code> использует <code>setGotoUrl()</code>
                    (строка URL) для построения URL и перенаправления на него.
                </para>
            </listitem>
        </itemizedlist>

        <para>
            Наконец, можно в любое время получить текущий URL для
            перенаправления, используя <code>getRedirectUrl()</code>.
        </para>
    </sect4>

    <sect4 id="zend.controller.actionhelper.redirector.basicusage">
        <title>Базовые примеры использования</title>

        <example id="zend.controller.actionhelper.redirector.basicusage.example-1">
            <title>Опции настройки</title>

            <para>
                В этом примере переопределяются несколько опций, включая
                код статуса HTTP, используемого при перенаправлении
                (303), и определение URL, используемое по умолчанию при
                перенаправлении.
            </para>

            <programlisting language="php"><![CDATA[
class SomeController extends Zend_Controller_Action
{
    /**
     * Редиректор - определен для полноты кода
     *
     * @var Zend_Controller_Action_Helper_Redirector
     */
    protected $_redirector = null;

    public function init()
    {
        $this->_redirector = $this->_helper->getHelper('Redirector');

        // Установка опций по умолчанию для редиректора
        // Поскольку объект зарегистрирован в брокере помощников,
        // то эти опции будут действительными для всех
        // последующих действий
        $this->_redirector->setCode(303)
                          ->setExit(false)
                          ->setGotoSimple("this-action",
                                          "some-controller");
    }

    public function myAction()
    {
        /* делаем что-то */

        // Перенаправление на ранее зарегистрированный URL и
        // принудительное завершение исполнения скрипта:
        $this->_redirector->redirectAndExit();
        return; // никогда не будет достигнуто
    }
}
]]></programlisting>
        </example>

        <example id="zend.controller.actionhelper.redirector.basicusage.example-2">
            <title>Использование по умолчанию</title>

            <para>
                Этот пример предполагает, что используются значения по
                умолчанию, это означает, что после любых перенаправлений будет
                производиться выход <code>exit()</code>.
            </para>

            <programlisting language="php"><![CDATA[
// АЛЬТЕРНАТИВНЫЙ ПРИМЕР
class AlternativeController extends Zend_Controller_Action
{
    /**
     * Редиректор - определен для полноты кода
     *
     * @var Zend_Controller_Action_Helper_Redirector
     */
    protected $_redirector = null;

    public function init()
    {
        $this->_redirector = $this->_helper->getHelper('Redirector');
    }

    public function myAction()
    {
        /* делаем что-то */

        $this->_redirector
            ->gotoUrl('/my-controller/my-action/param1/test/param2/test2');
        // это место никогда не будет достигнуто,
        // т.к. по умолчанию производится переход и завершение выполнения
        return;
    }
]]></programlisting>
        </example>

        <example id="zend.controller.actionhelper.redirector.basicusage.example-3">
            <title>Использование интерфейса _forward() для gotoSimple()</title>

            <para>
                Метод <code>gotoSimple()</code> копирует интерфейс метода
                <code>Zend_Controller_Action::_forward()</code>. Основное
                отличие состоит в том, что он строит URL из переданных
                параметров и использует формат
                <code>:module/:controller/:action/*</code> маршрутизатора по
                умолчанию. Затем он производит перенаправление вместо добавления
                действия в цепочку.
            </para>

            <programlisting language="php"><![CDATA[
class ForwardController extends Zend_Controller_Action
{
    /**
     * Редиректор - определен для полноты кода
     *
     * @var Zend_Controller_Action_Helper_Redirector
     */
    protected $_redirector = null;

    public function init()
    {
        $this->_redirector = $this->_helper->getHelper('Redirector');
    }

    public function myAction()
    {
        /* Делаем что-то */

        // Перенаправление на действие 'my-action' контроллера 'my-controller'
        // в текущем модуле с использованием параметров param1 => test и
        // param2 => test2
        $this->_redirector->gotoSimple('my-action',
                                       'my-controller',
                                       null,
                                       array('param1' => 'test',
                                             'param2' => 'test2'
                                             )
                                       );
    }
}
]]></programlisting>
        </example>

        <example id="zend.controller.actionhelper.redirector.basicusage.example-4">
            <title>Использование маршрута с gotoRoute()</title>

            <para>
                Следующий пример использует метод <code>assemble()</code>
                <link linkend="zend.controller.router">маршрута</link> для
                создания URL, основанного на переданном ассоциативном массиве
                параметров. Этот пример предполагает, что был зарегистрирован
                следующий маршрут:
            </para>

            <programlisting language="php"><![CDATA[
$route = new Zend_Controller_Router_Route(
    'blog/:year/:month/:day/:id',
    array('controller' => 'archive',
          'module' => 'blog',
          'action' => 'view')
);
$router->addRoute('blogArchive', $route);
]]></programlisting>

            <para>
                При заданном массиве, в котором year (год), month (месяц), и day
                (день) установлены в 2006, 4 и 24 соответственно, будет построен
                URL <code>/blog/2006/4/24/42</code>.
            </para>

            <programlisting language="php"><![CDATA[
class BlogAdminController extends Zend_Controller_Action
{
    /**
     * Редиректор - определен для полноты кода
     *
     * @var Zend_Controller_Action_Helper_Redirector
     */
    protected $_redirector = null;

    public function init()
    {
        $this->_redirector = $this->_helper->getHelper('Redirector');
    }

    public function returnAction()
    {
        /* делаем что-то */

        // Перенаправление в архив блога. Строит URL
        // /blog/2006/4/24/42

        $this->_redirector->gotoRoute(
            array('year' => 2006,
                  'month' => 4,
                  'day' => 24,
                  'id' => 42),
            'blogArchive'
        );
    }
}
]]></programlisting>
        </example>
    </sect4>
</sect3>
<!--
vim:se ts=4 sw=4 et:
-->