Usando el módulo Flippy con taxonomías.

En un proyecto en el que hemos trabajado en Ymbra recientemente, necesitábamos un paginador entre nodos que nos permitiera tener en cada página una navegación con los enlaces Anterior y Siguiente. Nos acordamos entonces del módulo Flippy que añade esa funcionalidad fácilmente con una mínima configuración.

El problema es que en nuestro caso necesitábamos un filtro adicional para los nodos, que no entrasen todos los pertenecientes a un tipo de contenido. Necesitábamos filtrarlos por taxonomía, y este filtrado no lo permite Flippy.

Así que lo mejor era contribuir esa mejora al módulo por si a alguien más le puede ayudar —de hecho, existe una issue en el módulo preguntando si se puede hacer—.

Básicamente, se han añadido dos campos nuevos en la configuración de Flippy para cada tipo de contenido: un checkbox con el que indicamos si queremos filtrar por taxonomía, y un select, dependiente del anterior, con el que escogeremos la taxonomía por la que filtraremos los contenidos.

Para ello se modificaron dos archivos del módulo, flippy.module y FlippyPager.php. En flippy.module se añadieron los dos campos necesarios, teniendo en cuenta que a la hora de crear el listado de taxonomías para las opciones del select, sólo deberemos incluir aquellas que estén en el tipo de contenido:

// List taxonomies used in the content type.

$taxonomy_options = [];

$content_type_fields = \Drupal::service('entity_field.manager')

->getFieldDefinitions('node', $form['type']['#default_value']);

foreach ($content_type_fields as $taxo_field) {

  if (get_class($taxo_field) == 'Drupal\field\Entity\FieldConfig') {

    // It is an additional field.

    $itemDefinition = $taxo_field->getFieldStorageDefinition();

    $schema_info = $itemDefinition->getSchema();

    if (isset($schema_info['columns']['target_id'])) {

      $entity = $itemDefinition->getPropertyDefinitions()['entity'];

      $constrains = $entity->getConstraints();

      if ($constrains['EntityType'] == 'taxonomy_term') {

        $taxonomy_options[$taxo_field->getName()] = $taxo_field->getLabel();

      }

    }

  }

}

Además, en FlippyPager.php se modificó la query que realiza la búsqueda de contenidos para construir la paginación, introduciendo la nueva condición:

// Filter by taxonomy select in config.

$taxonomy_filter = $this->flippySettings

->get('flippy_taxonomy_' . $node->getType());

if ($taxonomy_filter) {

  $taxonomy = $this->flippySettings

    ->get('flippy_taxonomy_list_' . $node->getType());

  // Check if node has a value in the taxonomy.

  if (isset($node->get($taxonomy)->target_id)) {

    $taxonomy_id = $node->get($taxonomy)->target_id;

    $query->condition($taxonomy, $taxonomy_id);

 }

}

Para evitar problemas en el caso de que un nodo no tenga un valor asignado para la taxonomía por la que filtramos, es conveniente comprobarlo ante de añadir la condición.

Con esta pequeña mejora, ya podremos hacer que el módulo Flippy filtre los contenidos por taxonomía.

El parche se puede descargar desde aquí: https://www.drupal.org/project/flippy/issues/1497070#comment-12945412

Esperamos que esta contribución os sea útil!