Jak zmienić błąd formularza?

8

Jak zmienić lub usunąć błąd formularza wygenerowany przez Drupal lub inny moduł wstawiania / zapisywania węzłów dla określonego typu zawartości. Szukam metody, której mogę użyć w module.

Próbowałem hook_node_validate () , ale wszystko, co mogłem zrobić, to uzyskać błędy i ustawić błędy.

wprowadź opis zdjęcia tutaj

timofey.com
źródło

Odpowiedzi:

13

Zmiana ciągów

Aby zmienić tekst pojedynczego ciągu, najprostszą metodą jest użycie modułu Zastępowanie ciągu. To pozwoli ci zamienić ciąg:

„! pole nazwy jest wymagane.”

z (na przykład):

„Pole„! Nazwa ”jest wymagane.”

Zmiana pól formularza

Jeśli chcesz, aby pole nie było wymagane, użyj normalnej implementacji 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;
  }
}

Zmiana sposobu sprawdzania poprawności formularza

Formularze mają funkcje sprawdzania poprawności określone w $form['#validate']tablicy. A elementy formularza mają funkcje określone w $form['element_key']['#element_validate'].

Możesz określić swój własny w ten sposób:

/**
 * 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
źródło
Świetna odpowiedź! Jak zmieniłbyś tekst błędu - „Pole tytułu jest wymagane”. (jak na zdjęciu w pytaniu)? To jest bez użycia przesłonięcia łańcucha.
timofey.com
Innymi słowy, nie chcę dodawać sprawdzania poprawności, chcę tylko zmodyfikować komunikat o błędzie istniejącego sprawdzania poprawności ... może cofnąć istniejące sprawdzanie poprawności i dodać nowe?
timofey.com
1
Istniejąca walidacja nie jest funkcją zwrotną sprawdzania poprawności; tylko pole jest „wymagane”. Kombinacja moich dwóch ostatnich powyżej spowoduje usunięcie istniejącej wiadomości, a następnie dodanie innego rodzaju sprawdzania poprawności.
pjcdawkins
Muszę zmienić tylko komunikat sprawdzania poprawności. Chociaż zaimplementowałem powyższe rozwiązanie (autor hook_form_alter). Otrzymuję dwa komunikaty sprawdzające poprawność. 1 jeden domyślny i drugi, który napisałem. Wszelkie sugestie @pjcdawkins
innowacyjny kundan
6

Ponieważ ciąg używany do tego komunikatu o błędzie to „! Pole nazwy jest wymagane”. użycie modułu Zastępowanie ciągów lub zmiana ciągu do użycia w pliku settings.php spowodowałaby zmianę ciągu używanego dla każdego wymaganego pola formularza.

Jeśli chcesz zmienić ciąg błędu wyświetlany dla tytułu, gdy tytuł nie został wprowadzony, możesz:

  • Dodaj moduł obsługi sprawdzania poprawności formularza do formularza edycji węzła, używając hook_form_alter()
  • W tej formie moduł obsługi walidacji:

    • Sprawdź zawartość $form['title'](gdzie $formustawia się za pomocą $form = &drupal_static('form_set_error', array());i zmień ją na ciąg, który chcesz, kiedy jest'Title field is required.'
    • Sprawdź, czy $_SESSION['messages']['error'](tablica) zawiera ciąg 'Title field is required.'i zmień go na ciąg, który chcesz wyświetlić

Unikanie pokazania błędu jest łatwiejsze: po prostu ustaw #requiredwłaściwość na FALSE, a Drupal nie wyświetli tego komunikatu o błędzie.

kiamlaluno
źródło
4

W przypadku drupala 7 możesz pobrać ten moduł http://drupal.org/node/1209450 w formacie zip, który da ci ten hak.

message_alter(&$messages) {
}
Ali Nouman
źródło
Dzięki. Prawdopodobnie nie jest dobrym pomysłem korzystanie z nieobsługiwanego modułu, ale może służyć jako przewodnik!
timofey.com
1

Można dostosować komunikaty o błędach formularzy za pomocą funkcji Sprawdzanie poprawności pola według pola jednostki.

W tym celu edytuj ustawienia pola, przejdź do Sprawdzanie poprawności i dodaj nową regułę sprawdzania poprawności ( Pole wymagane ). Tam powinieneś mieć pole tekstowe, aby skonfigurować niestandardowy komunikat o błędzie dla tego pola.

kenorb
źródło
0

W przypadku Drupala 8 mogłem dodać niestandardową funkcję sprawdzania poprawności, która może faktycznie sprawdzać istniejące błędy i zmieniać znaczniki błędów dla poszczególnych przypadków. W moim przypadku chciałem zmienić komunikat o błędzie z pola encja_autocomplete, które odnosiło się do użytkowników. Jeśli dodano nieprawidłowego użytkownika, błąd sprawdzania poprawności brzmiał: „Nie ma jednostek pasujących do% name”. Zamiast słowa „byty” chciałem, aby słowo „użytkownicy” było mniej przerażające i potencjalnie mylące dla użytkowników.

Najpierw używam hook_form_alter (), aby dodać moją funkcję sprawdzania poprawności:

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

Następnie w funkcji „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);
            }
          }
        }
      }
    }

Mam nadzieję że to pomoże!

Tyler Fahey
źródło