As Views são responsáveis pela apresentação dos dados que foram requisitados pelo usuário. Normalmente temos esta saída no formato HTML, mas podendo ser em outros formatos também, assim como xml, Json, criação de pdf’s, dentre outros tipos.

O CakePHP já facilita muito a vida dos desenvolvedores inclusive nesse sentido, onde ele já nos traz classes que servem como modelos para a renderização de nossas informações. O mais comum é para a criação de temas, onde podemos criar vários temas para as nossas views.

Os arquivos responsáveis pela visualização das informações (nossas Views), tem como extensão o “.ctp” que é um template exclusivo do CakePHP. É nesta etapa onde aplicamos toda a lógica necessária para transformar as informações passadas pelo controller em um formato específico para o usuário final.

Nossos arquivos do tipo view são guardados em app/View/( pastas que serão criadas/..), onde aqui vai o caminho do seu diretório que precisa dizer exatamente o caminho que elas terão de acordo com as especificações do CakePHP, onde terá criada uma pasta com o nome do controlador que será utilizado e em seguida, salvar a nossa view com a extensão ctp.

Esta camada pode ser composta por diferentes partes, cada uma com diferentes usabilidades. Estas partes são as views (que é a principal), elements (onde são passados trechos pequenos de código que podem ser reutilizados), layouts (são arquivos da view, mas que contem códigos de apresentação utilizando várias interfaces) e os helpers (que são classes que encapsulam a lógica da view que será utilizada em várias áreas da view). Os helpers nos ajudam a construir formulários, paginações dos dados do model, feeds, dentre outros recursos.

Um pouco mais de views no CakePHP?

No contexto de views, podemos “extender” uma view em outra. Desta forma se torna muito mais fácil o entendimento do código, além de deixa-lo muito mais enxuto. Um exemplo de utilização seria com a criação de um menu, onde dependendo do tipo de usuário seriam apresentadas as suas opções de menu. A partir dessa separação de códigos fica muito mais fácil e eficiente o entendimento e a organização dos arquivos.

Listagem 1: Exemplo de view


// O caminho para este arquivo seria app/View/Teste/view.ctp
<h1><?php echo $this->fetch('title'); ?></h1>
<?php echo $this->fetch('content'); ?>

<div class="actions">
    <h3>Ações relacionadas</h3>
    <ul>
    <?php echo $this->fetch('menu'); ?>
    </ul>
</div>

Este exemplo seria de uma view “pai” que poderia seria estendido por outras views e que definiria os blocos “menu” e “title”. Já o “content” é um bloco especial que o CakePHP cria. Ele conterá todo o código não capturado pela view que o estende. Se no caso, estivéssemos trabalhando com um blog e quiséssemos passar as suas informações utilizando o nosso exemplo “pai”, este ficaria desra forma:

Listagem 2: View posts estendida da view pai.


<?php
// Arquivo de visualização de posts - app/View/Posts/view.ctp
$this->extend('/Teste/view');

// Na variável $post seria passado o título que seria trazido do banco de dados
$this->assign('title', $post);

$this->start('menu');
?>
<li><?php 
          echo $this->Html->link('edit', array('action' => 'edit', $post['Post']['id'])); 
      ?>
</li>
<?php $this->end(); ?>

// O conteúdo restante estará disponível como o bloco `content`
// na view pai.
echo h($post['Post']['body']);

Este é um exemplo simples de como podemos trabalhar com views e completá-las com um grupo de blocos. Qualquer conteúdo que não esteja sendo definido no bloco será automaticamente capturado e colocado no bloco “content” que é um tipo especial.

Quando uma view contém uma chamada para o método extend(), a execução continuará até o fim do arquivo view atual. Quando este for finalizado, a view estendida será renderizada.

Elements

Digamos que em um site apresentemos determinados tipos de informações em várias páginas, sabemos da dificuldade em manter essas páginas atualizadas. Esta é a questão dos elements no CakePHP, assegurar que pequenos blocos de código que serão utilizados em várias páginas seja encontrado em apenas um lugar. Sendo assim, temos a nosso favor a reusabilidade. Alguns exemplos que possamos fazer uso do elements são formulários de login, propagandas, menus, controles de navegação, etc.

