Come si modifica un errore del modulo?


8

Come si modifica o rimuove un errore di modulo prodotto da Drupal o da un altro modulo sull'inserimento / salvataggio del nodo, per un determinato tipo di contenuto. Sto cercando un metodo che posso usare in un modulo.

Ho provato hook_node_validate () , ma tutto quello che sono riuscito a fare è ottenere errori e impostare errori.

inserisci qui la descrizione dell'immagine

Risposte:


13

Modifica delle stringhe

Per modificare il testo di una singola stringa, il metodo più semplice è utilizzare il modulo Sostituzioni stringa. Ciò ti consentirebbe di sostituire la stringa:

"! il campo nome è obbligatorio."

con (ad esempio):

"Il campo '! Nome' è obbligatorio."

Modifica dei campi del modulo

Se si desidera creare un campo non obbligatorio, utilizzare una normale implementazione hook_form_alter ():

/**
 * 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;
  }
}

Modifica della modalità di convalida di un modulo

I moduli hanno funzioni di convalida specificate $form['#validate']nell'array. E gli elementi del modulo hanno funzioni specificate in $form['element_key']['#element_validate'].

Puoi specificare il tuo in questo modo:

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

Bella risposta! Come procedere per modificare il testo dell'errore di - "Il campo del titolo è obbligatorio". (come nella domanda)? Cioè senza usare le sostituzioni di stringhe.
timofey.com

In altre parole, non voglio aggiungere la convalida, voglio solo modificare il messaggio di errore di una convalida esistente .... forse annullare la convalida esistente e aggiungerne una nuova?
timofey.com

1
La validazione esistente non è una funzione di callback di validazione; è solo che il campo è "obbligatorio". Una combinazione delle mie ultime due sopra rimuove il messaggio esistente e quindi aggiunge un altro tipo di convalida.
pjcdawkins,

Devo modificare solo un messaggio di convalida. Anche se ho implementato la soluzione sopra (di hook_form_alter). Ricevo due messaggi di convalida. 1 uno predefinito e 2 ° che ho scritto. Qualsiasi suggerimento @pjcdawkins
innovativo kundan

6

Poiché la stringa utilizzata per quel messaggio di errore è "! Il campo nome è obbligatorio." usare il modulo String Overrides o cambiare la stringa da usare nel file settings.php avrebbe l'effetto di cambiare la stringa usata per ogni campo del modulo richiesto.

Se si desidera modificare la stringa di errore mostrata per il titolo quando il titolo non è stato inserito, è possibile:

  • Aggiungere un gestore di convalida del modulo al modulo di modifica del nodo, utilizzando hook_form_alter()
  • In tale forma gestore validantion:

    • Verifica il contenuto di $form['title'](dove $formviene impostato utilizzando $form = &drupal_static('form_set_error', array());e modificalo nella stringa desiderata quando lo è'Title field is required.'
    • Verifica $_SESSION['messages']['error'](un array) contiene la stringa 'Title field is required.'e modificala nella stringa che desideri mostrare

Evitare di mostrare l'errore è più semplice: basta impostare la #requiredproprietà su FALSEe Drupal non mostrerà quel messaggio di errore.



1

È possibile personalizzare i messaggi di errore del modulo utilizzando Convalida campo per campo entità.

Per fare ciò, modifica le impostazioni del campo, vai a Convalida e aggiungi una nuova regola di convalida ( Campo obbligatorio ). Qui, dovresti avere un campo di testo per impostare un messaggio di errore personalizzato per quel campo.


0

Per Drupal 8, sono stato in grado di aggiungere una funzione di convalida personalizzata che può effettivamente esaminare gli errori esistenti e modificare il markup degli errori in base al caso. Nel mio caso, volevo modificare il messaggio di errore da un campo entity_autocomplete che faceva riferimento agli utenti. Se è stato aggiunto un utente non valido, l'errore di convalida diceva "Non ci sono entità corrispondenti a% name". Invece della parola "entità", volevo che dicesse "utenti", per essere meno spaventoso e potenzialmente confuso per gli utenti.

Innanzitutto, utilizzo hook_form_alter () per aggiungere la mia funzione di convalida:

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

Quindi, nella funzione '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);
            }
          }
        }
      }
    }

Spero che sia di aiuto!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.