Пользовательские поля, добавленные через 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?
2 answers
AFAIK, hook_form_alter()
не требует, чтобы вы выполняли в нем drupal_render()
. И я подозреваю, что именно поэтому вы не получаете надлежащего рендеринга для элемента.
Кроме того, каждое настраиваемое поле должно быть обработано (вами) при отправке формы.
Таким образом, вам нужно добавить $form['#submit'][] = 'my_submit_function_submit';
, где my_submit_function_submit()
обрабатывает вставки базы данных.
Не очень понятно, что вы делаете с переменной $output, так как возвращаемое значение из функции hook_form_alter() все равно не используется. zerolab правильно, что вы не должны использовать drupal_render, вы просто добавляете элементы в форму, и форма будет отображаться как единое целое сразу после того, как она была извлечена, изменена, построена и т. Д.
Хотя я не вижу, что происходит, мне интересно, не передаете ли вы аргумент $form по ссылке, и именно поэтому вы добавили drupal_render чтобы попытаться отобразить ваш элемент, убедитесь, что подпись для вашей функции выглядит следующим образом (обратите внимание на символы &):
function hook_form_alter(&$form, &$form_state, $form_id) {