Форма подтверждения по электронной почте 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;
}
JurgenR
источник

Ответы:

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
}
?>

Эта функция позволит вам написать собственный код, чтобы определить, являются ли значения, введенные в ваши поля, действительными или нет. Вы также можете добавить пользовательскую функцию отправки для вашей формы для выполнения пользовательского кода во время отправки формы.

Подробнее о проверке форм см. В разделе Проверка форм , отправка форм в разделе Отправка форм или прочитайте статью целиком, чтобы лучше понять API форм: Краткое руководство по API форм

Laxman13
источник
2
В Drupal также встроена
codexmas
5

Вместо добавления обработчика проверки формы в форму, вы можете добавить обработчик проверки к элементу формы, который необходимо проверить: используйте #element_validate , который принимает массив обработчиков проверки, которые будут применены к элементу формы.

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

Обработчик проверки получает три аргумента: проверяемый элемент формы $form_stateи $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.'));
  }
}
nmeegama
источник
1
#element_validate - это не пользовательское свойство, а свойство Drupal. Шоу-код в порядке, и он является действительной альтернативой тому, что предлагалось из других ответов, включая тот, который предлагает решение, которое действительно только для модуля Webform.
kiamlaluno
Одно из преимуществ использования подхода @ nmeegama заключается в том, что он делает ваш код более понятным, вместо того, чтобы иметь все в одном большом validate ().
leymannx
1
Еще одно преимущество использования решения @ nmeegama заключается в том, что поле можно повторно использовать в других формах без необходимости повторной проверки.
Суприя Раджгопал
Вы также можете повторно использовать код в другом месте, что хорошо, если у вас одинаковая проверка для нескольких элементов.
mbomb007
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.'));
}
?>
artfulrobot
источник
На связанной странице показано решение для модуля Webform.
kiamlaluno
0

Вы можете просто использовать модуль Elements и просто использовать 'emailfield' в свойстве #type элемента формы, вот так:

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

Просто так легко с модулем элементов, делать пользовательскую проверку для простого поля электронной почты не имеет смысла, вам не нужно изобретать велосипед ...

svelandiag
источник
0

Установите модуль Email Field и исправьте его с помощью исправления в комментарии 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

miststudent2011
источник
-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'))
 }
Шоаиб Наваз
источник