Views
1Apresentação
A view é a camada de software responsável por formatar os dados retornados pelo servidor após o processamento.
Por padrão, o Temma usa o motor de templates Smarty, que facilita muito a geração de páginas HTML a partir dos dados exportados pelos controladores.
O Temma também oferece nativamente uma view usada para gerar feeds JSON, o que pode ser muito prático no contexto de comunicações AJAX, além de views que oferecem exportações CSV, RSS, INI e iCal.
2Usando uma view com template
Algumas views usam templates para processar os dados e gerar os fluxos de saída. Como visto na introdução, o Temma procurará um arquivo cujo nome corresponda ao da ação solicitada (com a extensão ".tpl"), localizado em um diretório cujo nome é o do controlador em execução; tudo isso dentro do diretório templates/ do projeto.
Para contornar esse comportamento automático, uma ação pode especificar o template a ser usado:
class User extends \Temma\Web\Controller {
public function list($type=null) {
// processamentos...
// redefinindo o template em um caso particular
if ($type == 'all')
$this->_template('user/listAll.tpl');
// nos demais casos, o template será "user/list.tpl"
}
}
3Definição da view
É possível especificar a view a ser usada, individualmente para cada ação.
Aqui está um exemplo de uma ação cujos dados são exportados no formato JSON:
class User extends \Temma\Web\Controller {
public function get($id) {
// processamentos...
// define os dados que serão enviados
// no fluxo JSON
$this['json'] = $data;
// definição da view usada
$this->_view('\Temma\Views\Json');
}
}
Quando a view usada é uma view padrão (fornecida pelo Temma), é possível abreviar sua escrita usando o caractere til (~) para substituir o prefixo \Temma\Views\:
class User extends \Temma\Web\Controller {
public function get($id) {
// processamentos...
$this->_view('~Json');
}
}
O Temma também oferece o atributo \Temma\Attributes\View, que facilita a definição da view a ser usada para todas as ações de um controlador e/ou para ações específicas:
use \Temma\Attributes\View as TµView;
// controlador que usa a view JSON por padrão
#[TµView('~Json')]
class User extends \Temma\Web\Controller {
// ação que usa a view JSON definida no nível do controlador
public function get($id) {
// processamentos...
}
// ação que usa especificamente a view RSS
#[TµView('~Rss')]
public function stream() {
// processamentos...
}
}
4Transmitindo dados para a view
Para transmitir dados para a view, existem dois comportamentos básicos:
- Para views baseadas em template (Smarty e PHP), todas as variáveis de template previamente definidas (com $this['variable'] = $value;) são passadas para o template, desde que o nome da variável não comece com um sublinhado (com a notável exceção das variáveis flash, cujo nome começa com dois sublinhados).
- Outras views esperam uma ou mais variáveis de template específicas da view (json, csv, data, ical).
Exemplos:
class User extends \Temma\Web\Controller {
// usando a view Smarty padrão
public function get(int $id) {
// processamentos...
// usando variáveis de template separadas
$this['user'] = $user;
$this['activity'] = $activity;
}
// usando a view JSON
#[TµView('~Json')]
public function getActivity(int $id) {
// processamentos...
// usando a variável de template "json"
$this['json'] = $activity;
}
}
Também é possível definir os dados a serem transmitidos para a view atribuindo-os à
variável de template @output. Se essa variável estiver definida, a view a usa em prioridade
em vez da variável específica da view.
Para views baseadas em template (Smarty e PHP), se @output estiver definido, ele deve conter um
array associativo cujos pares chave-valor serão usados como variáveis de template.
Se @output não estiver definido, o comportamento usual é preservado.
Exemplos:
class User extends \Temma\Web\Controller {
// usando a view Smarty padrão
public function get($id) {
// processamentos...
// definindo variáveis de template via @output
$this['@output'] = [
'user' => $user,
'activity' => $activity,
];
}
// usando a view JSON
#[TµView('~Json')]
public function getActivity(int $id) {
// processamentos...
// os dados são transmitidos para a view via @output
$this['@output'] = $activity;
}
}
5Configuração da view padrão
Você tem a possibilidade de alterar a view padrão, modificando o arquivo de configuração etc/temma.php.
Por exemplo, se você criar um webservice, nunca enviará HTML, mas sempre JSON. Você então vai querer usar a view \Temma\Views\Json em vez da view Smarty usual; para isso, é preciso adicionar a diretiva defaultView no arquivo etc/temma.php:
<?php
return [
'application' => [
// configuração usual (dsn, defaultController, ...)
// configuração da view padrão
'defaultView' => '\Temma\Views\Json'
]
];
Como visto acima, é possível substituir o prefixo \Temma\Views\ pelo caractere til (~):
<?php
return [
'application' => [
// configuração da view padrão
'defaultView' => '~Json'
]
];
6Definindo cabeçalhos HTTP padrão
No arquivo de configuração etc/temma.php, você pode especificar os cabeçalhos HTTP a serem enviados com cada resposta, listando-os com a chave default na configuração estendida x-headers. Eles podem ser escritos como pares chave-valor ou como strings contendo o nome do cabeçalho e seu valor:
<?php
return [
'x-headers' => [
// cabeçalhos HTTP padrão
'default' => [
'Cache-Control' => 'no-cache',
'Sec-Purpose: prefetch',
]
]
];