Extra Block Types (EBT) - Nueva experiencia con Layout Builder❗

Extra Block Types (EBT): tipos de bloques con estilo y personalizables: Presentaciones de diapositivas, Pestañas, Tarjetas, Acordeones y muchos más. Configuraciones integradas para fondo, DOM Box y plugins de JavaScript. Experimenta hoy el futuro de la construcción de diseños.

Módulos de demostración EBT Descargar módulos EBT

❗Extra Paragraph Types (EPT) - Nueva experiencia con Paragraphs

Extra Paragraph Types (EPT): conjunto de módulos basado en párrafos de forma análoga.

Módulos de demostración EPT Descargar módulos EPT

Scroll

9.14. Escribir integración con Views

04/05/2025, by Ivan

El módulo Views es ampliamente utilizado en el ecosistema de Drupal. Listas de contenido, tablas, bloques, presentaciones de diapositivas, exportación de datos: estos tipos de contenido normalmente se muestran con Views. Si usas Tipos de contenido, Tipos de bloques u otros tipos de entidades, entonces Views ya está integrado automáticamente con ellos y puedes usar Views para mostrar tu contenido. Pero para tu módulo personalizado, donde utilizas una tabla de base de datos personalizada separada, que creaste con hook_schema(), deberás escribir una integración con Views para mostrar los datos de tu módulo en la interfaz del módulo Views.

Veamos la integración del módulo Did this help con Views:

https://www.drupal.org/project/did_this_help

El módulo crea su propia tabla de base de datos para almacenar datos. En esta tabla hay cadenas, IDs, fechas, por lo que necesitamos definir diferentes controladores (handlers) para la integración con Views:

Base de datos Did this help

Al principio necesitas añadir el archivo MODULENAME.views.inc, que se carga automáticamente, por lo que no necesitas especificar su ubicación en ningún otro lugar. En el archivo *.views.inc necesitas implementar hook_views_data():

<?php

/**
 * @file
 * Proporciona datos de Views para did_this_help.module.
 */

/**
 * Implementación de hook_views_data().
 */
function did_this_help_views_data() {

}

Para esta implementación necesitas devolver un array que describa la estructura de tu tabla de base de datos personalizada del módulo.

https://api.drupal.org/api/drupal/core%21modules%21views%21views.api.php/function/hook_views_data/9.0.x

Comienza con el nombre de la tabla de base de datos como la primera clave del array:

  $data['did_this_help'] = [
    'table' => [
      'group' => t('¿Esto ayudó?'),
      'base' => [
        'field' => 'id',
        'title' => t('Entradas de ¿Esto ayudó?'),
        'help' => t('Contiene una lista de entradas de ¿Esto ayudó?.'),
      ],
    ],
  ];

Aquí está la descripción de la tabla con el nombre en la clave del array $data['did_this_help']. Si necesitas añadir integración con varias tablas de base de datos, entonces agrega claves diferentes para el array $data: $data['did_this_help1'], $data['did_this_help2'].

Luego, en la descripción del array 'table' siguen:

group: permite agrupar campos en la misma partición para facilitar la selección de campos en la interfaz de Views.

base: muestra el ID serial para esta tabla, luego usaremos el ID serial para unir tablas mediante claves foráneas.

Después de eso, describimos cada campo que queremos ver en Views:

$data['did_this_help']['id']= [
  'real field' => 'id',
  'title' => t('ID de registro de ¿Esto ayudó?'),
  'help' => t('Registro de ¿Esto ayudó?.'),
  'field' => [
    'id' => 'standard',
  ],
  'sort' => [
    'id' => 'standard',
  ],
  'filter' => [
    'id' => 'numeric',
  ],
  'argument' => [
    'id' => 'numeric',
  ],  
];

real field: permite definir el nombre real del campo (columna en la tabla de base de datos), si usas alias en las claves del array. Para un tipo de campo de Drupal, los campos reales pueden tener diferentes valores. Por ejemplo, el campo Link tiene dos valores: Título y URI. Cada valor corresponde a una columna propia en la base de datos. El nombre de la columna consiste en el nombre del campo y el nombre de la propiedad (title, uri):

Tabla de base de datos Link

El nombre de estas columnas fue creado automáticamente por el módulo Link, pero para módulos personalizados debes definir tú mismo los valores de real field en hook_views_data().

