Visão ==== Uma visão é um script em PHP contendo, principalmente, elementos da interface com usuário. Ela pode ter comandos em PHP, mas é recomendado que tais comandos não alterem dados em modelos e sejam simples. De acordo com a idéia da separar a lógica da programação, lógicas complexas devem ser colocadas no controle ou no modelo em vez da visão. Uma visão tem um nome que é utilizado para identificar seu arquivo de script no momento da renderização. O nome da visão é o mesmo de seu arquivo. Por exemplo, a visão `edit` refere-se ao arquivo denominado `edit.php`. Para renderizar uma visão, execute [CController::render()] informando o nome da visão. O método irá procurar pelo arquivo correspondente no diretório `protected/views/ControllerID`. Dentro do arquivo da visão, podemos acessar a instância do controle a partir da variável `$this`. Dessa forma, podemos `acessar` qualquer propriedade do controle utilizando `$this->nomeDaPropriedade` dentro da visão. Podemos também `inserir` dados na visão da seguinte maneira: ~~~ [php] $this->render('edit', array( 'var1'=>$value1, 'var2'=>$value2, )); ~~~ No código acima, o método [render()|CController::render] irá extrair os valores do vetor, passado no segundo parâmetro, para variáveis. Como resultado, dentro do script da visão poderemos acessar as variáveis locais `$var1` e `$var2`. Layout ------ O Layout é uma visão especial, utilizada para decorar outras visões. Normalmente ele contém partes da interface que são comuns entre diversas visões. Por exemplo, um layout pode conter um cabeçalho e um rodapé e inserir o conteúdo de uma visão entre eles: ~~~ [php] ......cabeçalho aqui...... ......rodapé aqui...... ~~~ No trecho acima `$content` contém o conteúdo renderizado da visão. O Layout é implicitamente aplicado ao executar o método [render()|CController::render]. Por padrão, a visão localizada em `protected/views/layouts/main.php` é utilizada como layout. No entanto, isso pode ser personalizado modificando a propriedade [CWebApplication::layout] ou [CController::layout]. Para renderizar uma visão sem aplicar um layout, utilize o método [renderPartial()|CController::renderPartial]. Widget ------ Um widget é uma instância da classe [CWidget], ou de suas classes derivadas. É um componente utilizado principalmente para apresentação. Widgets normalmente são utilizados dentro do código de uma visão para gerar elementos complexos, porém independentes. Por exemplo, um widget pode ser utilizado para renderizar um complexo calendário. Widgets adicionam melhor reutilização na interface com o usuário. Para utilizar um widget, faça o seguinte na sua visão: ~~~ [php] beginWidget('path.to.WidgetClass'); ?> ...conteúdo que deve aparecer no corpo do widget... endWidget(); ?> ~~~ ou ~~~ [php] widget('path.to.WidgetClass'); ?> ~~~ A última forma apresentada é utilizada quando o widget não necessita de conteúdo. Os Widgets podem ter seus comportamentos personalizados. Para isso, configure os valores iniciais de suas propriedades ao executar [CBaseController::beginWidget] ou [CBaseController::widget]. Por exemplo, quando utilizamos o widget [CMaskedTextField], podemos especificar a máscara que será utilizada. Para isso, passamos para o método um vetor onde as chaves são os nomes das propriedades e os valores são os valores iniciais desejados, como no trecho de código a seguir: ~~~ [php] widget('CMaskedTextField',array( 'mask'=>'99/99/9999' )); ?> ~~~ Para definir um novo widget, extenda a classe [CWidget] e sobrescreva os métodos [init()|CWidget::init] e [run()|CWidget::run]. ~~~ [php] class MyWidget extends CWidget { public function init() { // esse método é chamado por CController::beginWidget() } public function run() { // esse método é chamado por CController::endWidget() } } ~~~ Assim como um controle, um widget também pode ter uma visão. Por padrão, os arquivos de visão de um widget estão localizados no diretório `views`, dentro do diretório onde está localizado o arquivo de classe do widget. Essas visões podem ser renderizadas executando-se o método [CWidget::render()], assim como o método de mesmo nome existente no controle. A única diferença entre eles é que nenhum layout será aplicado a visão do widget. Além disso, nessa view, `$this` refere-se a instância do widget em vez da instância do controller. > Tip|Dica: [CWidgetFactory::widgets] pode ser utilizado para configurar widgets em todo o site, > possibilitando a configuração com mais facilidade. Você pode encontrar mais detalhes em > [página de temas](/doc/guide/topics.theming#customizing-widgets-globally) Visão do Sistema (System View) ------------------------------ Visões do sistema são as visões utilizadas pelo Yii para exibir informações sobre erros e logs. Por exemplo, quando um usuário requisita uma ação ou controle não existente, o Yii irá lançar uma exceção explicando o erro ocorrido. Esse erro é exibido utilizando uma visão do sistema. A nomeclatura das visões do sistema seguem algumas regras. Nomes no formato `errorXXX` referem-se à visões utilizadas para exibir erros gerados com a exceção [CHttpException], onde `XXX` é o código do erro. Por exemplo, se uma [CHttpException] é gerada com o código de erro 404, a visão `error404` será exibida. O Yii framework já possui um conjunto padrão de visões do sistema, localizadas em `framework/views`. Elas podem ser personalizadas criando-se visões com o mesmo nome que as originais em `protected/views/system`.