Mostrando datos de una API externa en Drupal utilizando Views

drupal2023.jpg
Solucionex
26
Abr 23

Introducción

En Drupal podemos utilizar Views para mostrar datos de nuestros tipos de contenido, taxonomías y cualquier tipo de entidad que queramos, pero qué pasa si queremos mostrar datos externos a nuestra aplicación.

En este caso existen módulos que nos ayudan a mostrar datos externos que provienen de base de datos externas, APIs, archivos de datos, etc. Un ejemplo de estos módulos puedes ser: External Entities, Views Remote Data, etc. Pero si no te da miedo meterte en harina, la alternativa más simple y fácil es la de crearnos una "view query" personalizada.

¿Qué es una view query?

Con "view query" nos referimos al proceso del módulo Views por el cual se ejecuta una consulta sobre una fuente de datos, normalmente la propia base de datos Drupal, con el fin de mostrar estos en una vista.

Teniendo esto claro ya sabemos que nuestro planteamiento será el de crear una consulta personalizada que extraiga los datos de una API externa y permita mostrarlos en una vista gracias al módulo Views.

Ejemplo práctico

En el ejemplo práctico de este artículo vamos a utilizar la API de un sistema de gestión de datos abiertos, CKAN, para listar los cinco últimos conjuntos de datos publicados. Para ello seguiremos los siguientes pasos:

  • Crear nuestro módulo personalizado.
  • Definir nuestra view query personalizada en el archivo .module de nuestro módulo.
  • Definir los campos de los que nuestra vista hará uso en el archivo .module de nuestro módulo.
  • Crear nuestro plugin, archivo donde definiremos nuestra nueva view query en la ruta src/Plugin/views/query/CKANQuery.php
  • Crear los archivos de campos personalizados que utilizaremos para renderizar los datos en src/Plugin/views/field/DatasetLink.php y src/Plugin/views/field/DatasetActionsDropdownButton.php
  • Configurar nuestra vista desde la interfaz de Drupal

Crear módulo personalizado

Dentro de nuestro proyecto creamos el directorio custom_ckan_view en la ruta web/modules/custom, y dentro de este nuevo directorio creamos el archivo de definición del módulo custom_ckan_view.info.yml:

name: Custom CKAN View
type: module
description: Custom CKAN View using external data from demo.ckan.org API
package: Custom
core_version_requirement: ^8.8.0 || ^9 || ^10

Definir view query personalizada

Creamos el archivo custom_ckan_view.module en la ruta web/modules/custom/custom_ckan_view y añadimos lo siguiente:

<?php

function custom_ckan_view_views_data()
{
    $data = [];
    $data['custom_ckan_view']['table']['group'] = t('Custom CKAN View');
    $data['custom_ckan_view']['table']['base'] = [
        'title' => t('Custom CKAN View'),
        'help' => t('Custom CKAN View using external data from demo.ckan.org API'),
        'query_id' => 'custom_ckan_view'
    ];

    # Definir campos de la view query
    #  ...

    return $data;

}

Definir campos de la view query personalizada

Una vez tenemos definida nuestra view query, vamos a definir los campos de la consulta y su tipo, en concreto:

  • El campo título (dataset_title) al que llamaremos 'Display Name' y que utilizará el view field personalizado 'dataset_link'.
  • El campo fecha de creación (dataset_created) al que llamaremos 'Created' y que utilizará el view field 'date'.
  • El campo dropdown de operaciones (dataset_operations) al que llamaremos 'Operations' y que utilizará el view field personalizado 'dataset_operations'

Para ello, en el mismo archivo en el que estamos, vamos a añadir lo siguiente:

    # Definir campos de la view query

    $data['custom_ckan_view']['dataset_title'] = [
        'title' => t('Display name'),
        'help' => t('Display name'),
        'field' => [
            'id' => 'dataset_link',
        ],
        'sort' => [
            'id' => 'standard',
        ],
        'filter' => [
            'id' => 'standard',
        ],
    ];

    $data['custom_ckan_view']['dataset_created'] = [
        'title' => t('Created'),
        'help' => t('Dataset created date'),
        'field' => [
            'id' => 'date',
        ],
        'sort' => [
            'id' => 'date',
        ],
        'filter' => [
            'id' => 'date',
        ],
    ];

   $data['custom_ckan_view']['dataset_operations'] = [
        'title' => t('Operations'),
        'help' => t('Operations dropdown'),
        'field' => [
            'id' => 'dataset_operations',
        ]

    ];

Crear view query plugin

