Modificaciones de Menú y Layout en Aplicación Web con G

Clase 34 de 35Curso de Desarrollo Web con PHP y Yii2

Contenido del curso

Modelos, vistas y controladores

Enlaces, navegación y tablas intermedias

Resumen

Construir una aplicación web funcional con Yii implica mucho más que escribir código: se trata de dominar pequeños ajustes que transforman la experiencia del usuario y facilitan el desarrollo. A continuación se exploran trucos prácticos para personalizar el nombre de la aplicación, modificar la navegación, agregar lógica de votación en los modelos y depurar consultas SQL de forma ingeniosa.

¿Cómo cambiar el nombre y la navegación de tu aplicación en Yii?

El primer paso para darle identidad a un proyecto es cambiar el nombre que aparece en la barra superior. Esto se logra editando el archivo config/web.php y asignando un valor a la llave name [0:42]:

  • Se coloca 'name' => 'The Book Club' y al refrescar el navegador el cambio es inmediato.

Para modificar los elementos del menú, se trabaja directamente en el archivo views/layouts/main.php [1:16]. Este archivo actúa como wrapper de toda la aplicación: contiene el header, el nav widget y la variable $content donde se renderizan las vistas internas.

Dentro del nav widget se editan las etiquetas y las rutas:

  • Home se reemplaza por Libros apuntando a book/all.
  • About se cambia por Autores con la ruta author/all.
  • Contact simplemente se comenta para eliminarlo del menú [2:08].

El resultado es una navegación limpia: Libros, Autores y Logout. Cada enlace lleva a su controlador correspondiente y el cierre de sesión sigue funcionando sin modificaciones.

¿Cómo agregar enlaces entre vistas relacionadas?

Desde la vista de detalle de un libro se puede crear un hipervínculo al autor usando Html::a() [3:30]. Por ejemplo, el nombre del autor se convierte en un enlace hacia author/detail pasando el authorId del libro como parámetro:

php Html::a($book->authorName, ['author/detail', 'id' => $book->authorId])

Esto permite al usuario hacer clic en "James Joyce" dentro de un libro y llegar directamente al perfil del autor.

¿Cómo validar si un usuario ya votó por un libro?

Un patrón muy útil consiste en evitar votaciones duplicadas mostrando el resultado previo en lugar del formulario. Para implementarlo se crean dos métodos en el modelo User [5:20].

El primero es hasVotedForBookId($book_id), que busca en la tabla book_score un registro donde coincidan book_id y user_id. Si el resultado está vacío retorna false; de lo contrario, true:

php public function hasVotedForBookId($book_id) { $bookScore = BookScore::find() ->where(['book_id' => $book_id, 'user_id' => $this->id]) ->one(); if (empty($bookScore)) return false; return true; }

El segundo método es getVoteForBook($book_id), un getter que requiere el book_id como parámetro obligatorio y retorna el objeto BookScore correspondiente [7:02]. Se usa ->one() para obtener un único registro, lo cual es importante: sin el filtro por book_id, el Active Record podría devolver el primer resultado en cualquier orden, generando datos incorrectos.

¿Cómo reflejar la votación en la vista?

En el template de detalle se evalúa con un if si el usuario ya votó [6:22]. Si la condición es verdadera, se muestra un mensaje como "ya votaste, tu voto fue de 5". Si no, se presenta el formulario con ActiveForm para ingresar la calificación:

php if ($user->hasVotedForBookId($book->id)) { echo "Ya votaste, tu voto fue de " . $user->getVoteForBook($book->id)->score; } else { // formulario de votación }

El flujo queda claro: se vota una sola vez y después solo se consulta el resultado.

¿Cómo depurar consultas SQL generadas por Active Query?

Este es el tip más valioso de toda la sesión [9:12]. Cuando trabajas con Active Query y las consultas se vuelven extensas o confusas, existe una técnica sencilla: provocar un error a propósito.

Se cambia intencionalmente el nombre de un campo, por ejemplo book_id por book_ids. Al refrescar, Yii muestra el error SQL completo incluyendo la sentencia exacta que se intentó ejecutar:

The SQL being executed was: SELECT * FROM book_scores WHERE book_ids = ... AND user_id = 1

Con esto puedes visualizar el SQL real que el framework construye detrás de escena. Es especialmente útil cuando las consultas tienen múltiples joins o condiciones encadenadas que generan sentencias de quince líneas o más.

Por último, el pie de página también se personaliza desde el layout principal. Basta con localizar la referencia a "myCompany" al final del archivo y reemplazarla [8:38]. El año se genera dinámicamente con la función date('Y'), que devuelve el año en cuatro dígitos.

¿Has usado algún otro truco para depurar queries en Yii o en otro framework? Comparte tu experiencia en los comentarios.