<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: no -->
<sect1 id="zend.view.controllers">
    <title>Scripts Controladores</title>

    <para>
        O controlador é onde você instancia e configura o <classname>Zend_View</classname>. Você
        atribui variáveis ao visualizador, instruindo-o a renderizar a saída usando um script
        particular.
    </para>

    <sect2 id="zend.view.controllers.assign">
        <title>Atribuindo Variáveis</title>

        <para>
            Seu script controlador deverá atribuir as variáveis necessárias ao visualizador antes de
            passar o controle para ele. Normalmente, você pode fazer isso atribuindo valores aos
            nomes de propriedades da instância do visualizador:
        </para>

        <programlisting language="php"><![CDATA[
$view = new Zend_View();
$view->a = "Hay";
$view->b = "Bee";
$view->c = "Sea";
]]></programlisting>

        <para>
            Porém, isto pode ser tedioso quando você coletar os valores a serem atribuídos a partir
            de uma matriz ou objeto.
        </para>

        <para>
            O método assign() permite a atribuições a partir de uma matriz ou objeto "a granel". O
            exemplo seguinte tem o mesmo efeito que o exemplo de atribuição de propriedades uma a
            uma.
        </para>

        <programlisting language="php"><![CDATA[
$view = new Zend_View();

// atribui uma matriz associativa onde a chave é nome da variável
// e o valor é proprio valor atribuído.
$array = array(
    'a' => "Hay",
    'b' => "Bee",
    'c' => "Sea",
);
$view->assign($array);

// faz o mesmo com as propriedades públicas do objeto;
// note a forma a conversão ao tipo matriz na atribuição.
$obj = new StdClass;
$obj->a = "Hay";
$obj->b = "Bee";
$obj->c = "Sea";
$view->assign((array) $obj);
]]></programlisting>

        <para>
            Alternativamente, você pode usar o método assign para fazer atribuições uma a uma
            passando a string contendo o nome da variável, e logo em seguida o valor a ser
            atribuído.
        </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>Renderizando um Script de Visualização</title>

        <para>
            Uma vez que tenhamos atribuído todas as variáveis necessárias, o controlador irá
            instruir o <classname>Zend_View</classname> a renderizar um script de visualização
            particular. Ele fará isso chamando o método render(). Note que o método irá retornar a
            visualização renderizada, mas não irá imprimí-la, ficando ao seu encargo fazê-lo
            (echo() ou print()) no momento apropriado.
        </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>Caminhos do Script de Visualização</title>

        <para>
            Por padrão, <classname>Zend_View</classname> espera encontrar os scripts de visualização
            localizados no mesmo diretório onde reside o script controlador. Por exemplo, se o seu
            script controlador estiver em "/path/to/app/controllers" e chamar
            $view->render('someView.php'), <classname>Zend_View</classname> irá procurar por ele em
            "/path/to/app/controllers/someView.php".
        </para>

        <para>
            Obviamente, os seus scripts de visualização estarão provavelmente situados em outro
            lugar. Para informar ao <classname>Zend_View</classname> onde procurar pelos referidos
            scripts, use o método setScriptPath().
        </para>

        <programlisting language="php"><![CDATA[
$view = new Zend_View();
$view->setScriptPath('/path/to/app/views');
]]></programlisting>

        <para>
            Agora quando você chamar $view->render('someView.php'), ele irá procurar em
            "/path/to/app/views/someView.php".
        </para>

        <para>
            De fato, você pode "empilhar" caminhos usando o método addScriptPath(). A medida que
            você acrescenta caminhos à pilha, <classname>Zend_View</classname> irá procurar pela
            visão no caminho mais recentemente adicionado à pilha. Isto permite sobrepor visões
            padronizadas por visões customizadas, permitindo a criação de "temas" e "peles" para
            algumas visões, deixando outras intocadas.
        </para>

        <programlisting language="php"><![CDATA[
$view = new Zend_View();
$view->addScriptPath('/path/to/app/views');
$view->addScriptPath('/path/to/custom/');

// agora quando você chamar $view->render('booklist.php'),
// Zend_View procurará primeiro em "/path/to/custom/booklist.php",
// depois em "/path/to/app/views/booklist.php", e finalmente no
// diretório corrente, por "booklist.php".
]]></programlisting>

        <note>
            <title>Nunca utilize uma entrada do usuário para definir caminhos de script</title>

            <para>
                <classname>Zend_View</classname> utiliza caminhos de script para pesquisar e
                renderizar os scripts de visualização. Como tal, estes diretórios devem ser
                conhecidos de antemão, e estarem sob seu controle. <emphasis>Nunca</emphasis> defina
                caminhos de script de visualização com base em entradas do usuário, pois você pode
                se abrir potencialmente para a vulnerabilidade de Inclusão Local de Arquivo se o
                caminho especificado incluir percursos ao diretório pai. Por exemplo, a seguinte
                entrada pode desencadear o problema:
            </para>

            <programlisting language="php"><![CDATA[
// $_GET['foo'] == '../../../etc'
$view->addScriptPath($_GET['foo']);
$view->render('passwd');
]]></programlisting>

            <para>
                Embora este exemplo seja artificial, ele mostra claramente o problema em potencial.
                Se você <emphasis>deve</emphasis> contar com a entrada do usuário para definir o
                caminho do script, filtre a entrada de forma apropriada e certifique-se de que os
                caminhos sejam controlados por sua aplicação.
            </para>
        </note>
    </sect2>
</sect1>
<!--
vim:se ts=4 sw=4 et:
-->