Ahora que ya tenemos tanto la view query como los campos a mostrar, definidos, vamos a pasar a crear el plugin que nos permitirá extraer los datos de la API de CKAN y asignárselos a los definidos en la view query. Para ello, dentro de nuestro módulo personalizado custom_ckan_view, vamos a crear el archivo CustomCKANDatasetsQuery.php en la ruta src/Plugin/views/query.

<?php

namespace Drupal\custom_ckan_view\Plugin\views\query;

use Drupal\views\ResultRow;
use Drupal\views\ViewExecutable;
use Drupal\views\Plugin\views\query\QueryPluginBase;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * @ViewsQuery(
 *   id = "custom_ckan_datasets_query",
 *   title = @Translation("Custom CKAN Datasets Query"),
 *   help = @Translation("Custom CKAN Datasets Query")
 * )
 */
class CustomCKANDatasetsQuery extends QueryPluginBase
{

    public function __construct(array $configuration, $plugin_id, $plugin_definition)
    {
        parent::__construct($configuration, $plugin_id, $plugin_definition);
    }

    /**
     * {@inheritdoc}
     */
    public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition)
    {
        return new static(
            $configuration,
            $plugin_id,
            $plugin_definition,
        );
    }

    public function ensureTable($table, $relationship = NULL)
    {
        return '';
    }

    public function addField($table, $field, $alias = '', $params = array())
    {
        return $field;
    }

    public function execute(ViewExecutable $view)
    {
        $client = \Drupal::service('http_client');
        $current_datasets = $client->get('https://demo.ckan.org/es/api/3/action/current_package_list_with_resources')->result;
        foreach ($current_datasets as $data) {
            $data = (array) $data;
            $row['dataset_title'] = $data['title'];
            $row['dataset_name'] = $data['name'];
            $row['created'] = strtotime($data['metadata_created']);
            $row['index'] = $index++;
            $view->result[] = new ResultRow($row);
        }
    }
}

 

Crear view fields personalizados

Vamos a hacer lo mismo para cada view field personalizado. Dentro de nuestro módulo custom_ckan_view, vamos a crear los archivos DatasetLink.php DatasetOperations.php en la ruta src/Plugin/views/field. Estos archivos definirán un campo "dataset_link" que nos mostrará un enlace con el nombre del dataset como texto y destino su página en el portal de CKAN https://demo.ckan.org, y el campo "dataset_operations" que nos mostrará un desplegable con las operaciones de vista, edición y borrado del conjunto de datos.

DatasetLink.php
<?php
namespace Drupal\custom_ckan_view\Plugin\views\field;

use Drupal\Core\Url;
use Drupal\views\ResultRow;
use Drupal\views\Plugin\views\field\FieldPluginBase;

/**
 * Class DatasetLink
 *
 * @ViewsField("dataset_link")
 */
class DatasetLink extends FieldPluginBase {

  public function render(ResultRow $values) {
      return [
        '#type' => 'link',
        '#title' => $values->dataset_title,
        '#url' => Url::fromUri('https://demo.ckan.org/dataset/'.$values->dataset_name),
      ];
  }
}
DatasetOperations.php
<?php

namespace Drupal\custom_ckan_view\Plugin\views\field;

use Drupal\Core\Url;
use Drupal\views\ResultRow;
use Drupal\views\Plugin\views\field\FieldPluginBase;

/**
 * Class DatasetOperations
 *
 * @ViewsField("dataset_operations")
 */
class DatasetOperations extends FieldPluginBase
{

    public function render(ResultRow $values)
    {
        $dataset_name = isset($values->dataset_name) ? $values->dataset_name : "";
        $operations = [
            '#type' => 'dropbutton',
            '#dropbutton_type' => 'small',
            '#links' => array(
                'visit' => array(
                    'title' => $this->t('View'),
                    'url' => Url::fromUri('https://demo.ckan.org/dataset/'.$dataset_name),
                ),
                'edit' => array(
                    'title' => $this->t('Edit'),
                    'url' => Url::fromUri('https://demo.ckan.org/dataset/edit/'.$dataset_name),
                ),
                'delete' => array(
                    'title' => $this->t('Delete'),
                    'url' => Url::fromUri('https://demo.ckan.org/dataset/delete/'.$dataset_name),
                ),
            ),
        ];
        return $operations;
    }
}

Crear y configurar una nueva vista basada en nuestro view query personalizado

Por último, solamente nos queda crear la vista y configurarla. Empezamos por crear la vista desde la ruta /admin/structure/views/add.

En el selector Mostrar de la sección Opciones de Vista elegimos nuestra view query personalizada Custom CKAN View y procedemos a utilizar las otras secciones según queramos una página o bloque de vista. Una vez dentro ya aparecerán los campos que hemos definido con anterioridad, además en la previsualización se mostrarán mapeados los datos correspondiente a la API externa.

Bibliografía