Vistas
1Presentación
La vista es la capa de software que se encarga de dar formato a los datos que devuelve el servidor tras el procesamiento.
Por defecto, Temma utiliza el motor de templates Smarty, lo que facilita mucho la generación de páginas HTML a partir de los datos exportados por los controladores.
Temma también ofrece de forma nativa una vista utilizada para generar flujos JSON, lo que puede resultar muy práctico en el contexto de comunicaciones AJAX, así como vistas que ofrecen exportaciones CSV, RSS, INI e iCal.
2Uso de una vista con template
Algunas vistas utilizan templates para procesar los datos y generar los flujos de salida. Como se vio en la introducción, Temma buscará un archivo cuyo nombre corresponda al de la acción solicitada (con la extensión ".tpl"), ubicado en un directorio cuyo nombre es el del controlador en ejecución; todo ello dentro del directorio templates/ del proyecto.
Para evitar este comportamiento automático, una acción puede especificar el template que se debe usar:
class User extends \Temma\Web\Controller {
public function list($type=null) {
// procesamientos...
// redefinición del template en un caso particular
if ($type == 'all')
$this->_template('user/listAll.tpl');
// en los demás casos, el template será "user/list.tpl"
}
}
3Definición de la vista
Es posible especificar la vista que se debe usar, de forma individual para cada acción.
Aquí tienes un ejemplo de una acción cuyos datos se exportan en formato JSON:
class User extends \Temma\Web\Controller {
public function get($id) {
// procesamientos...
// define los datos que se enviarán
// en el flujo JSON
$this['json'] = $data;
// definición de la vista utilizada
$this->_view('\Temma\Views\Json');
}
}
Cuando la vista utilizada es una vista estándar (proporcionada por Temma), es posible abreviar su escritura usando el carácter tilde (~) para reemplazar el prefijo \Temma\Views\:
class User extends \Temma\Web\Controller {
public function get($id) {
// procesamientos...
$this->_view('~Json');
}
}
Temma también ofrece el atributo \Temma\Attributes\View, que facilita definir la vista que se debe usar para todas las acciones de un controlador y/o para acciones específicas:
use \Temma\Attributes\View as TµView;
// controlador que usa la vista JSON por defecto
#[TµView('~Json')]
class User extends \Temma\Web\Controller {
// acción que usa la vista JSON definida a nivel del controlador
public function get($id) {
// procesamientos...
}
// acción que usa específicamente la vista RSS
#[TµView('~Rss')]
public function stream() {
// procesamientos...
}
}
4Transmisión de datos a la vista
Para transmitir datos a la vista, existen dos comportamientos básicos:
- Para las vistas basadas en template (Smarty y PHP), todas las variables de template definidas previamente (con $this['variable'] = $value;) se transmiten al template, siempre que el nombre de la variable no empiece con un guion bajo (con la notable excepción de las variables flash, cuyo nombre empieza con dos guiones bajos).
- Otras vistas esperan una o varias variables de template específicas de cada vista (json, csv, data, ical).
Ejemplos:
class User extends \Temma\Web\Controller {
// uso de la vista Smarty por defecto
public function get(int $id) {
// procesamientos...
// uso de variables de template independientes
$this['user'] = $user;
$this['activity'] = $activity;
}
// uso de la vista JSON
#[TµView('~Json')]
public function getActivity(int $id) {
// procesamientos...
// uso de la variable de template "json"
$this['json'] = $activity;
}
}
También es posible definir los datos que se transmiten a la vista asignándolos a la variable de template
@output. Si esta variable está definida, la vista la utiliza de forma prioritaria
en lugar de la variable específica de la vista.
Para las vistas basadas en template (Smarty y PHP), si @output está definida, debe contener un
array asociativo cuyos pares clave-valor se utilizarán como variables de template.
Si @output no está definida, se conserva el comportamiento habitual.
Ejemplos:
class User extends \Temma\Web\Controller {
// uso de la vista Smarty por defecto
public function get($id) {
// procesamientos...
// definición de variables de template mediante @output
$this['@output'] = [
'user' => $user,
'activity' => $activity,
];
}
// uso de la vista JSON
#[TµView('~Json')]
public function getActivity(int $id) {
// procesamientos...
// los datos se transmiten a la vista mediante @output
$this['@output'] = $activity;
}
}
5Configuración de la vista por defecto
Tienes la posibilidad de cambiar la vista por defecto, modificando el archivo de configuración etc/temma.php.
Por ejemplo, si creas un webservice, nunca vas a enviar HTML, sino siempre JSON. Entonces querrás usar la vista \Temma\Views\Json en lugar de la vista Smarty habitual; para ello debes añadir la directiva defaultView en el archivo etc/temma.php:
<?php
return [
'application' => [
// configuración habitual (dsn, defaultController, ...)
// configuración de la vista por defecto
'defaultView' => '\Temma\Views\Json'
]
];
Como se ha visto antes, es posible reemplazar el prefijo \Temma\Views\ por el carácter tilde (~):
<?php
return [
'application' => [
// configuración de la vista por defecto
'defaultView' => '~Json'
]
];
6Configuración de los encabezados HTTP por defecto
En el archivo de configuración etc/temma.php, puedes especificar los encabezados HTTP que se deben enviar con cada respuesta, listándolos con la clave default en la configuración extendida x-headers. Se pueden escribir como pares clave-valor o como cadenas que contienen el nombre del encabezado y su valor:
<?php
return [
'x-headers' => [
// encabezados HTTP por defecto
'default' => [
'Cache-Control' => 'no-cache',
'Sec-Purpose: prefetch',
]
]
];