Come posso usare form_set_error () nel modo giusto?


8

Nel mio modulo Drupal 7, ho un modulo e i suoi gestori di validazione. Chiamo il mio modulo da un field.tpl.php con print render(drupal_get_form('my_form')); funziona come previsto.

Il problema è in caso di valore di input errato.

Richiede due invii errati prima di visualizzare il messaggio di errore: La prima volta, c'è un bordo rosso attorno al mio input errato, e la seconda volta, viene visualizzato il messaggio di errore (con il bordo rosso).

Allora, qual è il modo giusto di usare form_set_error()?


Non c'è una drupal_set_error()funzione. Sei sicuro di non volere dire form_set_error()?
kiamlaluno

Hai ragione! Intendo form_set_error ()! Provo ad aggiornare il primo post.
Druvik,

Risposte:


6

I costruttori di moduli non devono essere chiamati all'interno di un file modello, poiché vengono chiamati troppo tardi. Durante la chiamata render(drupal_get_form('my_form')), il codice che esegue il rendering dei messaggi di errore è stato eseguito e gli eventuali messaggi di errore segnalati dal gestore della convalida vengono salvati nella sessione corrente da drupal_set_message () , da cui viene chiamato form_set_error().

Il codice per stampare il messaggio di errore si trova nel file page.tpl.php .

<?php if ($breadcrumb): ?>
  <div id="breadcrumb"><?php print $breadcrumb; ?></div>
<?php endif; ?>

<?php print $messages; ?>

Il codice drupal_set_message()che salva i messaggi da mostrare è il seguente:

  if ($message) {
    if (!isset($_SESSION['messages'][$type])) {
      $_SESSION['messages'][$type] = array();
    }

    if ($repeat || !in_array($message, $_SESSION['messages'][$type])) {
      $_SESSION['messages'][$type][] = $message;
    }

    // Mark this page as being uncacheable.
    drupal_page_is_cacheable(FALSE);
  }

Ok. Capisco che l'utilizzo form_set_error()in un file modello è sbagliato. Allora, qual è la strada giusta?
Druvik,

1
drupal_get_form()non dovrebbe essere chiamato all'interno di un file modello, ma all'interno di un modulo.
kiamlaluno

Ok, l'ho inserito in un modulo e ho usato Display Suite per visualizzarlo nella mia pagina. Grazie.
Druvik,

Dovresti contrassegnarlo come la risposta corretta se ti ha aiutato.
Malks,

8

Si dovrebbe essere guardando form_set_error invece

se hai un elemento come questo:

function my_custom_module_form() {
  $form = array();
  $form['my_element'] = array(
    '#type' => 'textfield',
    '#title' => 'My Text field',
    '#default_value' => 'Some default text.',
  );
  return $form;
}

nella funzione di callback di convalida, eseguire questa operazione se si rileva che i valori in $form_state['values']non sono validi

function my_custom_module_form_validate($form, &$form_state) {
  // Do some checking on $form_state['values'], if you don't like it.
  form_set_error('my_element', 'This is the error message that will be displayed.');
}

In effetti, questa è la funzione che uso. (Correggo l'errore dal mio primo post).
Druvik,

1

form_set_error()dovrebbe essere chiamato all'interno della hook_validate()funzione come risposto da LSU_JBob.


Un gestore di convalida non è un'implementazione di hook_validate().
kiamlaluno
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.