Usant el mòdul Flippy amb taxonomies.

En un projecte en el qual hem treballat en Ymbra recentment, necessitàvem un paginador entre nodes que ens permetés tenir a cada pàgina una navegació amb els enllaços Anterior i Següent. Recordem llavors del mòdul Flippy que afegeix aquesta funcionalitat fàcilment amb una mínima configuració.

El problema és que en el nostre cas necessitàvem un filtre addicional per als nodes, que no entressin tots els pertanyents a un tipus de contingut. Necessitàvem filtrar per taxonomia, i aquest filtrat no ho permet Flippy.

Així que el millor era contribuir aquesta millora al mòdul per si a algú més li pot ajudar -de fet, hi ha una issue en el mòdul preguntant si es pot fer-.

Bàsicament, s'han afegit dos camps nous en la configuració de Flippy per a cada tipus de contingut: un checkbox amb el que indiquem si volem filtrar per taxonomia, i un select, dependent de l'anterior, amb el qual escollirem la taxonomia per la qual filtrarem els continguts.

Per a això es van modificar dos arxius del mòdul, flippy.module i FlippyPager.php. En flippy.module es van afegir els dos camps necessaris, tenint en compte que a l'hora de crear el llistat de taxonomies per a les opcions del select, només haurem d'incloure aquelles que estiguin en el tipus de contingut:

// 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();

      }

    }

  }

}

A més, en FlippyPager.php es va modificar la query que realitza la recerca de continguts per construir la paginació, introduint la nova condició:

// 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);

 }

}

Per evitar problemes en el cas que un node no tingui un valor assignat per a la taxonomia per la qual filtrem, és convenient comprovar-ho davant d'afegir la condició.

Amb aquesta petita millora, ja podrem fer que el mòdul Flippy filtri els continguts per taxonomia.

El pegat es pot descarregar des d'aquí: https://www.drupal.org/project/flippy/issues/1497070#comment-12945412

Esperem que trobeu útil aquesta contribució!