11

我正在尝试在 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 语句从不打印。

我实际上已经被困了一段时间。我查了一些例子,我看不出我做错了什么。任何人?

4

6 回答 6

13

您需要将 #validate 属性附加到表单提交按钮,如下所示:

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

它会起作用然后我的示例不必与您的表单树完全匹配您应该搜索提交按钮数组并将此示例应用于它

于 2013-03-13T02:02:33.123 回答
4

而不是 form_set_error() 我会使用 form_error($form, t('Error message.'));

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.'));
  }
}
于 2013-05-28T02:38:32.717 回答
4

您可以在此处使用任何验证功能 https://api.drupal.org/api/drupal/includes!form.inc/7

列出的验证将是

  • date_validate - 验证日期类型以防止无效日期(例如,2006 年 2 月 30 日)。
  • 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')
 ); 
于 2013-08-23T05:37:50.237 回答
3

您可以使用 drupal API 中的函数 _form_validate

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

例子:

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.'));
    }
}
于 2015-04-01T10:10:37.920 回答
2

我改变了这一行:

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

对此:

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

它的作品!

于 2013-09-09T14:41:12.390 回答
-1

使用以下代码:

$form['submit']['#validate'][] = 'checkout_confirm_email_form_validate'
于 2014-04-15T12:48:44.697 回答