Где хранится значение в текстовом поле формы?
Я создал простую форму, которая отображает текстовое поле и кнопку отправки. Текстовое поле определено:
$form['upload_file'] = array(
'#type' => 'textfield',
'#title' => t('File to read')
);
Когда я ввожу "тест" в текстовое поле и нажимаю кнопку "Отправить", форма переходит к функции проверки, которая имеет следующий код:
$answer = $form_state['values']['upload_file'];
if (!$answer) {
form_set_error('upload_file', "Please enter a file name: ");
}
И я получаю сообщение об ошибке, указывающее, что $answer пуст. У меня неправильное расположение массива для сохраненного текста текстового поля? Или есть что-то еще, что мне нужно сделать, чтобы поместить ценности в форма ито массива значений?
2 answers
Самый простой способ отладки проблем, связанных с формой, который я нашел, - это использовать модуль devel
drush dl devel && drush en devel -y
Этот модуль предоставляет целый ряд полезных функций. Например, в вашем случае вы могли бы использовать это в своей функции проверки:
dsm($form_state['values']);
Это позволило бы напечатать прекрасный форматированный массив всех значений в форме. Оттуда вы можете перейти к требуемому значению.
Я считаю, что вам следует проверить:
if (empty(trim($form_state['values']['field_upload_file']))) {
form_set_error('upload_file', "Please enter a file name: ");
}
Или, в качестве альтернативы, если вы просто проверяете, чтобы посмотрите, есть ли в текстовом поле просто значение , тогда лучшим подходом было бы использовать FAPI и объявить:
$form['upload_file'] = array(
'#type' => 'textfield',
'#title' => t('File to read'),
'#required' => TRUE,
);
Если вы сравните код search_form() с кодом search_form_validate(), вы заметите следующий код:
$form['basic'] = array(
'#type' => 'container',
'#attributes' => array('class' => array('container-inline')),
);
$form['basic']['keys'] = array(
'#type' => 'textfield',
'#title' => $prompt,
'#default_value' => $keys,
'#size' => $prompt ? 40 : 20,
'#maxlength' => 255,
);
function search_form_validate($form, &$form_state) {
form_set_value($form['basic']['processed_keys'], trim($form_state['values']['keys']), $form_state);
}
В вашем случае обработчик проверки получает доступ к отправленному значению с помощью $form_state['values']['upload_file']
.
Если код вашего обработчика проверки не выполняется, то Drupal не вызывает его. Это может быть обработчик проверки, у которого нет правильного имени, или другой модуль перезаписывает обработчик проверки другим один.
Чтобы заметить, что обработчик проверки по умолчанию, FORM_ID_validate()
(замените "FORM_ID" идентификатором формы), используется, когда другие обработчики проверки не установлены. Код drupal_prepare_form()
, используемый для установки обработчика проверки, следующий:
if (!isset($form['#validate'])) {
// Ensure that modules can rely on #validate being set.
$form['#validate'] = array();
// Check for a handler specific to $form_id.
if (function_exists($form_id . '_validate')) {
$form['#validate'][] = $form_id . '_validate';
}
// …
}