Как вы можете изменить форму ошибки?


8

Как изменить или удалить ошибку формы, вызванную Drupal или другим модулем на узле вставки / сохранения, для определенного типа контента. Я ищу метод, который я могу использовать в модуле.

Я пробовал hook_node_validate () , но все, что я мог сделать, это получить ошибки и установить ошибки.

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

Ответы:


13

Изменение строк

Чтобы изменить текст одной строки, самый простой способ - использовать модуль String Overrides. Это позволит вам заменить строку:

msgstr "! Поле имени обязательно для заполнения."

с (например):

"Поле '! Name' обязательно для заполнения."

Изменение полей формы

Если вы хотите сделать поле необязательным, используйте обычную реализацию 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;
  }
}

Изменение способа проверки формы

Формы имеют функции проверки, указанные в $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

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

6

Так как строка, используемая для этого сообщения об ошибке, является "! Name поле обязательно для заполнения". использование модуля переопределения строк или изменение строки, используемой в файле settings.php, приведет к изменению строки, используемой для каждого обязательного поля формы.

Если вы хотите изменить строку ошибки, отображаемую для заголовка, когда заголовок не был введен, вы можете:

  • Добавьте обработчик проверки формы в форму редактирования узла, используя hook_form_alter()
  • В этой форме обработчик проверки:

    • Проверьте содержимое $form['title'](где $formустановлено с помощью $form = &drupal_static('form_set_error', array());, и измените его на строку, которую вы хотите, когда это'Title field is required.'
    • Verify $_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 я смог добавить пользовательскую функцию проверки, которая может фактически проверять существующие ошибки и изменять разметку ошибок для каждого конкретного случая. В моем случае я хотел изменить сообщение об ошибке из поля entity_autocomplete, которое ссылалось на пользователей. Если был добавлен недопустимый пользователь, ошибка проверки показала: «Нет объектов, соответствующих% name». Вместо слова «сущности» я хотел, чтобы оно говорило «пользователи», чтобы быть менее пугающим и потенциально вводящим пользователей в заблуждение.

Во-первых, я использую hook_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.