Wie ändere ich einen Formularfehler?

8

Wie können Sie einen Formularfehler ändern oder entfernen, der von Drupal oder einem anderen Modul beim Einfügen / Speichern eines Knotens für einen bestimmten Inhaltstyp erzeugt wurde? Ich suche eine Methode, die ich in einem Modul verwenden kann.

Ich habe hook_node_validate () ausprobiert , aber alles, was ich tun konnte, war, Fehler abzurufen und Fehler zu setzen.

Geben Sie hier die Bildbeschreibung ein

timofey.com
quelle

Antworten:

13

Saiten ändern

Um den Text einer einzelnen Zeichenfolge zu ändern, verwenden Sie am einfachsten das Modul "Zeichenfolgenüberschreibungen". Damit können Sie die Zeichenfolge ersetzen:

"! Namensfeld ist erforderlich."

mit (zum Beispiel):

"Das Feld '! Name' ist erforderlich."

Formularfelder ändern

Wenn Sie ein Feld nicht benötigen möchten, verwenden Sie eine normale Implementierung von 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;
  }
}

Ändern der Art und Weise, wie ein Formular validiert wird

Formulare verfügen über Validierungsfunktionen, die im $form['#validate']Array angegeben sind. Und Formularelemente haben Funktionen, die in angegeben sind $form['element_key']['#element_validate'].

Sie können Ihre eigenen wie folgt angeben:

/**
 * 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
quelle
Gute Antwort! Wie würden Sie vorgehen, um den Fehlertext von "Titelfeld ist erforderlich" zu ändern. (wie in der Frage abgebildet)? Das heißt, ohne String-Overrides zu verwenden.
timofey.com
Mit anderen Worten, ich möchte keine Validierung hinzufügen, sondern nur die Fehlermeldung einer vorhandenen Validierung ändern. Deaktivieren Sie möglicherweise die vorhandene Validierung und fügen Sie eine neue hinzu.
timofey.com
1
Die vorhandene Validierung ist keine Validierungsrückruffunktion. es ist nur so, dass das Feld "erforderlich" ist. Eine Kombination meiner letzten beiden oben würde die vorhandene Nachricht entfernen und dann eine andere Art der Validierung hinzufügen.
pjcdawkins
Ich muss nur eine Validierungsnachricht ändern. Obwohl ich die obige Lösung implementiert habe (von hook_form_alter). Ich erhalte zwei Bestätigungsnachrichten. 1 eine Standardeinstellung und 2. die ich geschrieben habe. Jeder Vorschlag @pjcdawkins
innovative Kundan
6

Da die für diese Fehlermeldung verwendete Zeichenfolge "! Namensfeld ist erforderlich" ist. die Verwendung von String Überschreibungen Modul oder das Ändern der Zeichenfolge würde in der settings.php - Datei zu verwenden , um den Effekt hat die Zeichenfolge für jedes gewünschtes Formularfeld zu ändern.

Wenn Sie die für den Titel angezeigte Fehlerzeichenfolge ändern möchten, wenn der Titel nicht eingegeben wurde, können Sie:

  • Fügen Sie dem Knotenbearbeitungsformular mithilfe von einen Formularüberprüfungshandler hinzu hook_form_alter()
  • In dieser Form Validierungshandler:

    • Überprüfen Sie den Inhalt von $form['title'](wo $formwird mit festgelegt $form = &drupal_static('form_set_error', array());, und ändern Sie ihn in die gewünschte Zeichenfolge, wenn dies der Fall ist'Title field is required.'
    • Überprüfen Sie, ob $_SESSION['messages']['error'](ein Array) die Zeichenfolge enthält, 'Title field is required.'und ändern Sie sie in die Zeichenfolge, die Sie anzeigen möchten

Es ist einfacher zu vermeiden, den Fehler anzuzeigen: Setzen Sie einfach die #requiredEigenschaft auf FALSE, und Drupal zeigt diese Fehlermeldung nicht an.

kiamlaluno
quelle
4

Für Drupal 7 können Sie dieses Modul http://drupal.org/node/1209450 in zip herunterladen. Es gibt Ihnen diesen Haken.

message_alter(&$messages) {
}
Ali Nouman
quelle
Vielen Dank. Es ist wahrscheinlich keine gute Idee, ein nicht unterstütztes Modul zu verwenden, aber es kann als Leitfaden verwendet werden!
timofey.com
1

Sie können Formularfehlermeldungen anpassen, indem Sie die Feldüberprüfung pro Entitätsfeld verwenden.

Bearbeiten Sie dazu die Feldeinstellungen, gehen Sie zu Validierung und fügen Sie eine neue Validierungsregel hinzu ( Erforderliches Feld ). Dort sollten Sie ein Textfeld haben, um eine benutzerdefinierte Fehlermeldung für dieses Feld einzurichten .

Kenorb
quelle
0

Für Drupal 8 konnte ich eine benutzerdefinierte Validierungsfunktion hinzufügen, mit der die vorhandenen Fehler tatsächlich untersucht und das Markup der Fehler von Fall zu Fall geändert werden kann. In meinem Fall wollte ich die Fehlermeldung aus einem Feld entity_autocomplete ändern, das auf Benutzer verweist. Wenn ein ungültiger Benutzer hinzugefügt wurde, lautete der Validierungsfehler "Es gibt keine Entitäten, die mit% name übereinstimmen". Anstelle des Wortes "Entitäten" wollte ich, dass es "Benutzer" sagt, um weniger beängstigend und potenziell verwirrend für Benutzer zu sein.

Zuerst benutze ich hook_form_alter (), um meine Validierungsfunktion hinzuzufügen:

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

Dann in der Funktion '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);
            }
          }
        }
      }
    }

Hoffe das hilft!

Tyler Fahey
quelle