diff --git a/docs/guide-pt-BR/structure-views.md b/docs/guide-pt-BR/structure-views.md index 34bf435..e92a419 100644 --- a/docs/guide-pt-BR/structure-views.md +++ b/docs/guide-pt-BR/structure-views.md @@ -1,26 +1,24 @@ -Views (Visões) +Visões (Views) =========== -As views (visões) fazem parte da arquitetura [MVC](http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller). -São os responsáveis por apresentar dados aos usuários finais. Em um aplicação Web, -as views (visões) normalmente são criadas sobre o termo de *view templates* -(modelos de visão) que são arquivos PHP contendo principalmente códigos HTML e +As views fazem parte da arquitetura [MVC](http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller). +São a parte do código responsável por apresentar dados aos usuários finais. Em um aplicação Web, +views geralmente são criadas em termos de *view templates* (modelos de view) + que são arquivos PHP contendo principalmente códigos HTML e códigos PHP de apresentação. -A gerência deles são realizadas pelo [componente da aplicação](structure-application-components.md) -[[yii\web\View|view]] na qual fornece métodos comumente utilizados para facilitar -a montagem e a renderização da view (visão). Para simplificar, chamaremos sempre -os arquivos view templates (modelos de visão) ou view template (modelo de visão) -apenas como views (visões). +Os modelos de view são gerenciados pelo [componente da aplicação](structure-application-components.md) +[[yii\web\View|view]] que fornece métodos comumente utilizados para facilitar +a montagem e a renderização da view em si. Para simplificar, geralmente chamamos os modelos de view ou seus arquivos simplesmente +de view. -## Criando Views (Visões) +## Criando Views + +Conforme já mencionado, uma view é simplesmente um arquivo PHP +composto por HTML ou códigos PHP. O código a seguir representa uma view que exibe um formulário +de login. Como você pode ver, o código PHP é utilizado para gerar +as partes de conteúdo dinâmicas, tais como o título da página e o formulário, enquanto o código HTML dispõe os itens na página de uma forma apresentável. -Como mencionado anteriormente, uma view (visão) é simplesmente um arquivo PHP -composto por HTML ou códigos PHP. A view (visão) a seguir, apresenta um formulário -de login. Como você pode observar, o código PHP geralmente é utilizado para gerar -conteúdo dinâmico, tais como o título da página e o formulário, enquanto o código -HTML é utilizado para deixar a página mais apresentável. - ```php title = 'Login'; ?>

title) ?>

-

Please fill out the following fields to login:

+

Por favor, preencha os seguintes campos para entrar:

field($model, 'username') ?> field($model, 'password')->passwordInput() ?> - + ``` -Em uma view (visão), você pode acessar a variável `$this` que referencia o -[[yii\web\View|componente da view (visão)]] para gerenciar e renderizar a view -(visão) atual. +Em uma view, você pode acessar a variável `$this` que referencia o +[[yii\web\View|componente view]] responsável por gerenciar e renderizar a view + em questão. -Além da variável `$this`, podem existir outras variáveis predefinidas na view -(visão) como a variável `$model` do exemplo anterior. Estas variáveis representam -os dados que foram informados a view (visão) por meio dos -[controllers (controladores)](structure-controllers.md) ou de outros objetos que -desencadeiam a [renderização da view (visão)](#rendering-views). +Além de `$this`, pode haver outras variáveis predefinidas na view, tal como +`$model` no exemplo acima. Essas variáveis representam +os dados que foram enviados à view por meio dos +[controllers](structure-controllers.md) ou de outros objetos que +desencadeiam a [renderização da view ](#rendering-views). -> Dica: As variáveis predefinidas são listadas em um bloco de comentário no inicio - de uma view (visão), de modo que possam ser reconhecidas pelas IDEs. Além de ser - uma ótima maneira de documentar suas views (visões). +> Dica: As variáveis predefinidas são listadas em um bloco de comentário no inicio + de uma view para que possam ser reconhecidas pelas IDEs. Além de ser também + uma ótima maneira de documentar suas views. ### Segurança -Ao criar views (visões) que geram páginas HTML, é importante que você codifique -ou filtre dados obtidos pelos usuários antes que os apresente. Caso contrário, -sua aplicação poderá estar sujeita a sofrer um ataque +Ao criar views que geram páginas HTML, é importante que você codifique +e/ou filtre os dados que vêm de usuários antes de exibí-los. Caso contrário, +sua aplicação poderá estar sujeita a um ataque de [cross-site scripting](http://en.wikipedia.org/wiki/Cross-site_scripting). -Para exibir um texto simples, codifique-o antes chamando o método -[[yii\helpers\Html::encode()]]. Por exemplo, o código a seguir codifica o nome do -usuário antes que seja exibido: +Para exibir um texto simples, codifique-o antes por chamar o método +[[yii\helpers\Html::encode()]]. Por exemplo, o código a seguir codifica o nome do +usuário antes de exibí-lo: ```php ``` -Para exibir um conteúdo HTML, utilize o método [[yii\helpers\HtmlPurifier]] para -filtrar o conteúdo primeiro. Por exemplo, o código a seguir filtra o conteúdo que -foi postado antes que seja exibido: +Para exibir conteúdo HTML, use [[yii\helpers\HtmlPurifier]] para +filtrar o conteúdo primeiro. Por exemplo, o código a seguir filtra o conteúdo de `$post->text` antes de exibí-lo: ```php ``` -> Dica: Enquanto o HTMLPurifier faz um excelente trabalho ao montar uma saída - segura, ele não é rápido. Você pode considerar guardar o [cache](caching-overview.md) - do resultado filtrado caso sua aplicação necessite de o máximo de performance. +> Dica: Embora o HTMLPurifier faça um excelente trabalho em tornar a saída de dados + segura, ele não é rápido. Você deveria considerar guardar em [cache](caching-overview.md) + o resultado filtrado se sua aplicação precisa de alta performance. -### Organizando as Views (Visões) +### Organizando as Views -Assim como os [controllers (controladores)](structure-controllers.md) e os -[models (modelos)](structure-models.md), existem convenções para organizar as -views (visões). +Assim como para os [controllers](structure-controllers.md) e para os +[models](structure-models.md), existem convenções para organizar as +views. -* Para que as views (visões) sejam renderizadas por um controller (controlador), - elas devem ser colocadas sob o diretório `@app/views/IDdoController` por padrão, - onde o `IDdoController` refere-se ao [ID do controller](structure-controllers.md#routes). - Por exemplo, se a classe controller (controlador) for `PostController`, o diretório - será `@app/views/post`; se for `PostCommentController`, o diretório será - `@app/views/post-comment`. No caso do controller (controlador) pertencer a um - módulo, o diretório será `views/ControllerID` sob o [[yii\base\Module::basePath|diretório do módulo]]. -* Para as views (visões) que serão renderizadas por um [widget](structure-widgets.md), - devem ser colocadas sob o diretório `WidgetPath/views` por padrão, onde `WidgetPath` - é o diretório onde encontra-se o arquivo da classe widget. -* Para as views (visões) que serão renderizadas por outros objetos, é recomendado - que siga a convenção semelhante à dos widgets. +* Views renderizadas por um controller deveriam ser colocadas sob o diretório `@app/views/IDdoController` por padrão, onde `IDdoController` refere-se ao [ID do controller](structure-controllers.md#routes). + Por exemplo, se a classe do controller for `PostController`, o diretório + será `@app/views/post`; se for `PostCommentController`, o diretório será + `@app/views/post-comment`. Caso o controller pertença a um + módulo, o diretório seria `views/IDdoController` sob o [[yii\base\Module::basePath|diretório do módulo]]. +* Views renderizadas em um [widget](structure-widgets.md) deveriam ser + colocadas sob o diretório `WidgetPath/views` por padrão, onde `WidgetPath` + é o diretório o arquivo da classe do widget. +* Para views renderizadas por outros objetos, é recomendado + que você siga a convenção semelhante à dos widgets. -Você pode personalizar estes diretórios padrão das views (visões) sobrescrevendo -o método [[yii\base\ViewContextInterface::getViewPath()]] dos controllers -(controladores) ou dos widgets. +Você pode personalizar os diretórios padrões das views sobrescrevendo +o método [[yii\base\ViewContextInterface::getViewPath()]] dos controllers ou dos widgets. -## Renderizando Views (Visões) +## Renderizando Views -A renderização das views (visões) podem ser feitas nos -[controllers (controladores)](structure-controllers.md), nos -[widgets](structure-widgets.md) ou em qualquer lugar que chame os métodos de -renderização de views (visões), +Você pode renderizar views em +[controllers](structure-controllers.md), em [widgets](structure-widgets.md) ou em qualquer outro lugar chamando os métodos de renderização da view. Esses métodos compartilham uma assinatura similar, como a seguir: ``` /** - * @param string $view nome da view ou do caminho do arquivo, dependendo do método de renderização atual - * @param array $params os dados que serão passados para a view (visão) + * @param string $view nome da view ou caminho do arquivo, dependendo do método de renderização + * @param array $params os dados passados para a view * @return string resultado da renderização */ methodName($view, $params = []) ``` -### Renderização pelos Controllers (Controladores) +### Renderização em Controllers -Nos [controllers (controladores)](structure-controllers.md), você pode chamar os -seguintes métodos para renderizar as views (visões): +Nos [controllers](structure-controllers.md), você pode chamar os +seguintes métodos para renderizar as views: -* [[yii\base\Controller::render()|render()]]: resulta na renderização de uma - [view nomeada](#named-views) aplicada em um [layout](#layouts). -* [[yii\base\Controller::renderPartial()|renderPartial()]]: resulta na renderização - de uma [view nomeada](#named-views) sem que seja aplicada em qualquer layout. -* [[yii\web\Controller::renderAjax()|renderAjax()]]: resulta na renderização de - uma [view nomeada](#named-views) sem que seja aplicada em qualquer layout mas - inclui todos os JS/CSS e arquivos registrados. Este método é utilizado - frequentemente nas respostas de requisições Web Ajax. -* [[yii\base\Controller::renderFile()|renderFile()]]: renderiza uma view a partir - de um caminho de um arquivo ou por uma [alias](concept-aliases.md). -* [[yii\base\Controller::renderContent()|renderContent()]]: renderiza um conteúdo - estático que será incorporado no [layout](#layouts) selecionado. Este método +* [[yii\base\Controller::render()|render()]]: renderiza uma [view nomeada](#named-views) e aplica um [layout](#layouts) ao resultado da renderização. +* [[yii\base\Controller::renderPartial()|renderPartial()]]: renderiza + uma [view nomeada](#named-views) sem qualquer layout. +* [[yii\web\Controller::renderAjax()|renderAjax()]]: renderiza uma [view nomeada](#named-views) sem qualquer layout + e injeta todos os arquivos JS/CSS registrados. É geralmente utilizado + em respostas de requisições Web Ajax. +* [[yii\base\Controller::renderFile()|renderFile()]]: renderiza uma view a partir + de um caminho de arquivo ou a partir de um [alias](concept-aliases.md). +* [[yii\base\Controller::renderContent()|renderContent()]]: renderiza um conteúdo + estático que será incorporado no [layout](#layouts) selecionado. Este método está disponível desde a versão 2.0.1. Por exemplo, @@ -177,8 +167,8 @@ class PostController extends Controller throw new NotFoundHttpException; } - // renderiza uma view chamada de "view" e aplica um layout nele - return $this->render('view', [ + // renderiza uma view chamada "exibir" e aplica um layout a ela + return $this->render('exibir', [ 'model' => $model, ]); } @@ -186,15 +176,14 @@ class PostController extends Controller ``` -### Renderização pelos Widgets +### Renderização em Widgets -Nos [widgets](structure-widgets.md), você pode chamar os seguintes métodos do -widget para renderizar views (visões). +Nos [widgets](structure-widgets.md), você pode chamar os seguintes métodos do +widget para renderizar views: -* [[yii\base\Widget::render()|render()]]: resulta na renderização de uma - [view nomeada](#named-views). -* [[yii\base\Widget::renderFile()|renderFile()]]: renderiza uma view a partir de - um caminho de um arquivo ou por uma [alias](concept-aliases.md). +* [[yii\base\Widget::render()|render()]]: renderiza uma [view nomeada](#named-views). +* [[yii\base\Widget::renderFile()|renderFile()]]: renderiza uma view a partir de + um caminho de arquivo ou a partir de um [alias](concept-aliases.md). Por exemplo, @@ -210,8 +199,8 @@ class ListWidget extends Widget public function run() { - // renderiza uma view chamada "list" - return $this->render('list', [ + // renderiza uma view chamada "listar" + return $this->render('listar', [ 'items' => $this->items, ]); } @@ -219,137 +208,126 @@ class ListWidget extends Widget ``` -### Renderização pelas Views (Visões) +### Renderização em Views -Você pode renderizar uma view dentro de outra view chamando um dos seguintes -métodos fornecidos pelo [[yii\base\View|componente da view]]: +Você pode renderizar uma view dentro de outra chamando um dos seguintes +métodos fornecidos pelo [[yii\base\View|componente view]]: -* [[yii\base\View::render()|render()]]: resulta na renderização de uma - [view nomeada](#named-views). -* [[yii\web\View::renderAjax()|renderAjax()]]: resulta na renderização de uma - [view nomeada](#named-views) e inclui todos os JS/CSS e arquivos registrados. - Este método é utilizado frequentemente nas respostas de requisições Web Ajax. -* [[yii\base\View::renderFile()|renderFile()]]: renderiza uma view a partir de - um caminho de um arquivo ou por uma [alias](concept-aliases.md). +* [[yii\base\Controller::render()|render()]]: renderiza uma [view nomeada](#named-views). +* [[yii\web\Controller::renderAjax()|renderAjax()]]: renderiza uma [view nomeada](#named-views) sem qualquer layout + e injeta todos os arquivos JS/CSS registrados. É geralmente utilizado + em respostas de requisições Web Ajax. +* [[yii\base\Controller::renderFile()|renderFile()]]: renderiza uma view a partir + de um caminho de arquivo ou a partir de um [alias](concept-aliases.md). -Por exemplo, no código a seguir, uma view (visão) qualquer renderiza outro arquivo -de view (visão) chamado `_overview.php` onde ambas encontram-se no mesmo diretório. -Lembre-se que a `$this` da view (visão) refere-se ao componente da [[yii\base\View|view]]: +Por exemplo, no código a seguir, uma view qualquer renderiza outro arquivo +de view chamado `_visao-geral.php` que encontram-se em seu mesmo diretório. +Lembre-se que `$this` na view referencia o componente [[yii\base\View|view]]: ```php -render('_overview') ?> +render('_visao-geral') ?> ``` -### Renderização por Outros Lugares +### Renderização em Outros Lugares -Em qualquer lugar, você pode acessar o componente de aplicação [[yii\base\View|view]] -pela expressão `Yii::$app->view` e chamar qualquer método mencionado anteriormente -para renderizar uma view (visão). Por exemplo, +Em qualquer lugar, você pode acessar o componente de aplicação [[yii\base\View|view]] +pela expressão `Yii::$app->view` e então chamar qualquer método mencionado anteriormente +para renderizar uma view. Por exemplo, ```php -// exibe o arquivo de view (visão) "@app/views/site/license.php" +// exibe a view "@app/views/site/license.php" echo \Yii::$app->view->renderFile('@app/views/site/license.php'); ``` -### Views (Visões) Nomeadas +### Views Nomeadas -Ao renderizar uma view (visão), você pode especificar a view usando um nome ou o -caminho do arquivo/alias. Na maioria dos casos, você usará a primeira maneira, -pois são mais concisos e flexíveis. Especificamente, chamaremos as views usando -nomes como *views (visões) nomeadas*. +Ao renderizar uma view, você pode especificá-la usando seu nome, ou o caminho do arquivo, ou um alias. Na maioria dos casos, +você usará a primeira maneira por ser mais concisa e flexível. Quando especificamos views por nome, chamamos essas views de *views nomeadas*. -Um nome da view (visão) resolve o caminho da view (visão) correspondente de +Um nome de view é convertido no caminho de arquivo da view correspondente de acordo com as seguintes regras: -* Um nome da view (visão) pode omitir a extensão do arquivo. Neste caso, o `.php` - será usado como extensão. Por exemplo, a view chamada `about` corresponderá ao - arquivo `about.php`. -* Se o nome da view (visão) iniciar com barras duplas `//`, o caminho correspondente - será `@app/views/ViewName`. Ou seja, a view (visão) será localizada sob o - [[yii\base\Application::viewPath|diretório das views da aplicação]]. Por exemplo, - `//site/about` corresponderá ao `@app/views/site/about.php`. -* Se o nome da view (visão) iniciar com barra `/`, o caminho do arquivo da view - será formado pelo nome da view (visão) com o [[yii\base\Module::viewPath|diretório da view]] - do [módulo](structure-modules.md) ativo. Se não existir um módulo ativo, o - `@app/views/ViewName` será usado. Por exemplo, o `/user/create` corresponderá - ao `@app/modules/user/views/user/create.php`, caso o módulo ativo seja `user`. - Se não existir um módulo ativo, o caminho do arquivo da view (visão) será - `@app/views/user/create.php`. -* Se a view (visão) for renderizada com um [[yii\base\View::context|contexto]] e - que o mesmo implemente [[yii\base\ViewContextInterface]], o caminho do arquivo - da view será formado pelo nome da view (visão) com o - [[yii\base\ViewContextInterface::getViewPath()|diretório da view]] do contexto. - Isto se aplica principalmente para as views (visões) renderizadas pelos controllers - (controladores) e widgets. Por exemplo, `about` corresponderá ao - `@app/views/site/about.php` caso o contexto seja o controller (controlador) +* Um nome de view pode omitir a extensão do arquivo. Neste caso, o `.php` + será usado como extensão. Por exemplo, a view chamada `sobre` corresponderá ao + arquivo `sobre.php`. +* Se o nome da view iniciar com barras duplas `//`, o caminho correspondente + seria `@app/views/ViewName`. Ou seja, a view será localizada sob o + [[yii\base\Application::viewPath|diretório das views da aplicação]]. Por exemplo, + `//site/sobre` corresponderá ao `@app/views/site/sobre.php`. +* Se o nome da view iniciar com uma barra simples `/`, o caminho do arquivo da view + será formado pelo nome da view com o [[yii\base\Module::viewPath|diretório da view]] + do [módulo](structure-modules.md) ativo. Se não houver um módulo ativo, o + `@app/views/ViewName` será usado. Por exemplo, `/usuario/criar` corresponderá + a `@app/modules/user/views/usuario/criar.php` caso o módulo ativo seja `user`. + Se não existir um módulo ativo, o caminho do arquivo da view será + `@app/views/usuario/criar.php`. +* Se a view for renderizada com um [[yii\base\View::context|contexto]] e + que implemente [[yii\base\ViewContextInterface]], o caminho do arquivo + da view será formado por prefixar o [[yii\base\ViewContextInterface::getViewPath()|diretório da view]] do contexto ao nome da view. + Isto se aplica principalmente às views renderizadas em controllers e widgets. Por exemplo, + `sobre` corresponderá a `@app/views/site/sobre.php` caso o contexto seja o controller `SiteController`. -* Se uma view (visão) for renderizada por outra view (visão), o diretório desta - outra view (visão) será usado para formar o caminho do arquivo da view atual. - Por exemplo, `item` corresponderá ao `@app/views/post/item.php` se ela for - renderizada pela view `@app/views/post/index.php`. +* Se uma view for renderizada dentro de outra, o diretório que contém esta + outra view será usado para formar o caminho de seu arquivo. + Por exemplo, `item` corresponderá a `@app/views/post/item.php` se ela for + renderizada dentro da view `@app/views/post/index.php`. -De acordo com as regras acima, ao chamar `$this->render('view')` em um controller -(controlador) `app\controllers\PostController` será renderizado o arquivo de view -(visão) `@app/views/post/view.php` e, ao chamar `$this->render('_overview')` nesta -view, será renderizado o arquivo de visão `@app/views/post/_overview.php`. +De acordo com as regras acima, chamar `$this->render('exibir')` em um controller `app\controllers\PostController` vai realmente renderizar o arquivo de view + `@app/views/post/exibir.php` e, chamar `$this->render('_visaogeral')` nessa view (`exibir.php`) vai renderizar o arquivo de visão `@app/views/post/_visaogeral.php`. -### Acessando Dados em Views (Visões) +### Acessando Dados em Views -Existem duas abordagens para acessar dados em um view (visão): *push* e *pull*. +Existem duas abordagens para acessar dados em uma view : *push* e *pull*. -Ao passar os dados como o segundo parâmetro nos métodos de renderização de view -(visão), você estará usando a abordagem *push*. -Os dados devem ser representados por um array com pares de nome-valor. Quando a -view (visão) estiver sendo renderizada, a função `extract()` do PHP será chamado -passando este array a fim de extraí-los em variáveis na view (visão). -Por exemplo, o código do controller (controlador) a seguir fornecerá (pela -abordagem *push*) duas variáveis para a view (visão) `report`: `$foo = 1` e `$bar = 2`. +Ao passar os dados como o segundo parâmetro nos métodos de renderização de view, você estará usando a abordagem *push*. +Os dados devem ser representados por um array com pares de nome-valor. Quando a +view estiver sendo renderizada, a função `extract()` do PHP será executada sobre essa array a fim de extrair seus dados em variáveis na view. +Por exemplo, o renderização da view a seguir, em um controller, disponibilizará (pela +abordagem *push*) duas variáveis para a view `relatorio`: `$foo = 1` e `$bar = 2`. ```php -echo $this->render('report', [ +echo $this->render('relatorio', [ 'foo' => 1, 'bar' => 2, ]); ``` -Na abordagem *pull*, os dados serão recuperados ativamente pelo -[[yii\base\View|componente da view]] ou por outros objetos que acessam as views -(por exemplo, `Yii::$app`). Usando o código do exemplo a seguir, você poderá -acessar o objeto do controller (controlador) pela expressão `$this->context` -dentro da view. E como resultado, será possível acessar qualquer propriedade ou -métodos do controller (controlador) na view (visão) `report`, como o ID do -controller conforme o exemplo a seguir: +A abordagem *pull* ativamente obtém os dados do +[[yii\base\View|componente view]] ou de outros objetos acessíveis nas views +(por exemplo, `Yii::$app`). Usando o código a seguir como exemplo, dentro da view você pode acessar seu objeto controller usando a expressão `$this->context`. +E como resultado, será possível acessar quaisquer propriedades ou +métodos do controller, como o seu ID, na view `relatorio`: ```php -The controller ID is: context->id ?> +O ID do controller é: context->id ?> ?> ``` -A abordagem *push* normalmente é a forma preferida de acessar dados nas views -(visões), pelo fato de criar menos dependências nos objetos de contexto. A -desvantagem é que você precisará montar manualmente os dados em um array o tempo -todo, o que poderia tornar-se tedioso e propenso a erros se uma view for +A abordagem *push* normalmente é a forma preferida de acessar dados nas views +por que as torna menos dependentes de objetos de contexto. A +desvantagem é que você precisa montar manualmente os dados em um array o tempo +todo, o que poderia se tornar tedioso e propenso a erros se uma view for compartilhada e renderizada em lugares diferentes. -### Compartilhando Dados entre as Views (Visões) +### Compartilhando Dados entre as Views -O [[yii\base\View|componente da view]] fornece a propriedade -[[yii\base\View::params|params]] que você pode usar para compartilhar dados entre -as views (visões). +O [[yii\base\View|componente view]] fornece a propriedade +[[yii\base\View::params|params]] que você pode usar para compartilhar dados entre +as views. -Por exemplo, em uma view `about`, você pode ter o seguinte código para especificar -o seguimento atual do rastro da aplicação (breadcrumbs). +Por exemplo, em uma view `sobre`, você pode ter o seguinte código que especifica +o seguimento atual do "rastro de navegação" (breadcrumbs): ```php -$this->params['breadcrumbs'][] = 'About Us'; +$this->params['breadcrumbs'][] = 'Sobre nós'; ``` -Em seguida, no arquivo do [layout](#layouts), que também é uma view, você pode -exibir o rastro da aplicação (breadcrumbs) usando os dados passados pela +Em seguida, no arquivo [layout](#layouts), que também é uma view, você pode +exibir o "rastro de navegação" (breadcrumbs) usando os dados passados pela propriedade [[yii\base\View::params|params]]: ```php @@ -361,27 +339,27 @@ propriedade [[yii\base\View::params|params]]: ## Layouts -Os layouts são um tipo especial de views (visões) que representam as partes comuns -das views (visões). Por exemplo, a maioria das páginas de aplicações Web -compartilham o mesmo cabeçalho e rodapé. Embora você possa repetir o mesmo -cabeçalho e rodapé em todas as view, a melhor maneira é fazer isso apenas uma vez -no layout e incorporar o resultado da renderização de uma view em um lugar +Layouts são um tipo especial de view que representam as partes comuns +de múltiplas views. Por exemplo, as páginas da maioria das aplicações Web +compartilham o mesmo cabeçalho e rodapé. Embora você possa repetir o mesmo +cabeçalho e rodapé em todas as view, a melhor maneira é fazer isso apenas uma vez +no layout e incorporar o resultado da renderização de uma view em um lugar apropriado no layout. ### Criando Layouts -Pelo fato dos layouts também serem views (visões), eles podem ser criados de -forma semelhante as views (visões) normais. Por padrão, os layouts são guardados -no diretório `@app/views/layouts`. Para os layouts usados nos -[módulos](structure-modules.md), devem ser guardados no diretório `views/layouts` +Visto que os layouts também são views, eles podem ser criados de +forma semelhante às views normais. Por padrão, layouts são salvos +no diretório `@app/views/layouts`. Layouts usados em um +[módulo](structure-modules.md) devem ser salvos no diretório `views/layouts` sob o [[yii\base\Module::basePath|diretório do módulo]]. -Você pode personalizar o diretório do layout padrão configurando a propriedade +Você pode personalizar o diretório padrão de layouts configurando a propriedade [[yii\base\Module::layoutPath]] da aplicação ou do módulo. -O exemplo a seguir mostra como é o layout. Observe que, para fins ilustrativos, -simplificamos o código do layout. Em prática, você pode adicionar mais conteúdo, -como tags de cabeçalho, menu principal, etc. +O exemplo a seguir mostra como é um layout. Observe que, para fins ilustrativos, +simplificamos bastante o código do layout. Na prática, você pode querer adicionar mais conteúdos a ele, tais +como tags no head, menu principal, etc. ```php beginBody() ?> -
My Company
+
Minha Empresa
- + endBody() ?> endPage() ?> ``` -Como pode ver, o layout gera as tags HTML que são comuns em todas as páginas. Na -seçao ``, o layout dará *echo* da variável `$content` que representa o -resultado da renderização do conteúdo das views (visões) e é incorporado ao layout +Conforme pode ver, o layout gera as tags HTML que são comuns a todas as páginas. Na +seçao ``, o layout vai inserir a variável `$content` que representa o +resultado da renderização do conteúdo das views e é enviado ao layout quando método [[yii\base\Controller::render()]] for chamado. -Como mostrado no código acima, a maioria dos layouts devem chamar os métodos -listados a seguir. Estes métodos podem desencadeiam eventos referentes ao processo +A maioria dos layouts devem chamar os métodos listados a seguir, conforme ocorreu no código acima. Estes métodos essencialmente desencadeiam eventos referentes ao processo de renderização para que scripts e tags registrados em outros lugares possam ser -inseridos nos locais onde estes métodos forem chamados. +inseridos nos locais onde eles (os métodos) forem chamados. -- [[yii\base\View::beginPage()|beginPage()]]: Este método deve ser chamado no início - do layout. Ele dispara o evento [[yii\base\View::EVENT_BEGIN_PAGE|EVENT_BEGIN_PAGE]] +- [[yii\base\View::beginPage()|beginPage()]]: Este método deve ser chamado no início + do layout. Ele dispara o evento [[yii\base\View::EVENT_BEGIN_PAGE|EVENT_BEGIN_PAGE]] que indica o início de uma página. -- [[yii\base\View::endPage()|endPage()]]: Este método deve ser chamado no final - do layout. Ele dispara o evento [[yii\base\View::EVENT_END_PAGE|EVENT_END_PAGE]] +- [[yii\base\View::endPage()|endPage()]]: Este método deve ser chamado no final + do layout. Ele dispara o evento [[yii\base\View::EVENT_END_PAGE|EVENT_END_PAGE]] que indica o fim de uma página. -- [[yii\web\View::head()|head()]]: Este método deve ser chamada na seção `` - de uma página HTML. Ele reserva este local para gerar os códigos HTML do - cabeçalho que foram registrados (por exemplo, link e meta tags) quando uma - página finaliza a renderização. -- [[yii\web\View::beginBody()|beginBody()]]: Este método deve ser chamado no início - da seção `` . Ele dispara o evento [[yii\web\View::EVENT_BEGIN_BODY|EVENT_BEGIN_BODY]] - e reserva este local para gerar os códigos HTML (por exemplo, JavaScript) - voltados para a posição inicial do corpo do layout que foram registrados. -- [[yii\web\View::endBody()|endBody()]]: Este método deve ser chamado no final da - seção ``. Ele dispara o evento [[yii\web\View::EVENT_END_BODY|EVENT_END_BODY]] - e reserva este local para gerar códigos HTML (por exemplo, JavaScript) voltados - para a posição final do corpo do layout que foram registrados. +- [[yii\web\View::head()|head()]]: Este método deve ser chamado na seção `` + de uma página HTML. Ele gera um marcador que será substituído por código HTML (por exemplo, tags `` e ``) quando a página termina a renderização. +- [[yii\web\View::beginBody()|beginBody()]]: Este método deve ser chamado no início + da seção `` . Ele dispara o evento [[yii\web\View::EVENT_BEGIN_BODY|EVENT_BEGIN_BODY]] e gera um marcador que será substituído por código HTML que estiver registrado para essa posição (por exemplo, algum código JavaScript). +- [[yii\web\View::endBody()|endBody()]]: Este método deve ser chamado no final da + seção ``. Ele dispara o evento [[yii\web\View::EVENT_END_BODY|EVENT_END_BODY]] + e gera um marcador que será substituído por código HTML que estiver registrado para essa posição (por exemplo, algum código JavaScript). ### Acessando Dados nos Layouts -Dentro de um layout, você tem acesso a duas variáveis predefinidas: `$this` e -`$content`. A primeira refere-se ao componente da [[yii\base\View|view]] como as -views normais, enquanto o segundo contém o resultado da renderização do conteúdo -de uma view que é gerada pela execução do método [[yii\base\Controller::render()|render()]] -no controller (controlador). +Dentro de um layout, você tem acesso a duas variáveis predefinidas: `$this` e +`$content`. A primeira se refere ao componente [[yii\base\View|view]] como em views normais, enquanto a segunda contém o resultado da renderização do conteúdo +de uma view que é gerada por chamar o método [[yii\base\Controller::render()|render()]] +no controller. -Se você quiser acessar outros dados nos layouts, você terá que usar a abordagem -*pull* conforme descrito na subseção -[Acessando Dados em Views (Visões)](#accessing-data-in-views). Se você quiser -passar os dados de um conteúdo da view em um layout, poderá usar o método descrito -na subseção [Compartilhando Dados entre as Views (Visões)](#sharing-data-among-views). +Se você quiser acessar outros dados nos layouts, você terá de usar a abordagem +*pull* conforme descrito na subseção +[Acessando Dados em Views ](#accessing-data-in-views). Se você quiser +passar os dados do conteúdo da view para um layout, poderá usar o método descrito +na subseção [Compartilhando Dados entre as Views ](#sharing-data-among-views). ### Usando Layouts -Como descrito na subseção [Renderização nos Controllers (Controladores)](#rendering-in-controllers), -quando você renderizar uma view (visão) chamando o método [[yii\base\Controller::render()|render()]] -em um controller (controlador), o resultado da renderização será aplicado em um layout. -Por padrão, o layout `@app/views/layouts/main.php` será usado. - -Você pode usar um layout diferente configurando a propriedade -[[yii\base\Application::layout]] ou [[yii\base\Controller::layout]]. -A primeira aplica o layout em todos os controllers (controladores) usados, -enquanto o segundo sobrescreve a primeira forma pelos controllers (controladores) -de forma individual. -Por exemplo, o código a seguir faz com que o controller `post` use o -`@app/views/layouts/post.php` como layout quando renderizar as suas views (visões). -Os outros controllers (controladores), assumindo que a propriedade `layout` da -aplicação não foi alterada, usará como padrão o layout `@app/views/layouts/main.php`. - +Conforme descrito na subseção [Renderização em Controllers](#rendering-in-controllers), +quando você renderiza uma view chamando o método [[yii\base\Controller::render()|render()]] +em um controller, será aplicado um layout ao resultado da renderização. Por padrão, o layout `@app/views/layouts/main.php` será usado. + +Você pode usar um layout diferente configurando ou a propriedade +[[yii\base\Application::layout]] ou a [[yii\base\Controller::layout]]. +A primeira especifica o layout usado por todos os controllers, +enquanto a segunda é usada para controllers de forma individual, sobrescrevendo a primeira. +Por exemplo, o código a seguir faz com que o controller `post` usar o +`@app/views/layouts/post.php` como layout quando renderizar as suas views. +Outros controllers, assumindo que a propriedade `layout` da +aplicação não tenha sido alterada, usarão o layout padrão `@app/views/layouts/main.php`. + ```php namespace app\controllers; @@ -480,148 +449,141 @@ use yii\web\Controller; class PostController extends Controller { public $layout = 'post'; - + // ... } ``` -Para os controllers (controladores) que pertencem a um módulo, você pode configurar -a propriedade [[yii\base\Module::layout|layout]] do módulo para usar um layout em -particular para estes controllers. - -Devido a propriedade `layout` possa ser configurado em diferentes níveis -(controllers, módulos, aplicação), por baixo dos panos o Yii determina em duas -etapas qual é o arquivo de layout que será usado por um controller (controlador) -em particular. - -Na primeira etapa, o Yii determina o nome do layout e o módulo de contexto: - -- Se a propriedade [[yii\base\Controller::layout]] do controller (controlador) - não for nula, será usado como o nome do layout e o [[yii\base\Controller::module|módulo]] - do controller (controlador) como módulo de contexto. -- Se a propriedade [[yii\base\Controller::layout|layout]] for nula, será buscado - através de todos os módulos ancestrais (incluindo a própria aplicação) do - controller (controlador) até encontrar o primeiro módulo que a propriedade - [[yii\base\Module::layout|layout]] não esteja nula. Este módulo encontrado será - usado como o módulo de contexto e o valor de sua propriedade [[yii\base\Module::layout|layout]] - como o nome do layout. Se um módulo não for encontrado, significará que nenhum +Para os controllers que pertencem a um módulo, você também pode configurar +a propriedade [[yii\base\Module::layout|layout]] do módulo para usar um layout em +particular para esses controllers. + +Visto que a propriedade `layout` pode ser configurada em diferentes níveis +(controllers, módulos, aplicação), por trás das cortinas o Yii determina, em duas +etapas, qual arquivo de layout será usado por um controller em particular. + +Na primeira etapa, o Yii determina o valor da propriedade do layout e o módulo de contexto: + +- Se a propriedade [[yii\base\Controller::layout]] do controller + não for `null`, ela será usada e o [[yii\base\Controller::module|módulo]] + do controller será usado como módulo de contexto. +- Se a propriedade [[yii\base\Controller::layout|layout]] for `null`, o Yii pesquisará + através de todos os módulos ancestrais do + controller (incluindo a própria aplicação) até encontrar o primeiro módulo cuja propriedade + [[yii\base\Module::layout|layout]] não for `null`. O módulo encontrado será + usado como módulo de contexto e o valor de sua propriedade [[yii\base\Module::layout|layout]] + como o layout escolhido. Se nenhum módulo for encontrado, nenhum layout será aplicado. - -Na segunda etapa, ele determina o arquivo do layout de acordo com o valor do layout -e o modulo de contexto obtidos na primeira etapa. O nome do layout pode ter: + +Na segunda etapa, o Yii determina o real arquivo de layout de acordo com o valor da propriedade layout e com o modulo de contexto obtidos na primeira etapa. O valor da propriedade layout pode ser: - uma alias de caminho (por exemplo, `@app/views/layouts/main`). -- um caminho absoluto (por exemplo, `/main`): o nome do layout que começa com uma - barra. O arquivo do layout será procurado sob o - [[yii\base\Application::layoutPath|diretório do layout]] da aplicação, na qual - o valor padrão é `@app/views/layouts`. -- um caminho relativo (por exemplo, `main`): o arquivo do layout será procurado - sob o [[yii\base\Module::layoutPath|diretório do layout]] do módulo de contexto, - na qual o valor padrão é `views/layouts` sob o [[yii\base\Module::basePath|diretório do módulo]]. +- um caminho absoluto (por exemplo, `/main`): o valor começa com uma + barra. O arquivo de layout será procurado sob o + [[yii\base\Application::layoutPath|diretório de layouts]] da aplicação, cujo valor padrão é `@app/views/layouts`. +- um caminho relativo (por exemplo, `main`): o arquivo de layout será procurado + sob o [[yii\base\Module::layoutPath|diretório de layouts]] do módulo de contexto, + cujo valor padrão é `views/layouts` sob o [[yii\base\Module::basePath|diretório do módulo]]. - um valor booleano `false`: nenhum layout será aplicado. -Caso o nome do layout não tiver uma extensão de arquivo, será usado um `.php` por padrão. +Se o valor da propriedade layout não tiver uma extensão de arquivo, será usada a extensão `.php` por padrão. ### Layouts Aninhados -Algumas vezes, você pode querer que um layout seja usado dentro de outro. Por -exemplo, você pode querer usar diferentes layouts para cada seção de um página -Web, onde todos estes layouts compartilharão o mesmo layout básico a fim de gerar -toda a estrutura de uma página HTML5. Este objetivo pode ser alcançado chamando -os métodos [[yii\base\View::beginContent()|beginContent()]] e -[[yii\base\View::endContent()|endContent()]] nos layouts filhos, como mostro no +Às vezes, você pode querer que um layout seja usado dentro de outro. Por +exemplo, em diferentes seções de um site, você pode querer usar diferentes layouts, e todos esses layouts compartilharão o mesmo layout básico a fim de produzir +toda a estrutura da página HTML. Você pode fazer isso por chamar +os métodos [[yii\base\View::beginContent()|beginContent()]] e +[[yii\base\View::endContent()|endContent()]] nos layouts filhos, como no exemplo a seguir: ```php beginContent('@app/views/layouts/base.php'); ?> -...conteúdo do layout filho... +...conteúdo do layout filho aqui... endContent(); ?> ``` -Como mostrado no exemplo acima, o conteúdo do layout filho deve ser envolvido -pelos métodos [[yii\base\View::beginContent()|beginContent()]] e -[[yii\base\View::endContent()|endContent()]]. O parâmetro passado no -[[yii\base\View::beginContent()|beginContent()]] indica qual é o layout pai. Ele -pode ser tanto um arquivo do layout quanto uma alias. +Como mostrado acima, o conteúdo do layout filho deve ser inserido entre os métodos [[yii\base\View::beginContent()|beginContent()]] e +[[yii\base\View::endContent()|endContent()]]. O parâmetro passado para o +[[yii\base\View::beginContent()|beginContent()]] indica qual é o layout pai. Ele +pode ser um arquivo de layout ou mesmo um alias. -Usando a abordagem mencionada, poderá aninhar os layouts em mais de um nível. +Usando a abordagem acima, você pode aninhar os layouts em mais de um nível. ### Usando Blocos -Os blocos lhe permitem especificar o conteúdo da view (visão) de um local e exibi-lo -em outro. Geralmente são usados em conjunto com os layouts. Por exemplo, você pode -definir um bloco no conteúdo de uma view (visão) e exibi-lo no layout. +Blocos permitem que você especifique o conteúdo da view em um local e o exiba +em outro. Geralmente são usados em conjunto com os layouts. Por exemplo, você pode +definir um bloco no conteúdo de uma view e exibi-lo no layout. -Para definir um bloco, deverá chamar os métodos [[yii\base\View::beginBlock()|beginBlock()]] +Para definir um bloco, chame os métodos [[yii\base\View::beginBlock()|beginBlock()]] e [[yii\base\View::endBlock()|endBlock()]]. -O bloco pode ser acessado via `$view->blocks[$blockID]`, onde o `$blockID` é o +O bloco pode então ser acessado via `$view->blocks[$blockID]`, onde o `$blockID` é o identificador único que você associou ao bloco quando o definiu. -O exemplo a seguir mostra como você pode usar blocos para personalizar as partes -especificas de um layout pelo conteúdo da view (visão). +O exemplo a seguir mostra como você pode usar blocos para personalizar as partes +especificas de um layout pelo conteúdo da view. -Primeiramente, no conteúdo da view (visão), defina um ou vários blocos: +Primeiramente, no conteúdo da view, defina um ou vários blocos: ```php ... -beginBlock('block1'); ?> +beginBlock('bloco1'); ?> -...conteúdo do block1... +...conteúdo do bloco1... endBlock(); ?> ... -beginBlock('block3'); ?> +beginBlock('bloco3'); ?> -... conteúdo do block3... +... conteúdo do bloco3... endBlock(); ?> ``` -Em seguida, na view (visão) do layout, aplique os blocos se estiverem disponíveis -ou caso não esteja disponível exiba um conteúdo padrão. +Em seguida, no layout, renderize os blocos se estiverem disponíveis +ou exiba um conteúdo padrão se não estiverem. ```php ... -blocks['block1'])): ?> - blocks['block1'] ?> +blocks['bloco1'])): ?> + blocks['bloco1'] ?> - ... conteúdo padrão para o block1 ... + ... conteúdo padrão para o bloco1 ... ... -blocks['block2'])): ?> - blocks['block2'] ?> +blocks['bloco2'])): ?> + blocks['bloco2'] ?> - ... conteúdo padrão para o block2 ... + ... conteúdo padrão para o bloco2 ... ... -blocks['block3'])): ?> - blocks['block3'] ?> +blocks['bloco3'])): ?> + blocks['bloco3'] ?> - ... conteúdo padrão para o block3 ... + ... conteúdo padrão para o bloco3 ... ... ``` -## Usando Componentes de View (Visão) +## Usando Componentes View -Os [[yii\base\View|componentes de view (visão)]] fornecem muitos recursos -relacionados às views (visões). Enquanto você pode obter os componentes de view -(visão) através da criação de instancias individuais da classe [[yii\base\View]] -ou de suas classes filhas, na maioria dos casos você simplesmente usará o -componente da aplicação `view`. Você pode configurar estes componentes nas -[configurações da aplicação](structure-applications.md#application-configurations) +Os [[yii\base\View|componentes view]] fornecem muitos recursos. Embora você possa obtê-los por criar instancias individuais de [[yii\base\View]] +ou de suas classes filhas, na maioria dos casos você usará o +componente `view` da aplicação. Você pode configurar este componente nas +[configurações da aplicação](structure-applications.md#application-configurations) conforme o exemplo a seguir: ```php @@ -636,43 +598,36 @@ conforme o exemplo a seguir: ] ``` -A seguir, os recursos úteis relacionados às views (visões) que os componentes de -view (visão) fornecem. Cada um dos recursos são descritos com mais detalhes em seções separadas: +Componentes de view fornecem úteis recursos relacionados. Cada um deles está descrito com mais detalhes em seções separadas: -* [temas](output-theming.md): permite que você desenvolva e altere um tema para +* [temas](output-theming.md): permite que você desenvolva e altere temas para o seu site. -* [cache de fragmento](caching-fragment.md): permite que guarde o cache de um +* [fragmento de cache](caching-fragment.md): permite que você guarde em cache um fragmento de uma página. -* [manipulando client scripts](output-client-scripts.md): suporta o registro e a - renderização de CSS e JavaScript. -* [manipulando asset bundle](structure-assets.md): suporta o registro e renderização - de [asset bundles](structure-assets.md). -* [motores de templates alternativos](tutorial-template-engines.md): permite que - você use outro motor de template, tais como o [Twig](http://twig.sensiolabs.org/) - e o [Smarty](http://www.smarty.net/). +* [manipulação de client scripts](output-client-scripts.md): permite que você registre e renderize CSS e JavaScript. +* [manipulando asset bundle](structure-assets.md): permite que você registre e renderize [recursos estáticos (asset bundles)](structure-assets.md). +* [template engines alternativos](tutorial-template-engines.md): permite que você use outros template engines, tais como o [Twig](http://twig.sensiolabs.org/) + e [Smarty](http://www.smarty.net/). -Você também pode usar com frequência os seguintes recursos menos úteis quando -estiver desenvolvendo suas páginas. +Você também pode usar os seguintes recursos que, embora simples, são úteis quando estiver desenvolvendo suas páginas. -### Configuração do Título da Página +### Configurando Títulos de Página -Cada página deve ter um título. Normalmente, a tag do título é colocada no início -de um [layout](#layouts). Mas na prática, o título é muitas vezes determinado -pelo conteúdo das views (visões) do que pelos os layouts. Para resolver este -problema, a classe [[yii\web\View]] fornece a propriedade [[yii\web\View::title|title]] -para você informar o título pelas view (visões) para os layouts. +Cada página deve ter um título. Normalmente, a tag `` é exibida em um [layout](#layouts). Mas, na prática, o título é muitas vezes determinado +no conteúdo das views, em vez de nos layouts. Para resolver este +problema, a classe [[yii\web\View]] fornece a propriedade [[yii\web\View::title|title]] para você passar o título a partir das views para o layout. -Para fazer uso deste recurso, em cada view (visão), você pode definir o título da +Para fazer uso deste recurso, em cada view, você pode definir o título da página conforme o exemplo a seguir: ```php <?php -$this->title = 'My page title'; +$this->title = 'Título da Minha Página'; ?> ``` -E no layout, verifique se você tem o seguinte código sob o elemento `<head>`: +E, no layout, certifique-se de ter o seguinte código dentro da seção `<head>`: ```php <title><?= Html::encode($this->title) ?> @@ -681,13 +636,12 @@ E no layout, verifique se você tem o seguinte código sob o elemento ``: ### Registrando os Meta Tags -As páginas Web geralmente precisam gerar vários meta tags necessários para -diferentes fins. Assim como os títulos, os meta tags precisam estar na seção -`` e normalmente são criados nos layouts. +Páginas Web geralmente precisam gerar variadas meta tags necessárias a +diversas finalidades. Assim como os títulos, as meta tags precisam estar na seção +`` e normalmente são geradas nos layouts. -Se você quiser especificar quais meta tags precisam ser criados no conteúdo de -uma view (visão), poderá chamar o método [[yii\web\View::registerMetaTag()]] -no conteúdo da view, conforme o exemplo a seguir: +Se você quiser especificar quais meta tags gerar no conteúdo das views, poderá chamar o método [[yii\web\View::registerMetaTag()]] +na view, conforme o exemplo a seguir: ```php registerMetaTag(['name' => 'keywords', 'content' => 'yii, framework, php' ?> ``` -O código acima registrará um meta tag "keywords" com o componente da view (visão). -O meta tag registrado será processado antes que o layout finalize sua renderização. -O código do HTML a seguir será criado no lugar da chamada [[yii\web\View::head()]] -no layout: +O código acima registrará uma meta tag "keywords" com o componente view. +A meta tag registrada será renderizadas depois de o layout finalizar sua renderização. O código HTML a seguir será gerado e inserido no local onde você chama [[yii\web\View::head()]] no layout: ```php ``` -Observe que ao chamar o método [[yii\web\View::registerMetaTag()]] muitas vezes, -registrará diversas meta tags, independente se forem as mesmas meta tags ou não. +Observe que se você chamar o método [[yii\web\View::registerMetaTag()]] muitas vezes, ele registrará diversas meta tags, independente se forem as mesmas ou não. -Para garantir que existirá apenas uma única instância de um tipo de meta tag, +Para garantir que exista apenas uma única instância de um tipo de meta tag, você pode especificar uma chave no segundo parâmetro ao chamar o método. -Por exemplo, o código a seguir registra dois meta tags "description". No entanto, -apenas o segundo será processado. +Por exemplo, o código a seguir registra dois meta tags "description". No entanto, +apenas o segundo será renderizado. -```html -$this->registerMetaTag(['name' => 'description', 'content' => 'This is my cool website made with Yii!'], 'description'); -$this->registerMetaTag(['name' => 'description', 'content' => 'This website is about funny raccoons.'], 'description'); +```php +$this->registerMetaTag(['name' => 'description', 'content' => 'Este é o meu website feito com Yii!'], 'descricao'); +$this->registerMetaTag(['name' => 'description', 'content' => 'Este website é sobre coisas divertidas.'], 'descricao'); ``` -### Registrando as Tags Link +### Registrando Tags Link -Assim como os [meta tags](#registering-meta-tags), as tags link são úteis em muitos -casos, tais como a personalização do favicon, apontamento de feed RSS ou delegar -o OpenID para outros servidores. Você pode trabalhar com as tags link de forma -similar aos meta tags, usando o método [[yii\web\View::registerLinkTag()]]. Por -exemplo, no conteúdo da view (visão), você pode registrar uma tag link conforme -o seguinte exemplo, +Assim como as [meta tags](#registering-meta-tags), as tags link são úteis em muitos +casos, tais como a personalização do favicon, apontamento para feed RSS ou delegação do OpenID para outros servidores. +Você pode trabalhar com as tags link de forma similar às meta tags, usando o método [[yii\web\View::registerLinkTag()]]. Por +exemplo, na view, você pode registrar uma tag link como segue: ```php $this->registerLinkTag([ - 'title' => 'Live News for Yii', + 'title' => 'Notícias sobre o Yii', 'rel' => 'alternate', 'type' => 'application/rss+xml', 'href' => 'http://www.yiiframework.com/rss.xml/', ]); ``` -O código acima resultará em +O código acima resultará em ```html - + ``` -Semelhante ao método [[yii\web\View::registerMetaTag()|registerMetaTags()]], -você pode especificar uma chave quando chamar o método -[[yii\web\View::registerLinkTag()|registerLinkTag()]] para evitar a criação de +Assim como no método [[yii\web\View::registerMetaTag()|registerMetaTags()]], +você também pode especificar uma chave quando chamar o método +[[yii\web\View::registerLinkTag()|registerLinkTag()]] para evitar a criação de tags link repetidas. -## Eventos da View (Visão) +## Eventos da View -[[yii\base\View|Os componentes de view (visão)]] disparam vários eventos durante -o processo de renderização da view (visão). Você pode usar estes eventos para -inserir conteúdos nas views (visões) ou processar os resultados da renderização +[[yii\base\View|Componentes view]] disparam vários eventos durante +o processo de renderização da view. Você pode usar estes eventos para +inserir conteúdo nas views ou processar os resultados da renderização antes de serem enviados para os usuários finais. -- [[yii\base\View::EVENT_BEFORE_RENDER|EVENT_BEFORE_RENDER]]: é disparado no - início da renderização de um arquivo no controlador. Na função deste evento - pode definir a propriedade [[yii\base\ViewEvent::isValid]] como `false` para +- [[yii\base\View::EVENT_BEFORE_RENDER|EVENT_BEFORE_RENDER]]: disparado no + início da renderização de um arquivo em um controller. Funções registradas para esse evento (handlers) podem + definir a propriedade [[yii\base\ViewEvent::isValid]] como `false` para cancelar o processo de renderização. -- [[yii\base\View::EVENT_AFTER_RENDER|EVENT_AFTER_RENDER]]: é disparado depois - da renderização de um arquivo pela chamada do método [[yii\base\View::afterRender()]]. - Na função deste evento pode obter o resultado da renderização por meio da propriedade - [[yii\base\ViewEvent::output]] podendo modifica-lo para alterar o resultado da - renderização. -- [[yii\base\View::EVENT_BEGIN_PAGE|EVENT_BEGIN_PAGE]]: é disparado pela chamada +- [[yii\base\View::EVENT_AFTER_RENDER|EVENT_AFTER_RENDER]]: disparado depois + da renderização de um arquivo pela chamada de [[yii\base\View::afterRender()]]. + Funções registradas para esse evento (handlers) podem capturar o resultado da renderização por meio da propriedade + [[yii\base\ViewEvent::output]] e podem modificá-lo para alterar o resultado final. +- [[yii\base\View::EVENT_BEGIN_PAGE|EVENT_BEGIN_PAGE]]: disparado pela chamada do método [[yii\base\View::beginPage()]] nos layouts. -- [[yii\base\View::EVENT_END_PAGE|EVENT_END_PAGE]]: é disparado pela chamada do +- [[yii\base\View::EVENT_END_PAGE|EVENT_END_PAGE]]: disparado pela chamada do método [[yii\base\View::endPage()]] nos layouts. -- [[yii\web\View::EVENT_BEGIN_BODY|EVENT_BEGIN_BODY]]: é disparado pela chamada +- [[yii\web\View::EVENT_BEGIN_BODY|EVENT_BEGIN_BODY]]: disparado pela chamada do método [[yii\web\View::beginBody()]] nos layouts. -- [[yii\web\View::EVENT_END_BODY|EVENT_END_BODY]]: é disparado pela chamada do +- [[yii\web\View::EVENT_END_BODY|EVENT_END_BODY]]: disparado pela chamada do método [[yii\web\View::endBody()]] nos layouts. Por exemplo, o código a seguir insere a data atual no final do corpo da página: @@ -784,12 +732,10 @@ Por exemplo, o código a seguir insere a data atual no final do corpo da página ## Renderizando Páginas Estáticas -Páginas estáticas referem-se a páginas cujo principal conteúdo é na maior parte -estática, sem a necessidade de acessar conteúdos dinâmicos pelos controllers -(controladores). +Páginas estáticas referem-se a páginas cujo principal conteúdo é, na maior parte, +estático, sem a necessidade de acessar dados dinâmicos provenientes dos controllers. -Você pode produzir páginas estáticas referenciando uma view (visão) no controller -(controlador) conforme o código a seguir: +Você pode retornar páginas estáticas por colocar seu código na view e então, em um controller, usar o código a seguir: ```php public function actionAbout() @@ -798,11 +744,11 @@ public function actionAbout() } ``` -Se o site contiver muitas páginas estáticas, seria um desperdício de tempo repetir -os códigos semelhantes muitas vezes. -Para resolver este problema, poderá introduzir uma -[ação standalone](structure-controllers.md#standalone-actions) chamando a classe -[[yii\web\ViewAction]] em um controller (controlador). Por exemplo, +Se o site contiver muitas páginas estáticas, seria tedioso repetir +os códigos similares muitas vezes. +Para resolver este problema, você pode inserir uma +[action "externa" (standalone action)](structure-controllers.md#standalone-actions) chamando a classe +[[yii\web\ViewAction]] em um controller. Por exemplo: ```php namespace app\controllers; @@ -822,46 +768,42 @@ class SiteController extends Controller } ``` -Agora, se você criar uma view (visão) chamada `about` sob o diretório -`@app/views/site/pages`, será capaz de exibir esta view (visão) conforme a +Agora, se você criar uma view chamada `sobre` no diretório +`@app/views/site/pages`, poderá exibir por meio da seguinte URL: ``` -http://localhost/index.php?r=site/page&view=about +http://localhost/index.php?r=site/page&view=sobre ``` -O parâmetro `view` passado via `GET` informa a classe [[yii\web\ViewAction]] -qual view (visão) será solicitada. A ação, então, irá procurar a view (visão) -sob o diretório `@app/views/site/pages`. Você pode configurar a propriedade -[[yii\web\ViewAction::viewPrefix]] para alterar o diretório onde as views (visões) -serão procuradas. +O parâmetro `view` passado via `GET` informa à classe [[yii\web\ViewAction]] +qual view foi solicitada. A action, então, irá procurar essa view informada +dentro do diretório `@app/views/site/pages`. Você pode configurar a propriedade +[[yii\web\ViewAction::viewPrefix]] para alterar o diretório onde as views +serão procuradas. ## Boas Práticas -As views (visões) são os responsáveis por apresentar modelos no formato que os -usuários finais desejarem. Em geral, as view (visões): - -* devem conter principalmente códigos de apresentação, tais como o HTML e códigos - simples de PHP para formatação, renderização e transferência de dados. -* não devem conter códigos que realiza consultas no banco de dados. Esta - responsabilidade pertence aos models (modelos). -* devem evitar ter acesso direto aos dados de requisição, tais como o `$_GET` e - o `$_POST`. Esta responsabilidade deve pertencer aos controllers (controladores). - Se os dados da requisição forem necessários, deverão ser fornecidas as views (visões) - pelos controllers (controladores). -* poderão ler as propriedades dos models (modelos), mas não podem alterá-las. - -Para views (visões) mais gerenciáveis, evite criar views (visões) muito complexas -ou que contenham muitos códigos redundantes. Você pode usar as seguintes técnicas -para atingir estes objetivos: - -* use os [layouts](#layouts) para representar as seções de apresentação comuns - (por exemplo, cabeçalho e o rodapé). -* divida uma view (visão) complicada em varias outras menores. As views (visões) - menores podem ser renderizadas e montadas em um maior usando os métodos que - descrevemos anteriormente. -* crie e use [widgets](structure-widgets.md) como blocos de construção das views - (visões). -* crie e use as classes helpers para transformar e formatar os dados nas views - (visões). +Views são responsáveis por apresentar models (modelos) no formato que os +usuários finais desejam. Em geral, views: + +* devem conter principalmente código de apresentação, tal como o HTML, e trechos + simples de PHP para percorrer, formatar e renderizar dados. +* não devem conter código de consulta ao banco de dados. Consultas assim devem ser feitas nos models. +* devem evitar acessar diretamente os dados da requisição, tais como `$_GET` e + `$_POST` pois essa tarefa cabe aos controllers. + Se os dados da requisição forem necessários, deverão ser fornecidos às views + pelos controllers. +* podem ler as propriedades dos models, mas não devem alterá-las. + +Para tornar as views mais gerenciáveis, evite criar views muito complexas +ou que contenham muito código redundante. Você pode usar as seguintes técnicas +para atingir este objetivo: + +* use [layouts](#layouts) para representar as seções de apresentação comuns + (por exemplo, cabeçalho e rodapé). +* divida uma view complicada em varias outras menores. As views + menores podem ser renderizadas e montadas em uma maior usando os métodos descritos anteriormente. +* crie e use [widgets](structure-widgets.md) como blocos de construção das views. +* crie e use as classes helper (auxiliares) para transformar e formatar os dados nas views.