Валидация формы Drupal не работает для меня

Я пытаюсь изменить некоторый код формы Drupal 6 и включить некоторую собственную проверку формы. Код выглядит так, но проверка не работает. Я даже не вхожу в функцию thisFormName_form_validate. У каких-нибудь друпалий есть хорошие идеи?

function thisFormName_form_alter(&$form, $form_state, $form_id) {
  $form['email_address'] = array(
    '#type' => 'textfield',
    '#title' => t('Enter your email address (optional)'),
    '#default_value' => $object['email_address'],
    '#weight' => 4,
    '#size' => 60,
    '#maxlength' => 128,  
    '#description' => t('Enter email address.'),
  );


function thisFormName_form_validate($node, &$form) {
  if ($form_state['values']['email_address'] == '') 
  {
    form_set_error('', t('Email must be valid format if entered.'));

  }
}

Ответы

Ответ 1

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

function myModule_form_alter(&$form, $form_state, $form_id) {
  $form['email_address'] = array(
    '#type' => 'textfield',
    '#title' => t('Enter your email address (optional)'),
    '#default_value' => $object['email_address'],
    '#weight' => 4,
    '#size' => 60,
    '#maxlength' => 128,  
    '#description' => t('Enter email address.'),
  );
  $form['#validate'][] = 'my_validation_function';
}


function my_validation_function(&$form, &$form_state) {
  if ($form_state['values']['email_address'] == '') {
    form_set_error('', t('Email must be valid format if entered.'));
  }
}

Drupal будет использовать по умолчанию только проверку, которая определяется как form_name + _validate. Это не так, поскольку вы используете hook_form_alter.

Ответ 2

EDIT: В основном тот же ответ, что и googletorps. Не заметил его во время публикации моего. Оставив его здесь для альтернативного объяснения, но он прав и был первым (+1).


Есть что-то подозрительное в названии вашей функции:

  • Как и во всех реализациях hook, ваша функция hook_form_alter должна быть названа после вашего настраиваемого модуля, а не после формы (например, yourModule_form_alter), и в этом случае он будет запускаться для всех форм. Если (как он выглядит) вы хотите только подключиться к определенной форме, используйте hook_form_FORM_ID_alter, заменив "hook" на ваше имя модуля, и "FORM_ID" с идентификатором (именем) формы, которую вы хотите манипулировать.

  • Обратные вызовы функции проверки для формы перечислены в виде массива имен функций в $form['#validate']. Это всего лишь удобный ярлык для созданных вами форм, которые вы явно не должны добавлять, но используйте функцию, названную после формы, добавив в конце "_validate". В вашем случае вы изменяете форму, исходящую из другого модуля, поэтому вам нужно явно добавить функцию проверки.

Итак, ваш код должен выглядеть примерно так:

function yourModuleName_theFormID_form_alter(&$form, $form_state, $form_id) {
  $form['email_address'] = array(
    '#type' => 'textfield',
    '#title' => t('Enter your email address (optional)'),
    '#default_value' => $object['email_address'],
    '#weight' => 4,
    '#size' => 60,
    '#maxlength' => 128,  
    '#description' => t('Enter email address.'),
  );
  // Add custom validation callback
  $form['#validate'][] = 'yourModuleName_theFormID_validate';


function yourModuleName_theFormID_validate(&$form, &$form_state) {
  if ($form_state['values']['email_address'] == '') {
    form_set_error('', t('Email must be valid format if entered.'));
  }
}