Comment modifiez-vous une erreur de formulaire?

8

Comment modifier ou supprimer une erreur de formulaire produite par Drupal ou un autre module lors de l'insertion / sauvegarde de noeud, pour un type de contenu particulier. Je recherche une méthode que je peux utiliser dans un module.

J'ai essayé hook_node_validate () , mais tout ce que j'ai pu faire est d'obtenir des erreurs et de définir des erreurs.

entrez la description de l'image ici

timofey.com
la source

Réponses:

13

Modification des chaînes

Pour modifier le texte d'une seule chaîne, la méthode la plus simple consiste à utiliser le module String Overrides. Cela vous permettrait de remplacer la chaîne:

"! Le champ nom est obligatoire."

avec (par exemple):

"Le champ '! Nom' est obligatoire."

Modification des champs de formulaire

Si vous souhaitez rendre un champ non obligatoire, utilisez une implémentation hook_form_alter () normale:

/**
 * Implements hook_form_FORM_ID_alter().
 */
function mymodule_form_node_form_alter(&$form, &$form_state) {
  $node = $form['#node'];
  if ($node->type == 'my_custom_type') {
    $form['title']['#required'] = FALSE;
  }
}

Changer la façon dont un formulaire est validé

Les formulaires ont des fonctions de validation spécifiées dans le $form['#validate']tableau. Et les éléments de formulaire ont des fonctions spécifiées dans $form['element_key']['#element_validate'].

Vous pouvez spécifier le vôtre comme ceci:

/**
 * Implements hook_form_FORM_ID_alter().
 */
function mymodule_form_node_form_alter(&$form, &$form_state) {
  $form['title']['#element_validate'][] = 'mymodule_validate_node_title';
}

/**
 * Validate the node title to prevent ALL CAPS.
 */
function mymodule_validate_node_title($element, &$form_state, $form) {
  if (preg_match('/^[A-Z]+$/', $element['#value'])) {
    form_error($element, t('You may not enter titles in ALL CAPS.'));
  }
}
pjcdawkins
la source
Très bonne réponse! Comment procéderiez-vous pour changer le texte d'erreur de - "Le champ de titre est requis." (comme illustré dans la question)? C'est sans utiliser des remplacements de chaîne.
timofey.com
En d'autres termes, je ne veux pas ajouter de validation, je veux juste modifier le message d'erreur d'une validation existante .... peut-être annuler la validation existante et en ajouter une nouvelle?
timofey.com
1
La validation existante n'est pas une fonction de rappel de validation; c'est seulement que le champ est "obligatoire". Une combinaison de mes deux derniers ci-dessus supprimerait le message existant, puis ajouterait un autre type de validation.
pjcdawkins
Je dois modifier uniquement un message de validation. Bien que j'aie implémenté la solution ci-dessus (par hook_form_alter). Je reçois deux messages de validation. 1 un défaut et 2ème que j'ai écrit. Toute suggestion @pjcdawkins
innovant
6

Étant donné que la chaîne utilisée pour ce message d'erreur est «! Le champ de nom est obligatoire». l'utilisation du module String Overrides ou la modification de la chaîne à utiliser dans le fichier settings.php aurait pour effet de modifier la chaîne utilisée pour chaque champ de formulaire requis.

Si vous souhaitez modifier la chaîne d'erreur affichée pour le titre lorsque le titre n'a pas été saisi, vous pouvez:

  • Ajoutez un gestionnaire de validation de formulaire au formulaire de modification de nœud, en utilisant hook_form_alter()
  • Dans ce formulaire, gestionnaire de validation:

    • Vérifiez le contenu de $form['title'](où $formest défini à l'aide de $form = &drupal_static('form_set_error', array());et remplacez-le par la chaîne souhaitée'Title field is required.'
    • Vérifiez $_SESSION['messages']['error'](un tableau) contient la chaîne 'Title field is required.'et remplacez-la par la chaîne que vous souhaitez afficher

Il est plus facile d'éviter d'afficher l'erreur: définissez simplement la #requiredpropriété sur FALSEet Drupal n'affichera pas ce message d'erreur.

kiamlaluno
la source
4

Pour drupal 7 vous pouvez télécharger ce module http://drupal.org/node/1209450 en zip il vous donnera ce crochet.

message_alter(&$messages) {
}
Ali Nouman
la source
Merci. Ce n'est probablement pas une bonne idée d'utiliser un module non pris en charge, mais il peut être utilisé comme guide!
timofey.com
1

Vous pouvez personnaliser les messages d'erreur de formulaire à l'aide de la validation de champ par champ d'entité.

Pour ce faire, modifiez les paramètres de champ, accédez à Validation et ajoutez une nouvelle règle de validation ( champ obligatoire ). Là, vous devriez avoir un champ de texte pour configurer un message d'erreur personnalisé pour ce champ.

Kenorb
la source
0

Pour Drupal 8, j'ai pu ajouter une fonction de validation personnalisée qui peut réellement examiner les erreurs existantes et modifier le balisage des erreurs au cas par cas. Dans mon cas, je voulais modifier le message d'erreur d'un champ entity_autocomplete qui faisait référence aux utilisateurs. Si un utilisateur non valide a été ajouté, l'erreur de validation indique "Aucune entité ne correspond à% name". Au lieu du mot «entités», je voulais qu'il dise «utilisateurs», pour être moins effrayant et potentiellement déroutant pour les utilisateurs.

Tout d'abord, j'utilise hook_form_alter () pour ajouter ma fonction de validation:

/**
 * Implements hook_form_alter().
 */
function my_module_form_alter(&$form, FormStateInterface $form_state, $form_id) {

      if (in_array($form_id, ['whatever_form_id_you_need_to_alter'])) {
        // Add entity autocomplete custom form validation messages alter.
        array_unshift($form['#validate'], 'my_module_custom_user_validate');
      }

Ensuite, dans la fonction 'my_module_custom_user_validate':

/**
 * Custom form validation handler that alters default validation.
 * @param $form
 * @param \Drupal\Core\Form\FormStateInterface $form_state
*/
function my_module_custom_user_validate(&$form, FormStateInterface $form_state) {
      // Check for any errors on the form_state
      $errors = $form_state->getErrors();
      if ($errors) {
        foreach ($errors as $error_key => $error_val) {
          // Check to see if the error is related to the desired field:
          if (strpos($error_key, 'the_entity_reference_field_machine_name') !== FALSE) {
            // Check for the word 'entities', which I want to replace
            if (strpos($error_val->getUntranslatedString(), 'entities') == TRUE) {
              // Get the original args to pass into the new message
              $original_args = $error_val->getArguments();
              // Re-construct the error
              $error_val->__construct("There are no users matching the name %value", $original_args);
            }
          }
        }
      }
    }

J'espère que cela t'aides!

Tyler Fahey
la source