Drupal 8: Crear un bloque con un listado de nodos (parte 2)

En este capitulo vamos a continuar con el desarrollo del pequeño modulo que dejamos en la primera parte de un bloque que muestra un listado de nodos del tipo de contenido que indiquemos.

En el anterior capitulo creamos el bloque con un formulario de configuracion, ahora vamos a crear un archivo twig para la plantilla, haremos el preprocesamiento de la plantilla, y cargaremos los nodos para finalmente listarlos en el tpl. Vamos con ello!

Definir el tema

Lo primero que vamos a hacer, es crear el hook_theme() para definir el tema, para ello vamos a editar el archivo drupblock.module, dentro vamos a definir el hook:

/**
 * Implements hook_theme().
 */
function drupblock_theme($existing, $type, $theme, $path) {
  $template = array(
    'drupblock_list' => array(
      'variables' => array(
        'type' => NULL,
        'block_title' => NULL,
        'node_number' => NULL,
      ),
    ),
  );

  return $template;
}

Con esto ya tenemos el theme definido, con las variables 'type' para el tipo de contenido, 'block_title' para el titulo del la lista y 'node_number' para la cantidad de nodos que vallamos a mostrar.

Crear el preprocesado de la plantilla:

Ahora vamos a definir el preprocesado de la plantilla para cargar los datos y poder enviarlos a la plantilla.

/**
 * Preprocess function for template drupblock_list.
 * Obtiene los valores necesarios para la plantilla
 */
function template_preprocess_drupblock_list(&$vars){

  //Se obtienen los nodos
  $nodes = _drupblock_node_load_multiple_nodes($vars['type'], $vars['node_number']);

  //Se obtiene el servicio "Alias Manager"
  $alias_manager = \Drupal::service('path.alias_manager');

  //Se obtiene la ID del idioma que se esta usando actualmente, antes se utilizaba
  //global language; $language->language;
  $language = \Drupal::languageManager()->getCurrentLanguage()->getId();

  $node_print = [];

  foreach($nodes as $key => $node) {
    //Se obtiene el nid del nodo
    $nid = $node->id();
    //Se obtiene el alias del nodo a traves de la ruta con el Alias Manager
    $node_alias = $alias_manager->getAliasByPath('/node/' . $nid, $language);

    $node_print[$nid]['path_alias'] = $node_alias;
    $node_print[$nid]['title'] = $node->getTitle();
  }

  $vars['nodes'] = $nodes;
  $vars['nodes_print'] = $node_print;
}

Con eso ya tenemos preprarado el preprocesamiento de la plantilla, pero para cargar los nodos, llamamos a la funcion _drupblock_list_node_load_multiple_nodes, la cual no existe, a si que vamos a definirla

[...]
use Drupal\node\Entity\Node;
[...]
/**
 * Carga todos los nodos activos del tipo que se indique en la variable type
 * @param $type: El tipo de nodo a cargar, si no se indica, se cargaran todos
 * @param $number: La cantidad de nodos que se cargaran
 * @return mixed: Devuelve los objetos de los nodos que se han cargado
 */
function _drupblock_node_load_multiple_nodes($type = 'blank', $number = 20){

  //Se obtiene el objeto entityQuery para realizar una consulta a la entidad node
  $query = \Drupal::entityQuery('node');
  //Se establece en la consulta que los nodos tienen que estar publicados
  //y en un rango de 0 al establecido
  $query->condition('status', 1)
    ->range(0, $number);

  //Si se ha establecido un tipo de contenido en el formulario de configuracion
  //del bloque, se buscan nodos de ese tipo
  if($type != 'blank') {
    $query->condition('type', $type);
  }

  //Se ejecuta la consulta creara anteriormente
  $result = $query->execute();

  //Pasa todos los nid obtenidos a una variable
  $nids = array_keys($result);

  //Se cargan todos los nodos a traves de sus id
  $nodes = Node::loadMultiple($nids);

  return $nodes;
}

Crear la plantilla twig

Ahora ya tenemos todo listo, vamos a crear la plantilla twig, para ello creamos primero un directorio llamado 'templates' en la raiz del modulo, y dentro el archivo drupbloc-list.html.twig, insertamos el siguiente codigo twig para imprimir la lista de los nodos.

{#
Variables
node_print: Array, contiene los valores para imprimir en la plantilla,
contiene los siguientes registros:
   'path_alias' el alias url de la ruta del nodo
   'title' el titulo del nodo
block_title: El titulo de la lista
nodes: Los objetos de los nodos de node print.
#}

<h3>{{ block_title }}</h3>
<ul>
    {% for node in nodes_print %}
        <li>
            <a href="{{ node.path_alias }}">
                {{ node.title }}
            </a>
        </li>
    {% endfor %}
</ul>

Ya tenemos todo lo necesario para cargar los nodos, procesarlos he imprimirlos en una plantilla, unicamente nos queda llamar al tema y pasarle los parametros que necesitemos.

LLamar al theme y pasarle los parametros:

Para poder utilizar la plantilla para imprimir, unicamente tenemos que enviar un array renderizable desde el bloque, a si que nos vamos al archivo DefaultBlock.php, que es la clase del bloque, y modificamos el metodo build como se ve a continuacion:

/**
 * {@inheritdoc}
 */
public function build() {
  $build = [
    '#theme' => 'drupblock_list',
    '#type' => $this->configuration['content_type'],
    '#block_title' => $this->configuration['block_title'],
    '#node_number' => $this->configuration['number_nodes'],
  ];

  return $build;
}

Al modificarlo, lo que hacemos es crear un array renderizable, como valor #theme se le pasa el nombre del theme que definimos en el hook_theme, y para pasar parametros, se pasan con el nombre del parametro y la almohadilla, en Drupal 7, el equivalente seria "theme('drupblock', array('type' => 'type', 'block_title' => 'title', 'node_number' => 'number));"

Resultado final

Ahora unicamene nos queda añadir algo de contenido, para probar que el bloque funcione correctamente.

Con esto finaliza la segunda parte, en la tercera veremos algunas cosas extra, como por ejemplo, marcar cual es el nodo que se esta visualizando, en caso de que estemos en una pagina de un nodo.

Parte 1

Total de votos: 66

Entradas relacionadas

Comentarios (0)

Deja un comentario