Почему hook_form_alter () такой грязный?

40

Вот пример, с которым я только что столкнулся. Я пытаюсь поместить немного HTML в метку своего поля.

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

Почему есть три заполненных атрибута #title с использованием только одного?

Joren
источник
1
где генерируется этот массив $ form? насколько я знаю, у нас нет $ формы с этой структурой в hook_form_alter
Мохаммад Али Акбари
Спасибо тебе за это. Я вырывал свои волосы. Структура массива смешная.
JM01

Ответы:

72

То, что вы видите, это то, как Drupal представляет поля в форме. Это ломается так:

  • Дочерние элементы внешнего массива $form['field_back']['und']( 'und'для 'undefined') - это разные языки, на которые поле было переведено. В Drupal рекомендуется использовать LANGUAGE_NONEдля 'und'в коде.
  • $form['field_feedback']['und'][0]Дочерние элементы в каждом языковом массиве, например , представляют разные записи для поля. Например, если поле имеет неограниченное количество элементов и в этом поле есть несколько записей, они будут отображаться как $form['field_feedback']['und'][0], $form['field_feedback']['und'][1]и т. Д.
  • Наконец, у вас есть элемент (ы) ввода формы для самих значений полей, например $form['field_feedback']['und'][0]['value']. В этом случае имя столбца будет таким value, для типа поля ссылки на узел nid, и т. Д. Если с полем связано несколько столбцов данных, вы также увидите больше дочерних элементов. Они представлены текстовым полем / полем выбора / специальным виджетом и в конечном итоге будут предоставлять значение для поля.

Факт, что названия были добавлены к различным элементам в иерархии, является случайным, чтобы быть честным. Независимо от того, отображаются ли эти заголовки в форме, зависит от конкретных настроек массива рендеринга, в котором они #titleсодержатся.

Чтобы изменить заголовок фактического виджета формы, вам нужно беспокоиться только об элементе формы в самом низу массива: то есть о реальных элементах ввода ( $form['field_feedback']['und'][0]['value']и т. Д.).

Вероятно, стоит отметить, что элемент / виджет, используемый для определенного поля, может быть довольно сложным. Если у вас его еще нет, вы должны установить модуль Devel и использовать dpm()функцию для проверки $formмассива; это покажет вам, где именно в массиве находятся элементы, на которые вы пытаетесь нацелиться.

Клайв
источник
3
Короче говоря, добавление #title к чему-то, что Drupal не считает массивом API форм, не имеет никакого эффекта; даже в этом случае не говорится, что #title принимается во внимание, поскольку он не является атрибутом для всех элементов формы, которые реализует Drupal. API полей усложняет ситуацию, так как он добавляет обычный массив в массив форм, но это не смущает Drupal, который ищет #type для распознавания элемента формы.
kiamlaluno