Пользовательские поля, добавленные через api формы, не работают должным образом


У меня целая куча проблем с добавлением текстовых полей в форму в Drupal 6. Я хочу добавить текстовое поле с автозаполнением. Я попытался добавить поле в hook_form_alter() следующим образом:

$form['my_field_name'] = array(
  '#type' => 'textfield',
  '#title' => 'My Title',
  '#required' => true,
  '#default_value' => 'my_default_value',
  '#autocomplete_path' => 'url/to/autocomplete'
);
$output .= drupal_render($form['my_field_name']);

Когда я вывожу это, поле, выводимое в html, не имеет атрибута id или name, и автозаполнение не работает (предположительно, потому что идентификатор отсутствует. Кроме того, значение по умолчанию в этом поле не заполнено.

Я могу преодолеть некоторые из этих проблем, добавление пользовательского #идентификатора, #имени и #значения, например:

$form['my_field_name'] = array(
  '#type' => 'textfield',
  '#title' => 'My Title',
  '#id' => 'my_field_id',
  '#name' => 'my_field_name',
  '#required' => true,
  '#value' => 'my_default_value',
  '#autocomplete_path' => 'url/to/autocomplete'
);
$output .= drupal_render($form['my_field_name']);

Это позволяет автозаполнению работать должным образом, дает атрибут имени и идентификатора и заполняет значение по умолчанию, но, к сожалению, теперь автозаполнение фактически не изменяет значение поля, поэтому я не могу ввести и отправить новое значение.

Как я могу преодолеть эти проблемы с помощью form_alter?

 1
Author: Travis, 2011-09-06

2 answers

AFAIK, hook_form_alter() не требует, чтобы вы выполняли в нем drupal_render(). И я подозреваю, что именно поэтому вы не получаете надлежащего рендеринга для элемента.

Кроме того, каждое настраиваемое поле должно быть обработано (вами) при отправке формы. Таким образом, вам нужно добавить $form['#submit'][] = 'my_submit_function_submit';, где my_submit_function_submit() обрабатывает вставки базы данных.

 1
Author: zerolab, 2011-09-06 20:09:47

Не очень понятно, что вы делаете с переменной $output, так как возвращаемое значение из функции hook_form_alter() все равно не используется. zerolab правильно, что вы не должны использовать drupal_render, вы просто добавляете элементы в форму, и форма будет отображаться как единое целое сразу после того, как она была извлечена, изменена, построена и т. Д.

Хотя я не вижу, что происходит, мне интересно, не передаете ли вы аргумент $form по ссылке, и именно поэтому вы добавили drupal_render чтобы попытаться отобразить ваш элемент, убедитесь, что подпись для вашей функции выглядит следующим образом (обратите внимание на символы &):

function hook_form_alter(&$form, &$form_state, $form_id) {
 0
Author: Mikey P, 2011-09-06 21:24:51