Чому навокал_форма_алтер () такий безлад?


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, використовуючи лише один?


1
де генерується цей масив $ форми? наскільки я знаю, у нас немає $ форми з цією структурою в mock_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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.