在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 版本