2013-03-13 42 views
10

我试图编辑Drupal Commerce中的结账表单,要求用户输入两次他们的电子邮件地址。当他们提交表格时,Drupal应该检查电子邮件是否匹配,如果不匹配,请致电form_set_error()。现在,我只是试图附加一个自定义验证功能的表单,我不能去工作。 (我的模块叫做checkout_confirm_email。这个模块仅供我们自己使用,所以我没有在这个名字上花费太多精力)。如何在Drupal 7中使用表单验证

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)。所以函数是form数组的一部分,但验证函数中的dsm语句从不打印。

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

回答

12

您需要的#validate属性附加到表单,提交按钮这样的:

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

,它会工作,那么就没有必要,我的例子是相同的匹配到窗体树你应该寻找提交按钮数组,并将其应用于此示例

+0

如果这是'$形式['#提交'] [' #验证'] []'? – user151841 2015-11-23 18:25:32

+0

不是#属性不适用于元素 – 2015-11-24 17:01:25

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

为什么form_error比form_set_error更适合此目的? – moopet 2015-12-11 16:11:36

+0

是的,为什么?请解释! – nerdoc 2015-12-22 23:36:56

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

的防爆我改变了这一行:

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

这样:

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

和它的作品!

-1

使用下面的代码:

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

您可以使用功能_form_validate从Drupal的API

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

在这种情况下,你需要设置:$ form ['submit'] ['validate'] []? – sheldonkreger 2015-06-11 16:53:03

+0

@sheldonkreger不,form_validate是一个钩子。你提到的是定义一个自定义的回调函数,在表单验证事件中被调用 – Matoeil 2015-06-29 12:00:26