9.14. Schrijven van integratie met Views
De Views-module wordt veel gebruikt in het Drupal-ecosysteem. Lijsten met inhoud, tabellen, blokken, diavoorstellingen, data-export – dit soort inhoud wordt meestal weergegeven met Views. Als je Inhoudstypen, Bloktypen of andere Entiteitstypen gebruikt, dan is Views daar al automatisch mee geïntegreerd en kun je Views gebruiken om je inhoud weer te geven. Maar voor je eigen module, waar je een aparte aangepaste databasetabel gebruikt die je hebt aangemaakt met hook_schema(), moet je zelf de integratie met Views schrijven om de data van je module weer te geven in de UI van de Views-module.
Laten we de integratie bekijken van de module Did this help met Views:
https://www.drupal.org/project/did_this_help
De module maakt een eigen databasetabel aan om data op te slaan. In deze tabel staan strings, ID’s, datums, dus we moeten verschillende handlers definiëren voor de integratie met Views:

In het begin moet je een bestand toevoegen MODULENAAM.views.inc, dat automatisch wordt ingeladen, dus je hoeft de locatie van dit bestand nergens anders te specificeren. In het bestand *.views.inc moet je hook_views_data() implementeren:
<?php
/**
* @file
* Provide views data for did_this_help.module.
*/
/**
* Implements hook_views_data().
*/
function did_this_help_views_data() {
}
Voor deze implementatie moet je een array teruggeven die de structuur beschrijft van je aangepaste databasetabel van je custom module.
Begin met de naam van de databasetabel in de eerste array-key:
$data['did_this_help'] = [
'table' => [
'group' => t('Did this help?'),
'base' => [
'field' => 'id',
'title' => t('Did this help? entries'),
'help' => t('Contains a list of Did this help? entries.'),
],
],
];
Hier wordt de tabel beschreven met de naam in de array-key $data['did_this_help']. Als je integratie nodig hebt met meerdere databasetabellen, voeg dan verschillende keys toe aan de $data-array: $data['did_this_help1'], $data['did_this_help2'].
Daarna volgt in de array 'table' beschrijving:
group – maakt het mogelijk om velden in dezelfde sectie te groeperen voor eenvoudiger veldselectie in de Views-UI.
base – toont het seriële ID voor deze tabel, later zullen we het seriële ID gebruiken om tabellen te koppelen via foreign keys.
Daarna beschrijven we elk veld dat we in Views willen zien:
$data['did_this_help']['id']= [
'real field' => 'id',
'title' => t('Did this help? record ID'),
'help' => t('Did this help? record.'),
'field' => [
'id' => 'standard',
],
'sort' => [
'id' => 'standard',
],
'filter' => [
'id' => 'numeric',
],
'argument' => [
'id' => 'numeric',
],
];
real field – maakt het mogelijk om de echte veldnaam te definiëren (kolom in de databasetabel), als je aliassen gebruikt in de array-keys. Voor één Drupal-veldtype kunnen echte velden verschillende waarden hebben, bijvoorbeeld het Link-veld heeft twee waarden: Title en URI. Elke waarde komt overeen met een eigen databasekolom. De kolomnaam bestaat uit de veldnaam en de eigenschapsnaam (title, uri):

De namen van deze kolommen zijn automatisch aangemaakt door de Link-module, maar voor custom modules moet je de waarden van real field zelf definiëren in hook_views_data().
title, help – informatie voor de Views-module-UI.
Daarna volgen de Handler-ID’s voor: field, sort, filter, argument. Een handler definieert hoe velden worden gefilterd en weergegeven, bijvoorbeeld datums moeten worden weergegeven met een Date Format en worden gefilterd met een Date Calendar Popup. Voor getallen hebben we filters nodig met de bewerkingen >, < en =, voor strings hebben we een filter nodig op stringlengte.
Field handlers
Field handlers helpen om het deel van de SQL-query te genereren na het woord SELECT.
Een lijst met Views field handlers uit de Drupal-core vind je hier:
Voor custom modules zul je vaak de standard-handler gebruiken voor getallen en strings, voor data met datums moet je de date-handler gebruiken.
Bijvoorbeeld, het ID-veld gebruikt de field handler "standard":
'id' => [
'real field' => 'id',
'title' => t('Did this help? record ID'),
'help' => t('Did this help? record.'),
'field' => [
'id' => 'standard',
],
'sort' => [
'id' => 'standard',
],
'filter' => [
'id' => 'numeric',
],
'argument' => [
'id' => 'numeric',
],
],
Sort handlers
Sort handlers maken het mogelijk om gewone sortering en exposed sortering in Views te gebruiken. Sort handlers definiëren het deel van de SQL-query na de woorden ORDER BY.
Een lijst met sort handlers vind je hier:
Filter handlers
Filter handlers helpen om gewone filters, exposed en contextuele filters in Views weer te geven. Filter handlers definiëren het deel van de SQL-query na het woord WHERE.
Een lijst met filter handlers vind je hier:
Om datums te filteren met een Date Calendar Popup kun je de handler "date" gebruiken:
$data['did_this_help']['created'] = [
'title' => t('Created date for Did this help? record'),
'help' => t('Created date for Did this help? record'),
'field' => [
'id' => 'date',
],
'argument' => [
'id' => 'date',
],
'filter' => [
'id' => 'date',
],
'sort' => [
'id' => 'date',
],
];
Relationship handler
Relationship handlers helpen om joins toe te voegen in de SQL-query en data uit meerdere tabellen in één query te halen.
De databasetabel van de Did this help?-module heeft een kolom met user-ID’s. Met behulp van een relationship handler kun je in de Views-UI een relatie toevoegen tussen rijen in did_this_help en users en data uit meerdere tabellen weergeven:
$data['did_this_help']['uid'] = [
'title' => t('User ID for Did this help? record'),
'help' => t('User ID for Did this help? record'),
'field' => [
'id' => 'standard',
],
'sort' => [
'id' => 'standard',
],
'filter' => [
'id' => 'numeric',
],
'argument' => [
'id' => 'numeric',
],
'relationship' => [
'title' => t('User'),
'help' => t('The user on which the log entry as written.'),
'base' => 'users_field_data',
'base field' => 'uid',
'id' => 'standard',
],
];
Daarvoor voegen we een relatie toe voor het veld, waarbij we de waarde "base" specificeren met de tabel die we willen joinen en het veld waarmee we zullen joinen "base field"; title en help voor de Views-UI; id is de relationship handler. Een lijst van relationship-types kun je hier zien:
Views biedt echter een breed scala aan verschillende handlers, je kunt de basisklasse van een handler erven en je eigen custom handler schrijven voor field, filter, sort. In het volgende artikel zullen we een custom handler schrijven voor een Views-filter.