Eis que um elemento (element) é basicamente uma mini-view que pode ser utilizada em outras views, layouts e também podendo ser utilizadas em outros elements. Eles servem para deixar a nossa view mais limpa, mais legível e de fácil manutenção. Os elements são colocados na pasta /app/View/Elements/ e assim como uma view, possui a extensão “.ctp”. a forma de chamarmos um elemento através de uma view é utilizando o método da view da seguinte forma:

Listagem 3: Chamada de um arquivo elemento (element) numa view.


<?php
     echo $this->element(‘formulario’);
?>

O método element() da view, suporta opções como cache e call-backs também. No caso do cache, ele é facilitado através de uma classe de Cache existente no CakePHP. Podemos com isso definir configurações de cache para os elements de formas diferentes de acordo com a prioridade de cada arquivo.

Blocks

O tipo de view blocks pode substituir $scripts_for_layout e prover uma API flexível que permite a definição de trechos de código em suas views/layouts que poderão ser definidas em qualquer lugar de sua página. Um exemplo para isso seria a utilização de um bloco de código para sidebars, rodapés, cabeçalhos, etc. Seriam utilizados os blocos para apresentar informações que fossem padrão para todo o site ou sistema. Para trabalhar com blocos, podemos utilizar os métodos start(), append() e o end().

Como dito, os blocos (blocks) substituem os layouts do tipo de variável $scripts_for_layout. O HtmlHelper possui laços para a possibilidade de utilização dos views blocks, onde além da utilização de arquivos .ctp (próprias views) possamos utilizar estruturas de css e de script, dentre outras possibilidades.

Abaixo segue um trecho de código onde estamos apresentando como seria a chamada desses blocos de código numa view e também num layout.

Listagem 4: Chamada de blocos (blocks) numa view


<?php
     echo $this->Html->css('style/estilo');
     echo $this->Html->script('jquery.min');
?> 

Observem que não foram passadas as extensões .css e nem .js no caso acima, isso devido a interpretação pelo HtmlHelper. Podemos utilizar o método fetch() para apresentar os blocos num layout também.

Layouts

Um layout apresenta contém um código de apresentação quem envolve uma view. O que quer dizer que se você quiser criar uma simples página tratada como padrão para um determinado fim, você poderá utilizá-lo, assim como também pode utilizá-lo como um trecho de código que seja apresentado em várias views.

O caminho para os arquivos de layout é o /app/View/Layouts. Dentro da pasta já existem um arquivo padrão que é o default.ctp, mas que pode ser alterado conforme a nossa vontade.

Listagem 5: Modelo padrão de um layout


<!DOCTYPE html>
<html>
<head>
<title><?php echo $title_for_layout?></title>

<!-Abaixo temos a inclusão de scripts e arquivos externos (Podemos ver mais sobre o helper HTML para um melhor entendimento em http://book.cakephp.org/2.0/en/) -->

<?php
   echo $this->fetch('meta');
   echo $this->fetch('css');
   echo $this->fetch('script');
?>
</head>
<body>

<!-- Se você quiser exibir algum menu em todas as suas views, inclua-o aqui -->
<div id="header">
    <div id="menu">...</div>
</div>

<!-- Aqui é onde serão exibidas as views que quisermos -->
<?php echo $this->fetch('content'); ?>

<!-- Adicionar um rodapé para cada página exibida -->
<div id="footer">...</div>

</body>
</html>

A variável $title_for_layout contém o título da página que será visualizada, esta variável é gerada automaticamente, mas você poderá sobrescrevê-la definindo-a no próprio controlador.

Listagem 6: Controlador de posts


class PostsController extends AppController {
    public function index() {
        $this->set('title_for_layout', 'Post de exemplo');
    }
}

O bloco “conntent” é utilizado para dizer ao cake aonde será colocado o código das nossas views. Para isso, é bom que tenhamos no nosso layout um lugar reservado para o uso do $this->fetch(‘content’).

Para mais informações com relação a views, visitem a página http://book.cakephp.org/2.0/en/views.html , nela estão sendo apresentados alguns exemplos e mais informações referente a views.

Conclusão

Neste artigo, buscamos apresentar informações básicas para que vocês tenham um entendimento teórico sobre a utilização das variadas formas de views existentes no CakePHP e de que forma elas facilitam a nossa vida.

Até mais!