it-swarm.com.de

Warum ist hook_form_alter () so chaotisch?

Hier ist ein Beispiel, auf das ich gerade gestoßen bin. Ich versuche, HTML in die Bezeichnung meines Feldes einzufügen.

$form['field_feedback']['und']['#title'] <- has the title
$form['field_feedback']['und'][0]['#title'] <- has the title
$form['field_feedback']['und'][0]['value']['#title'] <- has the title. (Works)

Warum gibt es drei ausgefüllte # title-Attribute, von denen nur eines verwendet wird?

39
Joren

Was Sie sehen, ist, wie Drupal Felder in einem Formular darstellt. Es bricht folgendermaßen zusammen:

  • Die untergeordneten Elemente des äußeren Arrays $form['field_back']['und'] ('und' Für 'undefined') Sind die verschiedenen Sprachen, in die das Feld übersetzt wurde. In Drupal wird empfohlen, LANGUAGE_NONE Für 'und' Im Code zu verwenden.
  • Die Kinder in jedem Spracharray, z. $form['field_feedback']['und'][0] Stellen die verschiedenen Einträge für das Feld dar. Wenn ein Feld beispielsweise eine unbegrenzte Kardinalität aufweist und für dieses Feld mehrere Einträge vorhanden sind, werden diese als $form['field_feedback']['und'][0], $form['field_feedback']['und'][1] Usw. angezeigt.
  • Schließlich haben Sie die Formulareingabeelemente für die Feldwerte selbst, z. $form['field_feedback']['und'][0]['value']. In diesem Fall lautet der Spaltenname value, für einen Knotenreferenzfeldtyp wäre es nid und so weiter. Wenn einem Feld mehrere Datenspalten zugeordnet sind, werden auch mehr untergeordnete Elemente angezeigt. Diese werden durch ein Textfeld/Auswahlfeld/spezielles Widget dargestellt und liefern letztendlich den Wert für das Feld.

Die Tatsache, dass den verschiedenen Elementen in der gesamten Hierarchie Titel hinzugefügt wurden, ist zufällig, um ehrlich zu sein. Ob diese Titel im Formular angezeigt werden oder nicht, hängt von den jeweiligen Einstellungen des Render-Arrays ab, in dem jedes #title Enthalten ist.

Um den Titel im eigentlichen Formular-Widget zu ändern, müssen Sie sich nur um das Formularelement ganz unten im Array kümmern: d. H. Um die tatsächlichen Eingabeelemente ($form['field_feedback']['und'][0]['value'] Usw.).

Es ist wahrscheinlich erwähnenswert, dass das für ein bestimmtes Feld verwendete Element/Widget sehr komplex sein kann. Wenn Sie es noch nicht haben, sollten Sie das Devel-Modul installieren und die Funktion dpm() verwenden, um das Array $form Zu überprüfen. Das zeigt Ihnen genau, wo im Array sich die Elemente befinden, auf die Sie abzielen möchten.

71
Clive