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


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

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

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.


Un gestionnaire de validation n'est pas une implémentation de hook_validate().
kiamlaluno
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.