跳转到主要内容
Drupal猎人 提交于 23 January 2015

在Drupal7里,拥有一个很好的表单验证功能,就是在表单里设置$form['#validate'][] = 'xxx_validate'; 比如我们以用户登录表单user_login验证为例, 通常我们看到的验证函数数组是这样的:  

form['#validate'] = (
	'user_login_name_validate',
	'user_login_authenticate_validate',
	'user_login_final_validate',
);

 

这是默认的用户验证数组,它们会一个个的执行,如果我们向额外增加我们自己定义的验证(比如当你想对第三方用户数据进行整合验证登录时),像这样:  

$form['#validate][] = 'my_form_validator';

 

那么,你这样做之后,你增加的验证方法将被放到最后才执行,而这样往往会引起一些错误: 比如像这种问题:http://drupal.stackexchange.com/questions/1295/last-form-validation-function-is-passing-an-error-even-though-the-first-one-regi 所以,我们需要正确的方法,就是把我们的验证方法放在user_login_final_validate验证之前,所以我们可以这样做  

// first let's define our replacement.
    $replace = array(
      'my_form_validator',
      'user_login_final_validate',
    );
   
    // now let's see if the array actually contains prey 
    if(in_array( 'user_login_final_validate', $form['#validate'])){
      // found it. But where is it in the array? 
      $key = 0;
   
      foreach( $form['#validate'] as $validator ){
        if($validator == 'user_login_final_validate'){
          break; 
          $key++;
        }
      }
      
      // $key now holds the index. So let's splice the array. 
      array_splice( $form['#validate'], $key, 1, $replace );
    }else{
      /* our prey isn't in the array so let's add it to the end
       * for the sake of this example */ 
      $form['#validate'][] = 'user_login_final_validate';
    }

猎人出品,必属精品 不要谢我,请叫我雷锋,再见,人家要回家写日记了!

Drupal 版本