web-dev-qa-db-fra.com

Comment modifiez-vous une erreur de formulaire?

Comment modifier ou supprimer une erreur de formulaire produite par Drupal ou un autre module sur 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.

enter image description here

8
timofey.com

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

Étant donné que la chaîne utilisée pour ce message d'erreur est "! 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, à l'aide de hook_form_alter()
  • Dans ce formulaire, gestionnaire de validation:

    • Vérifiez le contenu de $form['title'] (Où $form Est défini à l'aide de $form = &drupal_static('form_set_error', array());, et remplacez-le par la chaîne souhaitée lorsqu'il est 'Title field is required.'
    • Vérifiez que $_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 propriété #required Sur FALSE et Drupal n'affichera pas ce message d'erreur.

6
kiamlaluno

Pour drupal 7 vous pouvez télécharger ce module http://drupal.org/node/120945 en Zip cela vous donnera ce crochet.

message_alter(&$messages) {
}
4
Ali Nouman

Vous pouvez personnaliser les messages d'erreur de formulaire en utilisant 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 à configurer Message d'erreur personnalisé pour ce champ.

1
kenorb

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 à partir d'un champ entity_autocomplete qui faisait référence aux utilisateurs. Si un utilisateur non valide était ajouté, l'erreur de validation indiquait "Aucune entité ne correspond à% name". Au lieu du mot "entités", je voulais lui faire dire " 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!

0
Tyler Fahey