电子邮件验证表单API


9

使用表单API处理服务器端电子邮件验证的最佳方法是什么?
可以在下面描述的表单内部的某个地方实现它,还是有其他选择?

 $form['address']['mail'] = array(
   '#type' => 'textfield',
   '#title' => t('E-mail'),
   '#required' => TRUE,
   '#default_value' => $subscription->mail,
   '#maxlength' => 255,
 ); 

 $form['submit'] = array(
   '#type' => 'submit',
   '#value' => t('Versturen'),
 );

 return $form;
}

Answers:


5

为您的表单创建一个验证功能。这是使用表格的示例。例如,假设您的表单代码在一个名为的函数中my_email

<?php
function my_email() {
  $form = array();

  $form['address']['mail'] = array(
   '#type' => 'textfield',
   '#title' => t('E-mail'),
   '#required' => TRUE,
   '#default_value' => $subscription->mail,
   '#maxlength' => 255,
  ); 

  $form['submit'] = array(
   '#type' => 'submit',
   '#value' => t('Versturen'),
  );

  return $form;
}

function my_email_validate($form, &$form_state) {
  // YOUR CUSTOM VALIDATION CODE GOES HERE
 if (!valid_email_address($mail)) {
   form_set_error('submitted][email_address', t('The email address appears to be invalid.'));
   }
}

function my_email_submit($form, &$form_state) {
  // YOUR CUSTOM SUBMIT CODE GOES HERE
}
?>

此功能使您可以编写自定义代码来确定在字段中输入的值是否有效。您还可以为表单添加自定义提交功能,以在提交表单时执行自定义代码。

在“ 验证表单”中阅读有关验证表单的更多信息,在“ 提交表单”中阅读提交表单的信息,或阅读整篇文章,以更好地理解Forms API:Form API快速入门指南


2
Drupal内置了一个非常强大的验证功能:api.drupal.org/api/drupal/includes--common.inc/function/…– codexmas 2011
6

5

可以在表单元素上添加验证处理程序,而不是向表单添加表单验证处理程序:使用#element_validate,它接受将应用于表单元素的一系列验证处理程序。

$form['email'] = array(
  '#type' => 'textfield',
  '#title' => 'Email',
  '#required' => TRUE,
  '#element_validate' => array('myelement_email_validate')
);

验证处理程序接收三个参数:要验证的form元素,$form_state$form包含form元素的表单数组。验证处理程序应调用form_error()form_set_error()报告任何验证错误。

function myelement_email_validate($element, &$form_state, $form) {
  $value = $element['#value'];
  if (!valid_email_address($value)) {
    form_error($element, t('Please enter a valid email address.'));
  }
}

1
#element_validate不是自定义属性,而是Drupal属性。显示代码很好,它是对其他答案所提出建议的有效替代,其中包括建议仅对Webform模块有效的解决方案。
kiamlaluno

使用@nmeegama的方法的优点之一是它使您的代码看起来更加清晰,而不是将所有内容都放在一个大的validate()中。
leymannx

1
使用@nmeegama解决方案的另一个优势是,该字段也可以其他形式重用,而无需重新验证。
Supriya Rajgopal'2

您还可以在其他地方重用代码,如果您对多个元素具有相同的验证,则很好。
mbomb007 '19

3

在这里解释:http : //drupal.org/node/279127

<?php
$mail = $form_values['submitted_tree']['email_address'];
if (!valid_email_address($mail)) {
  form_set_error('submitted][email_address', t('The email address appears to be invalid.'));
}
?>

链接的页面显示了Webform模块的解决方案。
kiamlaluno

0

您可以只使用Elements模块,而仅使用form元素的#type属性中的'emailfield',如下所示:

 $form['YOUR_FIELD_KEY'] = array(
    '#type' => 'emailfield',
    '#title' => t('Email'),
    '#size' => 20,
    '#maxlength' => 20,
    '#description' => t('Enter a valid email'),
    '#required' => TRUE,
  );

只需使用元素模块那么简单,对简单的电子邮件字段进行自定义验证就没有意义,您不必重新发明轮子。


0

安装电子邮件字段模块,并使用注释16中的补丁对其进行修补。然后使用链接的问题描述中的代码使用内置验证来定义您的电子邮件字段:

$form['email'] = array(
    '#type' => 'email',
    '#title' => t('Email'),
    '#required' => TRUE,
    '#default_value' => "",
    '#description' => "Please enter your email.",
    '#size' => 20,
    '#maxlength' => 20,
  );

0

在Drupal 8中,可以通过以下代码进行验证。

/**
 * {@inheritdoc}
 */
public function validateForm(array &$form, FormStateInterface $form_state) {
  // Validate email
  if (!\Drupal::service('email.validator')->isValid($form_state->getValues()['email'])) {
     $form_state->setErrorByName('Email', $this->t('Email address is not a valid one.'));
  }
}

自8.7开始就有接口https://www.drupal.org/node/2997196

参考:https : //www.drupal.org/node/2912661


-1

可以使用您的表单验证处理程序来验证电子邮件地址

如果函数your_form定义了表单,则默认验证处理程序为your_form_validate,否则您也可以手动设置

 $form['#validate'] = array('callback_to_validate');


 function your_form_validate($form, $form_state){
   if(!filter_var($form_state['values']['mail'], FILTER_VALIDATE_EMAIL))
     form_set_error('email', t('Invalid Email Address'))
 }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.