Проверка формы Drupal не работает для меня - PullRequest
13 голосов
/ 04 марта 2010

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

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.'));

  }
}

Ответы [ 2 ]

13 голосов
/ 04 марта 2010

Поскольку вы используете форму 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.

5 голосов
/ 04 марта 2010

РЕДАКТИРОВАТЬ: в основном тот же ответ, что и googletorps. Не заметил его при публикации моего. Оставив его здесь для альтернативного объяснения, но он правильный и был первым (+1).


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

  • Как и во всех реализациях ловушек, ваша функция hook_form_alter должна быть названа в честь вашего пользовательского модуля, а не после формы (например, yourModule_form_alter), в этом случае она будет срабатывать для все формы. Если (как это выглядит) вы хотите подключиться только к определенной форме, используйте hook_form_FORM_ID_alter, заменив «hook» на имя вашего модуля и «FORM_ID» на 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.'));
  }
}
...