Где хранится значение в текстовом поле формы?


Я создал простую форму, которая отображает текстовое поле и кнопку отправки. Текстовое поле определено:

$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
Author: Ashlar, 2011-12-15

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,
);
 3
Author: wiifm, 2011-12-16 05:24:06

Если вы сравните код 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';
    }
    // …
  }
 1
Author: kiamlaluno, 2011-12-16 05:44:29