Як ви змінюєте помилку форми?


8

Як ви змінюєте або видаляєте помилку форми, видану Drupal або іншим модулем на вставці / збереженні вузла для певного типу вмісту. Я шукаю метод, який я можу використовувати в модулі.

Я спробував пристрасть_node_validate () , але все, що я міг зробити, це отримати помилки та встановити помилки.

введіть тут опис зображення

Відповіді:


13

Змінення рядків

Для зміни тексту однієї струни найпростішим методом є використання модуля String Overrides. Це дозволить вам замінити рядок:

"! поле імені обов'язкове."

з (наприклад):

"Поле"! Ім'я "обов'язкове."

Зміна полів форм

Якщо ви хочете зробити поле не обов'язковим, скористайтеся звичайною реалізацією mock_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;
  }
}

Зміна способу перевірки форми

Форми мають функції перевірки, вказані в $form['#validate']масиві. І елементи форми мають функції, зазначені в $form['element_key']['#element_validate'].

Ви можете вказати власне так:

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

Чудова відповідь! Як би ви вирішили змінити текст помилки - "Поле заголовка обов'язкове". (як зображено у запитанні)? Тобто без використання строкових переопределень.
timofey.com

Іншими словами, я не хочу додавати перевірку, я просто хочу змінити повідомлення про помилку існуючої перевірки .... можливо, скасуйте існуючу перевірку та додайте нову?
timofey.com

1
Існуюча перевірка не є функцією зворотного дзвінка; лише те, що поле "обов'язкове". Поєднання двох останніх моїх вище видалить існуюче повідомлення, а потім додасть інший тип перевірки.
pjcdawkins

Мені потрібно змінити лише повідомлення про підтвердження. Хоча я реалізував вищезазначене рішення (за допомогою ho_form_alter). Я отримую два повідомлення про перевірку. 1 один за замовчуванням і другий, що я написав. Будь-яка пропозиція @pjcdawkins
новаторський кундан

6

Оскільки рядок, який використовується для цього повідомлення про помилку, є "! Поле імені обов'язкове." використання модуля String Overrides або зміна рядка для використання у файлі settings.php призведе до зміни рядка, що використовується для кожного необхідного поля форми.

Якщо ви хочете змінити рядок помилок, вказаний для заголовка, коли заголовок не був введений, ви можете:

  • Додайте обробник форми перевірки до форми редагування вузла, використовуючи hook_form_alter()
  • У цій формі обробник валідації:

    • Перевірте вміст $form['title'](де $formвстановлено використання $form = &drupal_static('form_set_error', array());, і змініть його на потрібний рядок, коли він є'Title field is required.'
    • Перевірте $_SESSION['messages']['error'](масив) містить рядок 'Title field is required.'і змініть його на рядок, який ви хочете показати

Уникнути показу помилки простіше: просто встановіть #requiredвластивість FALSE, і Drupal не буде показувати це повідомлення про помилку.


4

Для drupal 7 ви можете завантажити цей модуль http://drupal.org/node/1209450 в zip, він дасть вам цей гачок.

message_alter(&$messages) {
}

Дякую. Мабуть, не дуже гарна ідея використовувати непідтримуваний модуль, але його можна використовувати як керівництво!
timofey.com

1

Ви можете налаштувати повідомлення про помилки форми, використовуючи перевірку поля на поле сутності.

Для цього відредагуйте налаштування поля, перейдіть до «Валідація» та додайте нове правило перевірки ( Обов’язкове поле ). Там ви повинні мати текстове поле для налаштування користувальницького повідомлення про помилку для цього поля.


0

Для Drupal 8 мені вдалося додати спеціальну функцію перевірки, яка може насправді вивчити наявні помилки та змінити розмітку помилок на кожному конкретному випадку. У моєму випадку я хотів змінити повідомлення про помилку з поля ent_autocomplete, яке посилалось на користувачів. Якщо було додано недійсного користувача, помилка перевірки читала: "Немає сутностей, що відповідають імені%". Замість слова "сутності" я хотів би сказати "користувачі", щоб бути менш страшним та потенційно заплутаним для користувачів.

По-перше, я використовую ho_form_alter (), щоб додати свою перевірку функції:

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

Потім у функції '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);
            }
          }
        }
      }
    }

Сподіваюся, це допомагає!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.