如何在Drupal 7中使用表单验证

时间:2013-03-13 01:46:08

标签: forms validation drupal

我正在尝试编辑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语句永远不会打印。

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

6 个答案:

答案 0 :(得分:12)

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

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

它会工作然后我的示例与您的表单树完全相同,您应该搜索提交按钮数组并将此示例应用于它

答案 1 :(得分:4)

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

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

答案 2 :(得分:4)

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

列出的验证将是

  • date_validate - 验证日期类型以防止无效日期 (例如,2006年2月30日)。
  • element_validate_integer -Form元素验证处理程序 整数元素。
  • 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')
 ); 

答案 3 :(得分: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.'));
    }
}

答案 4 :(得分:2)

我更改了这一行:

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

到此:

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

它有效!

答案 5 :(得分:-1)

使用以下代码:

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