web-dev-qa-db-fra.com

Comment utiliser form_set_error () dans le bon sens?

Dans mon module Drupal 7, j'ai un formulaire et ses gestionnaires de validation. J'appelle mon formulaire à partir d'un field.tpl.php avec print render(drupal_get_form('my_form')); cela fonctionne comme prévu.

Le problème est en cas de mauvaise valeur d'entrée.

Il nécessite deux soumissions incorrectes avant d'afficher le message d'erreur: la première fois, il y a une bordure rouge autour de ma mauvaise entrée et la deuxième fois, le message d'erreur s'affiche (avec la bordure rouge).

Alors, quelle est la bonne façon d'utiliser form_set_error()?

8
druvik

Les générateurs de formulaires ne sont pas censés être appelés dans un fichier de modèle, car ils sont appelés trop tard. Lorsque vous appelez render(drupal_get_form('my_form')), le code qui affiche les messages d'erreur a été exécuté et les éventuels messages d'erreur signalés par le gestionnaire de validation sont enregistrés dans la session en cours à partir de drupal_set_message () , qui est appelé depuis form_set_error().

Le code pour imprimer le message d'erreur se trouve dans le fichier page.tpl.php .

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

<?php print $messages; ?>

Le code dans drupal_set_message() qui enregistre les messages à afficher est le suivant:

  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);
  }
6
kiamlaluno

Vous devriez plutôt regarder form_set_error

si vous avez un élément comme celui-ci:

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

dans votre fonction de rappel de validation, effectuez cette opération si vous constatez que les valeurs de $form_state['values'] ne sont pas valides

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.');
}
8
LSU_JBob

form_set_error() doit être appelé dans votre fonction hook_validate() comme répondu par LSU_JBob.

1
Amin