9 – Detalhes sobre Views
Eu gosto do impossível porque lá a concorrência é menor.
Walt Disney
As Views representam o V de MVC. Elas são responsáveis por gerar a saída específica para a requisição do usuário. Geralmente a saída é em HTML, mas também pode ser em XML, JSON, PDF e outras.
O CakePHP conta com uma grande quantidade de classes embutidas para manipulação o mais comum dos cenários a renderizar:
- Para criar webservers XML ou JSON que podemos usar nas views
- Para servir arquivos protegidos, ou arquivos gerados dinamicamente
- Para criar múltiplas views com templates
A AppView
A classe AppView é a classe View default. Em si ela estende a classe View e é definida em src\View\AppView.php assim:
<?php namespace App\View; use Cake\View\View; class AppView extends View { }
Podemos usar AppView para carregar Helper (no método initialize()), mas geralmente os helpers criados e adicionados a src\View\Helper já ficam automaticamente disponíveis para as views dos templates.
Views Template
A camada de views do CakePHP é a forma de nos comunicarmos com o usuário da aplicação.
A extensão default das views é .ctp (CakePHP Template) e utiliza uma sintaxe alternativa em PHP para estruturas de controle e saída. Estes arquivos contem a lógica necessária para preparar os dados recebidos do controller no formato de apresentação que está pronto para a nossa audiência.
O CakePHP espera que os nossos templates sigam a convenção de nomenclatura onde o nome do template é a versão minúscula e grifada do nome do respectivo action do controller.
Partes de uma View
A camada View no CakePHP pode ser formada por algumas partes. Cada parte tem diferentes usos e será coberta neste tutorial:
- templates: Templates são a parte da página que é única para o action começar a rodar;
Elas são a parte principal da resposta do aplicativo. Arquivos de template do CakePHP são armazenados em src/Template dentro de uma pasta com o nome do controller correspondente e com extensão .ctp.
https://book.cakephp.org/3.0/en/views.html#view-templates
- elements: pequenos, reusáveis pedaços de código da view. Elements geralmente são renderizados dentro da view. Documentação oficial:
http://book.cakephp.org/3.0/en/views.html#elements
- layouts: são arquivos de templates que contém código de apresentação que envolve muitas interfaces na sua aplicação. Muitas views são renderizadas dentro de um layout. Os layouts incorporam templates: index, add, edit, login, etc.
Um layout é um conjunto de códigos encontrado ao redor das views. Múltiplos layouts podem ser definidos, e você pode alterar entre eles, mas agora, vamos usar o default, localziado em src/Template/Layout/default.ctp.
http://book.cakephp.org/3.0/en/views.html#layouts
- helpers: estas classes encapsulam lógica de views que são necessárias em muitos lugares na camada view. Entre outras coisas os helpers no CakePHP podem ajudar você a construir forms, criar funcionalidade AJAX, paginar modelo de dados, etc.
http://book.cakephp.org/3.0/en/views/helpers.html
- cells: estas classes oferecem uma miniatura tipo as características dos controllers para a criação de componentes UI auto contidos. Veja a documentação para mais informações:
http://book.cakephp.org/3.0/en/views/cells.html
Dicas sobre Views
Título do Aplicativo
- Adicionar ao AppController.php:
function beforeFilter(Event $event){
$this->set('title_for_layout','Controle de Finanças Pessoais');
}
- Será usado no Layout/default.ctp, aqui assim:
<title>
<?= $cakeDescription ?>:
<?php echo $title_for_layout;?>
</title>
E no body
…
<li class="name">
<h1><a href="/portal/"><?php echo $title_for_layout;?></a></h1>
</li>
Isso mostrará no title do navegador a variável $title_for_layout definida no AppController e também no body, no h1.
Trocando campo do tipo text por select:
$options = array(''=>'Selecione','colegioelias' => 'Colégio do Elias', 'eliasmesada'=>'Elias Mesada','eliasmerenda'=>'Elias Merenda','meire' => 'Meire Salário', 'coelce'=>'COELCE', 'condominio'=>'Condomínio Ferreira', 'gvt'=>'GVT', 'carnes'=>'Carnes','mercantil'=>'Mercantil','almoco'=>'Almoço Trabalho','passagens'=>'Passagens','remedio'=>'Remédio');
Usando o $options:
echo $this->Form->input('descricao', array('type'=>'select','label' => 'Descrição da Despesa','options' => $options,'default'=>'0'));
Algumas views típicas:
<!-- File: src/Template/Articles/add.ctp -->
<h1>Add Article</h1>
<?php
echo $this->Form->create($article);
echo $this->Form->control('title');
echo $this->Form->control('body', ['rows' => '3']);
echo $this->Form->button(__('Save Article'));
echo $this->Form->end();
?>
<!-- File: src/Template/Articles/edit.ctp -->
<h1>Edit Article</h1>
<?php
echo $this->Form->create($article);
echo $this->Form->control('title');
echo $this->Form->control('body', ['rows' => '3']);
echo $this->Form->button(__('Save Article'));
echo $this->Form->end();
?>
<!-- File: src/Template/Articles/view.ctp -->
<h1><?= h($article->title) ?></h1>
<p><?= h($article->body) ?></p>
<p><small>Created: <?= $article->created->format(DATE_RFC850) ?></small></p>
<!-- File: src/Template/Articles/index.ctp (edit links added) -->
<!-- File: src/Template/Articles/index.ctp (delete links added) -->
<h1>Blog articles</h1>
<p><?= $this->Html->link('Add Article', ['action' => 'add']) ?></p>
<table>
<tr>
<th>Id</th>
<th>Title</th>
<th>Created</th>
<th>Actions</th>
</tr>
<!-- Here's where we loop through our $articles query object, printing out article info -->
<?php foreach ($articles as $article): ?>
<tr>
<td><?= $article->id ?></td>
<td>
<?= $this->Html->link($article->title, ['action' => 'view', $article->id]) ?>
</td>
<td>
<?= $article->created->format(DATE_RFC850) ?>
</td>
<td>
<?= $this->Form->postLink(
'Delete',
['action' => 'delete', $article->id],
['confirm' => 'Are you sure?'])
?>
<?= $this->Html->link('Edit', ['action' => 'edit', $article->id]) ?>
</td>
</tr>
<?php endforeach; ?>
</table>
<!-- File: src/Template/Users/login.ctp -->
<div class="users form">
<?= $this->Flash->render() ?>
<?= $this->Form->create() ?>
<fieldset>
<legend><?= __('Please enter your username and password') ?></legend>
<?= $this->Form->control('username') ?>
<?= $this->Form->control('password') ?>
</fieldset>
<?= $this->Form->button(__('Login')); ?>
<?= $this->Form->end() ?>
</div>
Detalhes em
http://book.cakephp.org/3.0/en/views.html
Comments fornecido por CComment