Dlaczego hook_form_alter () jest taki niechlujny?

40

Oto przykład, na który właśnie wpadłem. Próbuję umieścić HTML w etykiecie mojego pola.

$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)

Dlaczego są trzy wypełnione atrybuty #title, z których tylko jeden jest używany?

Joren
źródło
1
gdzie generowana jest tablica $ form? jak wiem, nie mamy formy $ z tą strukturą w hook_form_alter
Mohammad Ali Akbari
Dziękuję Ci za to. Wyciągałam włosy. Struktura tablicy jest niedorzeczna.
JM01,

Odpowiedzi:

72

Widzisz, jak Drupal reprezentuje pola w formularzu. Rozkłada się w następujący sposób:

  • Elementy potomne zewnętrznej tablicy $form['field_back']['und']( 'und'dla 'undefined') są różnymi językami, na które zostało przetłumaczone pole. W Drupal, zaleca się stosowania LANGUAGE_NONEdo 'und'w kodzie.
  • Dzieci wewnątrz każdej tablicy językowej, np. $form['field_feedback']['und'][0], Reprezentują różne wpisy dla pola. Na przykład, jeśli pole ma nieograniczoną liczność, i istnieje kilka wpisów dla tej dziedzinie, będą one pokazać, jak $form['field_feedback']['und'][0], $form['field_feedback']['und'][1]itp
  • Wreszcie masz elementy wejściowe formularza, dla samych wartości pól, np $form['field_feedback']['und'][0]['value']. W tym przypadku nazwa kolumny to value, dla typu pola odwołania do węzła nid, i tak dalej. Jeśli pole ma wiele kolumn danych powiązanych z nim, zobaczysz także więcej dzieci. Są one reprezentowane przez pole tekstowe / pole wyboru / specjalny widget i ostatecznie podadzą wartość pola.

Szczerze mówiąc, fakt, że tytuły zostały dodane do różnych elementów w całej hierarchii, jest przypadkowy. To, czy te tytuły są wyświetlane w formularzu, zależy od określonych ustawień tablicy renderowania, w której każdy #titlejest zawarty.

Aby zmienić tytuł w widżecie formularza, musisz się martwić o element formularza na samym dole tablicy: tj. O rzeczywiste elementy wejściowe ( $form['field_feedback']['und'][0]['value']itp.).

Prawdopodobnie warto zauważyć, że element / widżet użyty do określonego pola może być dość złożony. Jeśli jeszcze go nie masz, zainstaluj moduł Devel i użyj dpm()funkcji do sprawdzenia $formtablicy; który pokaże dokładnie, gdzie w tablicy są elementy, na które próbujesz trafić.

Clive
źródło
3
Krótko mówiąc, dodanie #title do czegoś, czego Drupal nie uważa za tablicę API formularza, nie ma żadnego efektu; nawet w takim przypadku nie jest powiedziane, że #title jest brany pod uwagę, ponieważ nie jest to atrybut wszystkich elementów formularza implementowanych przez Drupala. API pola komplikuje sprawy, ponieważ dodaje normalną tablicę do tablicy formularzy, ale to nie myli Drupala, który szuka #type , do rozpoznawania elementu formularza.
kiamlaluno