title, help: información para la interfaz del módulo Views.

Luego siguen los IDs de los handlers: field, sort, filter, argument. El handler define cómo se filtran y muestran los campos. Por ejemplo, las fechas deben mostrarse con formato de fecha y filtrarse con un calendario emergente. Para números, necesitamos filtros con operaciones >, < y =. Para cadenas, filtrado por longitud de cadena.

Field handlers

Los field handlers ayudan a generar la parte de la consulta SQL después de la palabra SELECT.

Lista de field handlers de Views del núcleo de Drupal disponible aquí:

https://api.drupal.org/api/drupal/core%21modules%21views%21src%21Plugin%21views%21field%21FieldPluginBase.php/group/views_field_handlers/8.6.x

Para módulos personalizados a menudo usarás el handler standard para números y cadenas. Para datos de tipo fecha, debes usar el handler date.

Por ejemplo, el campo ID usa el field handler "standard":

    'id' => [
      'real field' => 'id',
      'title' => t('ID de registro de ¿Esto ayudó?'),
      'help' => t('Registro de ¿Esto ayudó?.'),
      'field' => [
        'id' => 'standard',
      ],
      'sort' => [
        'id' => 'standard',
      ],
      'filter' => [
        'id' => 'numeric',
      ],
      'argument' => [
        'id' => 'numeric',
      ],
    ],

Sort handlers

Los sort handlers permiten usar ordenamiento normal y ordenamiento expuesto en Views. Definen la parte de la consulta SQL después de las palabras ORDER BY.

Lista de sort handlers disponible aquí:

https://api.drupal.org/api/drupal/core%21modules%21views%21src%21Plugin%21views%21sort%21SortPluginBase.php/group/views_sort_handlers/8.6.x

Filter handlers

Los filter handlers permiten mostrar filtros normales, expuestos y contextuales en Views. Definen la parte de la consulta SQL después de la palabra WHERE.

Lista de filter handlers disponible aquí:

https://api.drupal.org/api/drupal/core%21modules%21views%21src%21Plugin%21views%21filter%21FilterPluginBase.php/group/views_filter_handlers/8.6.x

Para filtrar fechas con el calendario emergente puedes usar el handler "date":

  $data['did_this_help']['created'] = [
    'title' => t('Fecha de creación del registro ¿Esto ayudó?'),
    'help' => t('Fecha de creación del registro ¿Esto ayudó?'),
    'field' => [
      'id' => 'date',
    ],
    'argument' => [
      'id' => 'date',
    ],
    'filter' => [
      'id' => 'date',
    ],
    'sort' => [
      'id' => 'date',
    ],
  ];

Relationship handler

Los relationship handlers permiten añadir joins en la consulta SQL y obtener datos de varias tablas en una sola consulta.

La tabla de base de datos del módulo ¿Esto ayudó? tiene una columna con IDs de usuario. Usando relationship handler puedes añadir relación en la interfaz de Views entre las filas de did_this_help y users y mostrar datos de varias tablas:

  $data['did_this_help']['uid'] = [
    'title' => t('ID de usuario del registro ¿Esto ayudó?'),
    'help' => t('ID de usuario del registro ¿Esto ayudó?'),
    'field' => [
      'id' => 'standard',
    ],
    'sort' => [
      'id' => 'standard',
    ],
    'filter' => [
      'id' => 'numeric',
    ],
    'argument' => [
      'id' => 'numeric',
    ],
    'relationship' => [
      'title' => t('Usuario'),
      'help' => t('El usuario en el que se escribió la entrada del registro.'),
      'base' => 'users_field_data',
      'base field' => 'uid',
      'id' => 'standard',
    ],
  ];

Para eso añadimos la relación para el campo, donde especificamos el valor "base" con la tabla que queremos unir y el campo que usaremos para unir por este campo "base field"; title y help para la interfaz de Views; id como handler de relación. Lista de tipos de relaciones disponible aquí:

https://api.drupal.org/api/drupal/core%21modules%21views%21src%21Plugin%21views%21relationship%21RelationshipPluginBase.php/group/views_relationship_handlers/8.6.x

Sin embargo, Views proporciona una amplia gama de diferentes handlers. Puedes heredar la clase base del handler y escribir tu propio handler personalizado para campo, filtro u ordenamiento. En el próximo artículo escribiremos un handler personalizado para el filtro de Views.