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';