2013-03-13 22 views
10

Sto tentando di modificare il modulo di checkout in Drupal Commerce, per richiedere a un utente di inserire il proprio indirizzo email due volte. Quando inviano il modulo, Drupal dovrebbe verificare se le e-mail corrispondono, e chiamare lo form_set_error() in caso contrario. Per ora, sto solo cercando di allegare una funzione di convalida personalizzata al modulo, che non riesco a far funzionare. (Il mio modulo è chiamato checkout_confirm_email. Questo modulo è solo per uso personale, quindi non ho messo molto impegno nel nome).Come utilizzare la convalida del modulo in Drupal 7

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..."); 
} 

Le uscite dprint_r statment Array ([0] => checkout_confirm_email_form_validate). Quindi la funzione fa parte dell'array del modulo, ma l'istruzione dsm nella funzione di convalida non viene mai stampata.

Sono stato bloccato per un po '. Ho cercato degli esempi e non riesco a vedere cosa sto sbagliando. Chiunque?

risposta

12

è necessario collegare la proprietà #validate alla forma pulsante di invio in questo modo:

$form['submit']['#validate'][] = 'checkout_confirm_email_form_validate' 

E che funzionerà allora non è necessario che il mio esempio è identico match per il vostro albero di modulo si dovrebbe cercare l'array di pulsanti di invio e applica questo esempio ad esso

+0

questo dovrebbe essere '$ form [ '# presentare '] [' # validate '] [] '? – user151841

+0

No il # è per gli attributi non per gli elementi –

4

Invece di form_set_error() userei form_error ($ form, t ('Error message.'));

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.')); 
    } 
} 
+0

Perché form_error è migliore di form_set_error per questo scopo? – moopet

+0

Sì, perché? Spiega per favore! – nerdoc

4

è possibile utilizzare qualsiasi funzione validate qui https://api.drupal.org/api/drupal/includes!form.inc/7

Le convalide di cui sarebbero

  • date_validate - convalida il tipo di data per evitare che le date non valide (ad esempio, 30 febbraio 2006) .
  • element_validate_integer - Gestore di convalida degli elementi di formattazione per gli elementi interi .
  • element_validate_integer_positive - Modulo elemento di convalida del gestore
    per gli elementi che devono essere interi positivi
  • element_validate_number - Gestore del modulo di validazione elemento per elementi numerici.
  • password_confirm_validate - Convalida un elemento password_confirm.

Ex di utilizzo

$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') 
); 
2

Ho cambiato questa linea:

$form['submit']['#validate'][] = 'checkout_confirm_email_form_validate' 

a questo:

$form['actions']['submit']['#validate'][] = 'checkout_confirm_email_form_validate'; 

Ed è funziona!

-1

utilizzare il seguente codice:

$form['submit']['#validate'][] = 'checkout_confirm_email_form_validate' 
2

è possibile utilizzare la funzione di _form_validate da API Drupal

https://api.drupal.org/api/drupal/includes!form.inc/function/_form_validate/7 

exemple:

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.')); 
    } 
} 
+0

In questo caso, è necessario impostare: $ form ['submit'] ['validate'] []? – sheldonkreger

+0

@sheldonkreger no, form_validate è un hook. quello che stai citando è la definizione di una funzione di richiamata personalizzata da chiamare all'evento di convalida del modulo – Matoeil

Problemi correlati