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.