Почему hook_form_alter () так запутан?

Вот пример, с которым я столкнулся. Я пытаюсь поместить некоторый 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 с использованием только одного?

41 голос | спросил Joren 7 AMpSat, 07 Apr 2012 04:26:17 +040026Saturday 2012, 04:26:17

1 ответ


70

Что вы видите, так это то, как 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; который покажет вам, где именно в массиве находятся элементы, которые вы пытаетесь настроить.

ответил Clive 7 PMpSat, 07 Apr 2012 16:19:33 +040019Saturday 2012, 16:19:33

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132