【问题标题】:How to use form validation in Drupal 7如何在 Drupal 7 中使用表单验证
【发布时间】:2013-03-13 01:46:07
【问题描述】:

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

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

【问题讨论】:

    标签: forms validation drupal


    【解决方案1】:

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

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

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

    【讨论】:

    • 应该是$form['#submit']['#validate'][]吗?
    • 不,# 是用于属性而不是元素
    【解决方案2】:

    我会使用 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.'));
      }
    }
    

    【讨论】:

    • 为什么 form_error 比 form_set_error 更好?
    • 是的,为什么?请解释!
    【解决方案3】:

    您可以在此处使用任何验证功能 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')
     ); 
    

    【讨论】:

      【解决方案4】:

      您可以使用 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.'));
          }
      }
      

      【讨论】:

      • 这种情况下需要设置:$form['submit']['validate'][] ?
      • @sheldonkreger no , form_validate 是一个钩子。你提到的是定义一个在表单验证事件中调用的自定义回调函数
      【解决方案5】:

      我改变了这一行:

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

      到这里:

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

      它的作品!

      【讨论】:

        【解决方案6】:

        使用以下代码:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-26
          相关资源
          最近更新 更多