Warum ist hook_form_alter () so chaotisch?

40

Hier ist ein Beispiel, auf das ich gerade gestoßen bin. Ich versuche, HTML in die Beschriftung 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?

Joren
quelle
1
Wo wird dieses $ form-Array generiert? wie ich weiß haben wir keine $ form mit dieser struktur in hook_form_alter
Mohammad Ali Akbari
Danke dafür. Ich zog mir die Haare aus. Die Array-Struktur ist lächerlich.
JM01

Antworten:

72

Sie sehen, wie Drupal Felder in einem Formular darstellt. Es bricht so zusammen:

  • Die Kinder 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_NONEfür 'und'Code zu verwenden.
  • Die untergeordneten Elemente in jedem Spracharray $form['field_feedback']['und'][0]repräsentieren z. B. die verschiedenen Einträge für das Feld. Wenn zum Beispiel ein Feld unbegrenzte Mächtigkeit hat, und es gibt mehrere Einträge für das Feld, werden sie als zeigen $form['field_feedback']['und'][0], $form['field_feedback']['und'][1]usw.
  • Schließlich haben Sie das oder die Formulareingabeelemente für die Feldwerte selbst, z $form['field_feedback']['und'][0]['value']. In diesem Fall lautet der Spaltenname valuefür einen Knotenreferenzfeldtyp nidusw. 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 Hierarchie Titel hinzugefügt wurden, ist übrigens ehrlich. Ob diese Titel im Formular angezeigt werden oder nicht, hängt von den jeweiligen Einstellungen des Render-Arrays ab, in dem sie #titleenthalten sind.

Um den Titel im eigentlichen Formular-Widget zu ändern, müssen Sie sich nur um das Formularelement am unteren Rand des Arrays kümmern: die eigentlichen Eingabeelemente ( $form['field_feedback']['und'][0]['value']usw.).

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

Clive
quelle
3
Kurz gesagt, das Hinzufügen von #title zu etwas, das Drupal nicht als Formular-API-Array ansieht , hat keine Auswirkung. selbst in diesem Fall wird nicht gesagt, dass #title berücksichtigt wird, da es nicht für alle von Drupal implementierten Formularelemente ein Attribut ist. Die Feld-API erschwert die Sache, da sie dem Formular-Array ein normales Array hinzufügt, aber das verwirrt Drupal nicht, das nach #type sucht , um ein Formularelement zu erkennen.
kiamlaluno