Skip to content

Vistas y Layout

Technomantus Corvi edited this page Sep 5, 2026 · 1 revision

Vistas y layout

Las vistas son archivos PHP puros bajo views/. Siempre se renderizan dentro del layout compartido (includes/head.php + contenido de la vista + includes/footer.php).

// Controlador
$this->view('article/show', [
    'title'   => 'Detalle del artículo',
    'article' => $article,
]);
<!-- views/article/show.php -->
<h1><?= e($article['title']) ?></h1>
<p><?= e($article['body']) ?></p>

Regla de oro: usa siempre e() para imprimir datos. Nunca echo $var directamente — así es como se cuela el XSS.

Qué está disponible dentro de cada vista

  • $uri — el path actual normalizado, inyectado automáticamente por view(). Lo usa head.php para resaltar el ítem de navegación activo.
  • Cualquier clave que pases en el array $data a view() o $this->view().
  • Todos los helpers globales (e(), url(), old(), t(), flash(), etc.), al ser funciones normales.

Estilos y assets

Todos los estilos compartidos viven en public/assets/css/app.css, cargado una sola vez desde head.php. Evita atributos style="..." inline en vistas nuevas — añade una clase a app.css en su lugar, para que todo el proyecto se mantenga visualmente coherente y personalizable desde un solo archivo.

public/assets/js/app.js por ahora solo hace desaparecer los mensajes flash automáticamente a los 5 segundos y controla el dropdown del menú de usuario (si tanuki_login está activo). Añade nuevo comportamiento interactivo ahí, en vez de bloques <script> inline en las vistas.

El nav

config/nav.php declara las entradas mostradas en includes/head.php:

return [
    ['label' => 'nav.home', 'href' => '/',      'match' => '/'],
    ['label' => 'nav.about', 'href' => '/about', 'match' => '/about'],
];

label es una clave de traducción resuelta a través de t() — ver Internacionalización. match decide cuándo el ítem recibe la clase active (coincidencia exacta para /, coincidencia de prefijo para el resto).

Mensajes flash

$this->flash('success', '¡Tarea creada!');
$this->redirect('/todo');

head.php lee y muestra una vez cualquier mensaje flash pendiente (success/error/warning), y luego se elimina — app.js lo hace desvanecerse automáticamente a los 5 segundos.

Páginas de error

views/errors/404.php, 500.php, 503.php — PHP puro, con estilos mediante clases .error-page en app.css. App::configureErrors() muestra la excepción detallada en su lugar cuando APP_DEBUG=true.

Flujo de renderizado (qué hace view())

view($nombre, $data)
  │
  ├── extract($data)              → hace disponible $title, etc.
  ├── ob_start() + require vista  → captura el HTML de la vista en un buffer
  ├── require includes/head.php   → tiene acceso a $title, $uri (del extract)
  ├── echo del contenido capturado
  └── require includes/footer.php

Clone this wiki locally