Ver índice de contenidos del libro

7.4. Slots de componentes

Si se combina el poder de los componentes que se han visto anteriormente y las opciones de configuración de la vista, se consigue un modelo de desarrollo de la vista completamente nuevo: el sistema de slots de componentes. Se trata de una alternativa a los slots que se centra en la reutilización y en la separación en capas. De esta forma, los slots de componentes están mucho más estructurados que los slots, pero son un poco más lentos de ejecutar.

Al igual que los slots, los slots de componentes son zonas que se pueden definir en los elementos de la vista. La principal diferencia reside en la forma en la que se decide qué codigo rellena esas zonas. En un slot normal, el código se establece en otro elemento de la vista; en un slot de componentes, el código es el resultado de la ejecución de un componente, y el nombre de ese componente se obtiene de la configuración de la vista. Después de verlos en la práctica, es sencillo entender el comportamiento de los slots de componentes.

Para definir la zona del slot de componentes, se utiliza el helper include_component_slot(). El parámetro de esta función es el nombre que se asigna al slot de componentes. Imagina por ejemplo que el archivo layout.php de la aplicación tiene un lateral de contenidos cuya información depende de la página en la que se muestra. El listado 7-38 muestra como se incluiría este slot de componentes.

Listado 7-38 - Incluir un slot de componentes de nombre lateral

...
<div id="lateral">
  <?php include_component_slot('lateral') ?>
</div>

La correspondencia entre el nombre del slot de componentes y el nombre del propio componente se define en la configuración de la vista. Por ejemplo, se puede establecer el componente por defecto para el slot lateral debajo de la clave components del archivo view.yml de la aplicación. La clave de la opción de configuración es el nombre del slot de componentes; el valor de la opción es un array que contiene el nombre del módulo y el nombre del componente. El listado 7-29 muestra un ejemplo.

Listado 7-39 - Definir el slot de componentes por defecto para lateral, en frontend/config/view.yml

default:
  components:
    lateral:  [mimodulo, default]

De esta forma, cuando se ejecuta el layout, el slot de componentes lateral se rellena con el resultado de ejecutar el método executeDefault() de la clase mimoduloComponents del módulo mimodulo, y este método utiliza la vista del elemento parcial _default.php que se encuentra en modules/mimodulo/templates/.

La configuración en cascada permite redefinir esta opción en cualquier módulo. Por ejemplo, en el módulo user puede ser más útil mostrar el nombre del usuario y el número de artículos que ha publicado. En ese caso, se puede particularizar el slot lateral mediante las siguientes opciones en el archivo view.yml del módulo, como se muestra en el listado 7-40.

Listado 7-40 - Particularizando el slot de componentes lateral, en frontend/modules/user/config/view.yml

all:
  components:
    lateral:  [mimodulo, user]

El listado 7-41 muestra el código del componente necesario para este slot.

Listado 7-41 - Componentes utilizados por el slot lateral, en modules/mimodulo/actions/components.class.php

class mimoduloComponents extends sfComponents
{
  public function executeDefault()
  {
  }
 
  public function executeUser()
  {
    $this->usuario_actual = $this->getUser()->getCurrentUser();
    $c = new Criteria();
    $c->add(ArticlePeer::AUTHOR_ID, $this->usuario_actual->getId());
    $this->numero_articulos = ArticlePeer::doCount($c);
  }
}

El listado 7-42 muestra la vista de estos 2 componentes.

Listado 7-42 - Elementos parciales utilizados por el slot de componentes lateral, en modules/mimodulo/templates/

// _default.php
<p>El contenido de esta zona depende de la página en la que se muestra.</p>
 
// _user.php
<p>Nombre de usuario: <?php echo $usuario_actual->getName() ?></p>
<p><?php echo $numero_articulos ?> artículos publicados</p>

Los slots de componentes se pueden utilizar para añadir en las páginas web las "migas de pan", los menús de navegación que dependen de cada página y cualquier otro contenido que se deba insertar de forma dinámica. Como componentes que son, se pueden utilizar en el layout global y en cualquier plantilla, e incluso en otros componentes. La configuración que indica el componente de un slot siempre se extrae de la configuración de la última acción que se ejecuta.

Para evitar que se utilice un slot de componentes en un módulo determinado, se puede declarar un par módulo/componente vacío, tal y como muestra el listado 7-43.

Listado 7-43 - Deshabilitar un slot de componentes en view.yml

all:
  components:
    lateral:  []