Как использовать проверку формы в Drupal 7

Я пытаюсь изменить форму выписки в Drupal Commerce, чтобы потребовать, чтобы пользователь дважды вводил свой адрес электронной почты. Когда они отправляют свою форму, Drupal должен проверить, соответствуют ли письма, и называть form_set_error(), если они этого не делают. На данный момент я просто пытаюсь подключить к форме специальную функцию проверки, которую я не могу заставить работать. (Мой модуль называется checkout_confirm_email. Этот модуль предназначен только для нашего использования, поэтому я не приложил много усилий к названию).

function checkout_confirm_email_form_alter(&$form, &$form_state, $form_id) {
if($form_id == 'commerce_checkout_form_checkout') {
    $form['#validate'][] = 'checkout_confirm_email_form_validate';
    dprint_r($form['#validate']);
    dsm("I printed");
}
}

function checkout_confirm_email_form_validate($form, &$form_state) {    
    dsm("Never prints...");
}

Вывод состояния dprint_r выводит Array ([0] => checkout_confirm_email_form_validate). Таким образом, эта функция является частью массива форм, но оператор dsm в функции проверки никогда не печатает.

Я действительно застрял на некоторое время. Я искал примеры, и я не вижу, что я делаю неправильно. Кто-нибудь?

Ответ 1

Вам нужно прикрепить свойство #validate к кнопке отправки формы следующим образом:

$form['submit']['#validate'][] = 'checkout_confirm_email_form_validate'

И это будет работать, тогда не обязательно, чтобы мой пример был идентичен вашему дереву форм, вам следует искать массив кнопки отправки и применить к нему этот пример

Ответ 2

Вместо form_set_error() я бы использовал form_error ($ form, t ('Сообщение об ошибке.'));

function checkout_confirm_email_form_alter(&$form, &$form_state, $form_id) {
  if($form_id == 'commerce_checkout_form_checkout') {
    $form['#validate'][] = 'checkout_confirm_email_form_validate';
    dpm($form['#validate']);
    dsm("I printed");
  }
}

function checkout_confirm_email_form_validate(&$form, &$form_state) {
  // Not sure the exact email field
  if(empty($form['submitted']['mail']['#value'])){
    dsm("Should see me now and return to the form for re-submission.");
    form_error($form, t('Username or email address already in use.'));
  }
}

Ответ 3

Вы можете использовать любую функцию проверки подлинности здесь https://api.drupal.org/api/drupal/includes!form.inc/7

Перечисленные валидации будут

  • date_validate - проверяет тип даты, чтобы предотвратить недопустимые даты (например, 30 февраля 2006 г.).
  • element_validate_integer - обработчик проверки элемента элемента для целые элементы.
  • element_validate_integer_positive - Обработчик проверки элемента элемента формы
    для целых элементов, которые должны быть положительными
  • element_validate_number - обработчик проверки элемента формы для число элементов.
  • password_confirm_validate - проверяет элемент password_confirm.

Пример использования

$form['my_number_field'] = array(
  '#type' => 'textfield',
  '#title' => t('Number'),
  '#default_value' => 0,
  '#size' => 20,
  '#maxlength' => 128,
  '#required' => TRUE,
  '#element_validate' => array('element_validate_number')
 ); 

Ответ 4

Я изменил эту строку:

$form['submit']['#validate'][] = 'checkout_confirm_email_form_validate' 

:

$form['actions']['submit']['#validate'][] = 'checkout_confirm_email_form_validate';

И он работает!

Ответ 5

вы можете использовать функцию _form_validate из drupal API

 https://api.drupal.org/api/drupal/includes!form.inc/function/_form_validate/7

Exemple:

function my_form_form($form, &$form_state) {
       //code to generate the form
 }


function my_form_form_validate($form, &$form_state) {
    //use of API function valid_email_adress
    if ((valid_email_address($form_state['values']['field_candid_email']))===false)
         form_set_error('field_candid_email', t('Le champ courriel est invalide.'));    

    if (!(is_numeric($form_state ['values'] ['field_candid_montant']))) {       
        form_set_error('field_candid_montant', t('Le champ montant demandé doivent être de type numérique.'));
    }
}

Ответ 6

Используйте следующий код:

$form['submit']['#validate'][] = 'checkout_confirm_email_form_validate'