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