Comment utiliser form_set_error () dans le bon sens?

8

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()?

druvik
la source
Il n'y a pas de drupal_set_error()fonction. Êtes-vous sûr de ne pas vouloir dire form_set_error()?
kiamlaluno
Tu as raison! Je veux dire form_set_error ()! J'essaie de mettre à jour le premier message.
druvik

Réponses:

6

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 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);
  }
kiamlaluno
la source
D'accord. Je comprends que l'utilisation form_set_error()dans un fichier modèle est la mauvaise façon. Alors, quelle est la bonne façon?
druvik
1
drupal_get_form()ne doit pas être appelé à l'intérieur d'un fichier modèle, mais à l'intérieur d'un module.
kiamlaluno
Ok, je l'ai mis dans un module et j'ai utilisé Display Suite pour l'afficher dans ma page. Merci.
druvik
Vous devez marquer cela comme la bonne réponse si cela vous a aidé.
Malks
8

Vous devriez regarder form_set_error à la place

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, faites-le si vous trouvez que les valeurs dans $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.');
}
LSU_JBob
la source
En fait, c'est la fonction que j'utilise. (Je corrige l'erreur de mon premier post).
druvik
1

form_set_error()devrait être appelé à l'intérieur de votre hook_validate()fonction comme répondu par LSU_JBob.

Amin
la source
Un gestionnaire de validation n'est pas une implémentation de hook_validate().
kiamlaluno