Ziel:
Für einen unserer Kunden müssen wir das Auswahlfeld in eine Checkbox-Liste umwandeln.
Wir haben uns dafür entschieden, dies zu unserem Modul „more_fields” hinzuzufügen, damit die Lösung auch für andere Projekte verfügbar ist.
Entwurf:
Wir haben uns dafür entschieden, unsere Logik auf den Filter „taxonomy_index_tid” (Filter, der vom Taxonomie-Modul bereitgestellt wird) zu stützen. Für unseren Filter fügen wir ein Widget hinzu, mit dem der Feldtyp (Auswahlfeld, Optionsfelder, Kontrollkästchen) ausgewählt werden kann.
Automatische Erstellung des Filter views:
Die Filter werden automatisch beim Neuaufbau des Drupal-Caches erstellt. Zwei Hooks ermöglichen diese Aktion ( hook_views_data_alter et hook_field_views_data_alter ). hook_field_views_data_alter ist in unserem Fall besser geeignet, da wir dies zu jedem Feld hinzufügen möchten, das auf einen Taxonomiebegriff verweist.
/**
*
* @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.')
]
];
}
}
}
}
}
Ergebnis hinsichtlich der Konfiguration Extras:
Hinweis:
Wenn Sie den Standardfilter ersetzen möchten, verwenden Sie diesen Ansatz und stellen Sie sicher, dass Ihr Hook als letzter ausgeführt wird. (Derzeit werden Hooks in alphabetischer Reihenfolge ausgeführt).
$data[$table_name][$field_name]['filter']['id'] = 'my_custom_module_plugin_filter_id';