Herança (extensão) de Views e Blocos no CakePHP

Fala pessoal, tudo bom?

Estou aqui para falar sobre extensão de views (view extending) e uso de blocos (view blocks) no CakePHP, você conhece?

Essas funcionalidades - que lembra muito o sistema de templates do Django - foram incluídas na versão 2.1 do Cake, por isso se você ainda está usando a versão 2.0, 1.3 ou alguma anterior não perca tempo para migrar para a última, pois só essa nova feature já vale a pena (sem falar de outras..).

Extensão de View

Vamos supor que tenhamos uma view responsável por listar os carros cadastrados no sistema, ela simplesmente percorre todos os registros e exibe em uma lista.

<!-- View/Cars/list.ctp -->
<ul>
  <?php foreach($cars as $c): ?>
  <li><?php echo $c['Car']['name'] ?></li>
  <?php endforeach ?>
</ul>

Agora imagine que precisamos exibir a mesma listagem na página inicial do site, ao invés de repetirmos código, podemos extender a view acima e já teremos o que precisamos, veja como ficaria:

<!-- View/Home/index.ctp -->
<h1>Seja bem vindo</h1>

<?php $this->extend('/Cars/list'); ?>

Pronto, dissemos ao Cake para extender a view list.ctp, agora tudo o que estiver nela também estará na home.

Usando Blocos de View

Suponha que você tenha uma região no layout de seu site que em cada view possuirá um conteúdo diferente, você pode utilizar blocos de view para isso, ao invés de ter que verificar qual página está para definir o conteúdo, veja:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<!-- View/Layouts/default.ctp -->
<html>
<head>
<?php echo $this->Html->charset(); ?>
<title>
  Blog
</title>
<?php
echo $this->Html->css('cake.generic');

echo $this->fetch('css');
echo $this->fetch('script');
?>
</head>
<body>
<div id="container">
  <div id="header">
  </div>
  <div id="content">

    <?php echo $this->Session->flash(); ?>

    <?php echo $this->fetch('content'); ?>

    <div id="section-1">
      <?php echo $this->fetch('section-1') ?>
    </div>

  </div>
  <div id="footer">
  </div>
</div>
</body>
</html>

Acima vemos o código de nosso layout, na linha 27 definimos um bloco chamado section-1, por enquanto apenas estamos exibindo o conteúdo dele (que ainda é vazio).

Vamos iniciar o bloco section-1 criado no layout e definir um conteúdo para ele na view index.ctp:

<!-- View/Home/index.ctp -->
<h1>Seja bem vindo</h1>

<?php $this->start('section-1'); ?>
  <h2>Categorias</h2>
<?php $this->end() ?>

Agora na view about.ctp:

<!-- View/Home/about.ctp -->
<h1>Sobre</h1>

<?php $this->start('section-1'); ?>
  <h2>Quem somos</h2>
<?php $this->end() ?>

Viu? O bloco section-1 está recebendo conteúdo diferente em cada view, na primeira definimos <h2>Categorias</h2> e na segunda definimos <h2>Quem somos</h2>. Isso é fantástico pois podemos setar conteúdos diferentes na mesma região sem nenhuma dor de cabeça.

É só isso pessoal, bem simples mas muito útil, o que vocês acharam?

Até mais.

Written on October 26, 2012

Share: