Modulo di convalida e-mail api


9

Qual è il modo migliore per gestire la convalida della posta elettronica sul lato server nell'API del modulo?
Può essere implementato da qualche parte all'interno del modulo descritto di seguito o ci sono altre opzioni?

 $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;
}

Risposte:


5

Crea una funzione di validazione per il tuo modulo. Ecco un esempio usando il tuo modulo. Ad esempio, supponiamo che il codice del modulo sia in una funzione chiamata 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
}
?>

Questa funzione ti permetterà di scrivere un codice personalizzato per determinare se i valori inseriti nei tuoi campi sono validi o meno. È inoltre possibile aggiungere una funzione di invio personalizzata per il modulo per eseguire il codice personalizzato durante l'invio del modulo.

Maggiori informazioni sulla convalida dei moduli in Convalida moduli , invio moduli in Invio moduli o leggi l'intero articolo per una migliore comprensione dell'API dei moduli: Guida rapida per l'API dei moduli


2
Esiste anche una funzione di validazione molto robusta integrata in Drupal: api.drupal.org/api/drupal/includes--common.inc/function/…
codexmas,

5

Invece di aggiungere un gestore di convalida del modulo al modulo, è possibile aggiungere un gestore di convalida all'elemento del modulo che deve essere convalidato: utilizzare #element_validate , che accetta un array di gestori di convalida che verrà applicato all'elemento del modulo.

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

Il gestore della convalida riceve tre argomenti: L'elemento del modulo in fase di convalida, $form_statel' $formarray e per il modulo contenente l'elemento del modulo. Il gestore della convalida deve chiamare form_error () o form_set_error () per segnalare eventuali errori di convalida.

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 non è una proprietà personalizzata, ma una proprietà Drupal. Il codice mostra va bene ed è una valida alternativa a quanto proposto da altre risposte, incluso quello che suggerisce una soluzione valida solo per il modulo Webform.
kiamlaluno

Uno dei vantaggi dell'utilizzo dell'approccio di @nmeegama è che rende il tuo codice molto più chiaro, invece di avere tutto in un unico validate ().
leymannx,

1
Un altro vantaggio dell'utilizzo della soluzione di @nmeegama è che il campo può essere riutilizzato anche in altre forme senza la necessità di riconvalidare.
Supriya Rajgopal,

Puoi anche riutilizzare il codice altrove, il che è utile se hai la stessa convalida per più elementi.
mbomb007,

3

Spiegato qui: 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.'));
}
?>

La pagina collegata mostra la soluzione per il modulo Webform.
kiamlaluno

0

Puoi semplicemente usare il modulo Elements e usare semplicemente 'emailfield' nella proprietà #type dell'elemento form, proprio come questo:

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

Semplicemente con il modulo elements, rendere la convalida personalizzata per un semplice campo e-mail non ha senso, non è necessario reinventare la ruota ...


0

Installa il modulo Campo e -mail e correggilo con la patch sul commento 16. Quindi utilizza il codice nella descrizione del problema collegato per definire il tuo campo e-mail con la convalida integrata:

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

0

In Drupal 8 Può essere convalidato dal seguente codice.

/**
 * {@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.'));
  }
}

C'è un'interfaccia per questo dal 8.7 https://www.drupal.org/node/2997196

Riferimento: https://www.drupal.org/node/2912661


-1

L'indirizzo e-mail può essere convalidato con il gestore di convalida del modulo

Se la funzione your_formdefinisce il tuo modulo, allora il gestore di convalida predefinito sarebbe your_form_validateo altrimenti puoi anche impostarlo manualmente

 $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'))
 }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.