Aller au contenu principal

Drupal 9 : Crrér un filtre de views pour champs taxonomie & liste

Objectif :

Nous avons besoin pour un de nos clients de changer le champs type select en une liste de checkbox. 
Nous avons opté d'ajouter cela à notre module more_fields afin que la solution puisse etre disponible pour d'autres projets.


Conception :

Nous avons opté d'assoir notre logique sur le filtre "taxonomy_index_tid" ( filtre fournie par le module taxonomie). Pour notre filtre nous allons ajouter un wiget permetttant de selectionner le type de champs (select, radios, checkbox).
 

Creation automatique du filtre views :

Les filtres sont automatiquement creer lors de la re-construction du cache de Drupal. Deux hooks permettant d'effectuer cette action ( hook_views_data_alter et hook_field_views_data_alter ). hook_field_views_data_alter est plus adapter dans notre cas de figure car nous souhaitons ajouter cela sur chaque champs faisant reference à un terme taxonomie.
 

/**
 *
 * @file
 * Provides views data for more_fields.module.
 */
use Drupal\field\FieldStorageConfigInterface;

/**
 * Implements hook_field_views_data_alter().
 *
 * Views integration for entity reference fields which reference taxonomy terms.
 * Adds a term relationship to the default field data.
 *
 * @see views_field_default_views_data()
 */
function more_fields_field_views_data_alter(array &$data, FieldStorageConfigInterface $field_storage) {
  if ($field_storage->getType() == 'entity_reference' && $field_storage->getSetting('target_type') == 'taxonomy_term') {
    foreach ($data as $table_name => $table_data) {
      foreach ($table_data as $field_name => $field_data) {
        if (isset($field_data['filter']) && $field_name != 'delta') {
          // Add filter CheckboxList.
          $data[$table_name]['more_fields_' . $field_name] = [
            'title' => t('Custom filter term taxonomy'),
            'group' => t('More fields'),
            'filter' => [
              'id' => 'more_fields_checkbox_list',
              'title' => 'More fields : ' . $field_storage->getLabel(),
              'field' => $field_name,
              'help' => t('Offers multiple select display format, radios, checkboxes.')
            ]
          ];
        }
      }
    }
  }
}

Resultat au niveau de la configuration extras :



Remarque : 

Si vous souhaitez remplacer le filtre par defaut utiliser cette approche et rassurer vous que votre hook est le dernier à etre executer. (pour le moment les hook s'executer par ordre alphabetique).

$data[$table_name][$field_name]['filter']['id'] = 'my_custom_module_plugin_filter_id';


 

Stephane K
Il y'a 1 year
Modifié
Il y'a 4 months
Loading ...