Visão PHP


1Apresentação

A visão PHP permite usar templates escritos em PHP puro.

Essa visão não requer nenhuma biblioteca externa. Os arquivos de template são simples arquivos PHP que são incluídos no momento da renderização.

As variáveis de template são disponibilizadas como variáveis PHP diretamente acessíveis nos templates.

Para usar essa visão, declare-a como a visão padrão no arquivo de configuração etc/temma.php:

<?php

return [
    'application' => [
        'defaultView' => '\Temma\Views\Php',
    ]
];

2Arquivos de template e inclusão

Os arquivos de template são simples arquivos PHP, que contêm código HTML misturado com instruções PHP.

Você pode segmentar suas páginas incluindo outros arquivos PHP usando as instruções include ou require.
Por exemplo, suponha que você tenha duas ações, list e show, que exibem páginas diferentes usando os arquivos list.php e show.php, respectivamente. Se essas duas páginas exibem o mesmo cabeçalho de página, é melhor separá-lo para não ter que copiá-lo em cada página.

Assim, você poderia ter o arquivo header.php, que ficaria assim:

<html>
<head>
    <title>Título genérico de página</title>
</head>
<body>

Nossos dois templates de página ficariam então assim:

<!-- arquivo list.php -->
<?php include('header.php'); ?>

<h1>LISTA</h1>

</body>
<!-- arquivo show.php -->
<?php include('header.php'); ?>

<h1>EXIBIR CONTEÚDO</h1>

</body>

3Variáveis

As variáveis de template definidas no controlador são diretamente acessíveis nos templates como variáveis PHP.
Imagine que o controlador contenha o seguinte código:

$this['name'] = 'Anakin';

Você pode exibir o valor da variável name no seu template:

<?=$name?>

Isso terá o efeito de exibir o seguinte texto:

Anakin

Por padrão, todas as variáveis de template (que não começam com um underscore) são disponibilizadas como variáveis PHP globais. Também é possível definir uma variável de template @output contendo um array associativo; nesse caso, apenas os pares chave-valor desse array serão definidos como variáveis globais.


4Listas

Digamos que seu controlador defina uma variável de template contendo uma lista:

$this['fruits'] = [
    'laranja',
    'banana',
    'morango',
];

Você pode facilmente exibir qualquer um dos valores da lista:

<?=$fruits[2]?>

E você obterá:

morango

5Arrays associativos e objetos

É possível exibir o conteúdo de um elemento de um array associativo a partir de sua chave, ou de um atributo de um objeto a partir de seu nome. Por exemplo:

$this['colors'] = [
    'red'   => '#ff0000',
    'green' => '#00ff00',
    'blue'  => '#0000ff',
];

Para exibir uma cor, basta escrever:

<?=$colors['red']?>

O que resultará em:

#ff0000

6Condições

Para fazer processamento condicional, você usa as instruções if / else do PHP.

Por exemplo, se o seu controlador definir uma variável de template contendo informações de um usuário:

$user = $this->_dao->get($userId);
$this['user'] = $user;

Você poderá então exibir um link apenas se o usuário for um administrador:

<?php if ($user['roles']['admin']): ?>
    <a href="/user/show/<?=$user['id']?>">Ver minha conta</a>
<?php endif; ?>

Ou:

<?php if ($user['roles']['admin']) { ?>
    <a href="/user/show/<?=$user['id']?>">Ver minha conta</a>
<?php } ?>

7Laços

Frequentemente, você precisa aplicar um processamento a um grupo de itens. Isso geralmente toma a forma de uma lista de itens recuperados do banco de dados, que você deseja exibir um após o outro.
Para isso, você usa a instrução foreach do PHP.

Imagine que o controlador recupere uma lista de usuários do banco de dados:

$users = $this->_dao->search();
$this['users'] = $users;

É muito fácil percorrer todos os usuários para exibir seus nomes:

<ul>
    <?php foreach ($users as $user): ?>
        <li><?=$user['name']?></li>
    <?php endforeach; ?>
</ul>

Ou:

<ul>
    <?php foreach ($users as $user) { ?>
        <li><?=$user['name']?></li>
    <?php } ?>
</ul>

8Escapamento

Ao contrário da visão Smarty, a visão PHP não fornece auto-escape das variáveis. Se uma variável contiver caracteres especiais ("<", ">", "&", ...), você não deve escrevê-la tal como está no template, caso contrário você gerará um fluxo HTML não compatível ou uma vulnerabilidade de segurança XSS.

Para escapar caracteres especiais, você deve usar a função PHP htmlspecialchars():

<!-- escaped variable -->
<?=htmlspecialchars($name)?>

<!-- non-escaped variable (use only if content is trusted) -->
<?= $name ?>

É recomendável escapar sistematicamente todas as variáveis exibidas nos templates, por exemplo usando uma função utilitária:

<?php
function e($value) {
    return htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
}
?>
<p><?=e($name)?></p>
<p><?=e($email)?></p>