Crear páginas, vistas y hacer consultas en Drupal 8 (Modulos)

Hoy vamos a ver como crear páginas, vistas y hacer consultas en Drupal 8. Antes de nada deberias crear un tipo de contenido con una serie de campos para poder hacer lo que haremos a continuación, en mi caso tengo un tipo de contenido «Empresa» con una serie de campos como el titulo, web, cif, etc.

Antes de continuar es recomendable echarle un vistazo a como crear un módulo básico en Drupal 8 y al curso de Symfony3.

Definimos el fichero pruebas_module.info.yml con la información básica del módulo.

name: Pruebas Module
description: Módulo de pruebas
package: Víctor
 
type: module
core: 8.x

Ahora creamos nuestro controlador pruebas_module/src/Controller/PruebasController.php

namespace Drupal\pruebas_module\Controller;

use Drupal;
use Drupal\node\Entity\Node;
use Drupal\Core\Controller\ControllerBase;

class PruebasController extends ControllerBase {
	
// Página 1
  public function content() {
    return array(
        '#type' => 'markup',
        '#markup' => $this->t('Hola mundo !!'),
    );
  }
  
// Página 2
  public function getEmpresas() {
	  
      // Sacar datos de la base de datos
        $query = Drupal::entityQuery('node')
                ->condition('type', 'company')
                ->execute();

      // Recorrer los resultados y guardar los nodos en un array
        if (!empty($query)) {
            foreach ($query as $empresaId) {
                $empresa = Node::load($empresaId);
                $empresas[] = $empresa;
            }
        }
		
        // Cargamos datos en una vísta, usando hook_theme 
        return array(
            '#theme' => 'show_empresas',
            '#titulo' => $this->t('Listado de empresas'),
            '#descripcion' => $this->t('Empresas disponibles'),
            '#empresas' => $empresas           
        );
    }
  
}

?>

Antes hemos usado en #theme show_empresas, para asignarle una vista al método y así generar un fichero twig vinculado a esa acción del controlador. Pues bien ese tema es un hook que nos permite definer #themes que básicamente nos permite asociarle una vista twig con una serie de parámetros que va a recibir esa vista.
En el fichero pruebas_module/pruebas_module.module podemos definir hooks, en mi caso estoy usando el hook_theme y creo el «tema» show_empresas.

<?php
/**
 * Theme hook
 */
function pruebas_module_theme($existing, $type, $theme, $path) {
    
    return array(
        'show_empresas' => array(
                                'variables' => array(
                                    'titulo' => 'Título por defecto', 
                                    'descripcion' => 'descripción por defecto',
                                    'empresas'   => NULL
                                    ),
                                'template' => 'show_empresas'
                            )
    );
}

El siguiente paso es crear la vista twig (twig es el lenguaje de plantillas de Symfony) en la cual vamos a mostrar las empresas que tengamos creadas dentro de una tabla. Creamos la vista en pruebas_module/templates/show_empresas.html.twig

<h2>{{ titulo }}</h2>
<p>{{ descripcion }}</p>
<hr/>

{% if empresas %}
    <div class="col-sm-6">
        <div class="panel panel-default">
            <div class="panel-heading">Empresas</div>
            <div class="panel-body">
                <p>Esta tabla muestra las empresas</p>
            </div>
            </div>
        
            <table class="table table-bordered table-striped table-hover">
                <tbody>
                    {% for empresa in empresas %}
                            <tr>
                                <td>{{ empresa.get('field_company_web').value }}</td>   
                                <td class="text-right">{{ empresa.get('field_company_location').value }}</td>
                            </tr>
                    {% endfor %}
                </tbody>
            </table>
    </div>
{% endif %}

Ahora definimos nuestras rutas en el fichero pruebas_module/pruebas_module.routing.yml

pruebas_module.content:
    path: '/admin/config/modulo-de-pruebas'
    defaults:
        _controller: '\Drupal\pruebas_module\Controller\PruebasController::content'
        _title: 'Modulo de pruebas'
    requirements:
        _permission: 'access content'

pruebas_module.empresas:
    path: '/admin/config/empresas'
    defaults:
        _controller: '\Drupal\pruebas_module\Controller\PruebasController::getEmpresas'
        _title: 'Modulo de pruebas - Empresas'
    requirements:
        _permission: 'access content'

Y por último mostramos los links en las secciones que nos interesan.

pruebas_module.homepage:
  title: Modulo de pruebas
  description: 'Configurar el modulo de pruebas'
  parent: system.admin_config_ui
  route_name: pruebas_module.content
  
pruebas_module.empresas:
  title: Mostrar empresas (modulo pruebas)
  description: 'Mostrar las empresas'
  parent: system.admin_config_ui
  route_name: pruebas_module.empresas

Pues con esto ya tenemos dos páginas en nuestro módulo, que cargan una vista en un fichero twig y muestran la información tras hacer consultas con Drupal 8 a la «base de datos», que realmente estamos sacando la información de un nodo/entidad.

Más información:
Crear un módulo básico en Drupal 8
Listado de hooks de Drupal 8
Curso de Symfony3 – Domina el framework PHP más completo

Víctor Robles WEB

Autor: Victor

Desarrollador web - Formador online - Blogger

Compartir este post