我正在尝试编辑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语句永远不会打印。
我实际上已经被困了一段时间。我查了一些例子,我看不出我做错了什么。任何人吗?
答案 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
列出的验证将是
使用前
$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'