Drupal: Label eines Views Exposed Filter Forms ändern

Heute mal wieder ein Beitrag aus der Drupal-Hölle. Ich arbeite nun seit einem Jahr mit Drupal und bin immer noch fasziniert, wie unglaublich aufwändig selbst die simpelsten Dinge sein können. Über die letzten Jahre ist Drupal einfach krass komplex geworden. Es hilft auch nicht, dass es Drupal seit 23 Jahren oder so gibt und man entsprechend viele veraltete Tutorials und Foreneinträge findet.

Das Problem

Ich habe eine View, nennen wir sie „jf_events“, welche mir Nodes vom Typ „Event“ anzeigt. Sie enthält einige Filter, welche als „Hervorgehobenes Formular“ („exposed form“) angezeigt werden. Um die Seite fexibel gestalten zu können, kann man diese Filter als eigenen Block („Hervorgehobenes Formular: jf_events-block_1″) auf der Seite platzieren, unabhängig von der Ausgabe der View. Das ganze auf einer Seite platziert sieht so aus:

Das Label des Feldes „field_event_type“ lautet „Veranstaltungsart“, und natürlich kann ich es in der Definition der View ändern oder übersetzen. Aber nehmen wir mal an, die gleiche View wird an verschiedenen Stellen eingesetzt und ich möchte das Label nur an einer dieser Stellen ändern. Einfach, denkt man sich, es ist ein Formular und dazu gibt es ja Form-Alter-Hooks.

Sackgassen

Wenn man nach „drupal views exposed filter form change label“ oder so sucht, findet man auch haufenweise Tips welche auf eine Lösung wie diese hinauslaufen (in einem Modul „mymodule“):

/**
 * Implements hook_form_FORM_ID_alter().
 */
function mymodule_form_views_exposed_form_alter(&$form, FormStateInterface $form_state, $form_id): void {
  if ($form['#id'] === 'views-exposed-form-jf-events-block-1') {
    $form['field_event_type']['#title'] = 'My changed label';
  }
}

Tja, stellt sich aber heraus, dass das nicht funktioniert. Mit XDebug sieht man, dass $form zwar die Options des Selects enthält und dass man alles mögliche ergänzen kann (CSS-Klasse, Feld auf disabled setzen etc.), aber dass dort nirgends ein Label zu sehen ist. Ich habe alle möglichen Variationen probiert, auch die üblichen widget-Subkeys, die man aus anderen Formularen kennt. Ich habe im Views-Code herumgewühlt und versucht zu verstehen, wann denn wie die Label ergänzt werden. Aber keine Chance.

Die Lösung

Am Ende hat es geholfen, mit einem Kollegen zusammen draufzuschauen. Dabei fiel mir der unscheinbare Array-Eintrag „#info“ ins Auge. Und tatsächlich, dort drin stecken die Label! Und so sieht dann der Hook aus, mit dem man das Label anpassen kann:

/**
 * Implements hook_form_FORM_ID_alter().
 */
function mymodule_form_views_exposed_form_alter(&$form, FormStateInterface $form_state, $form_id): void {
  if ($form['#id'] === 'views-exposed-form-jf-events-block-1') {
    $form['#info']['filter-field_event_type']['label'] = 'Art der Veranstaltung';
  }
}

Und schon:

So einfach ist es. Zwei, drei Stunden googlen und debuggen für die paar Zeilen. Danke für nix, Drupal!

Ach ja, weil Drupal so alt ist und vermutlich noch älter wird: Diese Lösung wurde unter Drupal 9.5 getetest.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Bitte beachte die Kommentarregeln: 1) Kein Spam, und bitte höflich bleiben. 2) Ins Namensfeld gehört ein Name. Gerne ein Pseudonym, aber bitte keine Keywords. 3) Keine kommerziellen Links, außer es hat Bezug zum Beitrag. mehr Details...

So, noch mal kurz drüber schauen und dann nichts wie ab damit. Vielen Dank fürs Kommentieren! :-)