Рейтинг:0

Выдать ошибку для обязательного поля в hook_form_alter?

флаг cn

У меня есть тип узла, который может быть создан аутентифицированными пользователями. В форме создания узла я добавил флажок условий обслуживания с помощью хука формы, например:

функция themename_form_alter(&$form, &$form_state, $form_id) {
  если ($form_id == 'node_nodetype_form') {
    $form['field_tos_accept'] = массив(
      '#type' => 'флажок',
      '#title' => t('Я согласен с условиями использования.'),
      '#вес' => '999',
      '#required' => ИСТИНА,
    );
  }
}

Это дает мне возможность установить этот флажок в форме создания узла, но не в форме редактирования узла, поскольку он там не нужен. Когда я добавляю

'#required_error' => t('Пожалуйста, примите условия использования.'), 

По моему мнению, это должно выдавать сообщение об ошибке при отправке формы. Но вместо этого требуемое состояние поля препятствует отправке формы. Таким образом, также не выдается сообщение об ошибке.

Есть ли способ установить это в form_alter? Или я должен просто проверить состояние флажка через JS? Что будет считаться лучшей практикой? Заранее большое спасибо!

apaderno avatar
флаг us
`#required_error` — это ошибка, отображаемая, когда форма проверена и элемент формы является обязательным, но пользователи не ввели никакого значения. `#required` означает, что пользователи должны ввести значение для этого элемента формы. Ни один из них не препятствует отправке формы. Пока пользователи предоставляют значение для этого элемента формы, форма отправляется.
apaderno avatar
флаг us
Кроме того, если вы добавляете флажок только при создании узла, но не при редактировании узла, вы используете больше кода, чем показывает вопрос.
Berry Dingle avatar
флаг cn
@apaderno Я использую только приведенный выше код в своем файле themename.theme. Но поскольку я подключаюсь к форме node-nodetype-form, а не к форме node-nodetype-edit-form, она отображается только в форме добавления/создания узла, а не в форме редактирования. Вы правы насчет подачи. Обязательное состояние не препятствует отправке формы, но запускает проверку поля HTML5 по умолчанию, которую я не вижу, потому что я сделал кнопку переключения из ввода флажка по умолчанию. Думаю, я сделаю это в JS и выкину ошибку, когда нажата кнопка отправки, но флажок не установлен.
apaderno avatar
флаг us
Форма для редактирования узла — это та же форма, которая использовалась для его создания, реализованная классом `Drupal\node\NodeForm`. Если вы хотите добавить элемент формы только при создании узла, вы должны добавить код, подобный следующему: `$node = $form_state->getFormObject()->getEntity(); if ($node && $node->isNew()) { /* Узел создается. */ }`
Рейтинг:1
флаг cn

Is there any way to set this in a form_alter? Or should I just validate the checkbox state via JS?

You could replace #required by setting a custom validation handler in the form alter hook, if you want to generate the error message server-side:

$form_state->setErrorByName('field_tos_accept', $error_message);

When I add '#required_error', this should - in my understanding - throw an error message when the form is submitted.

#required_error' was introduced in 2011, but when Drupal 8 was released it seems to have stopped working in browsers supporting HTML5 form validation and so it was never really adopted.

However, you can use the HTML5 form attribute novalidate to disable client-side form validation, then this property works again and you get the custom error message without a custom validation handler:

function themename_form_alter(&$form, &$form_state, $form_id) {
  // for entity forms $form_id consists of
  // ENTITY_TYPE_BUNDLE_FORM_MODE_form
  // BUNDLE only if entity has bundles
  // FORM_MODE only if not default
  // Examples:
  // node_article_edit_form - node edit form for the content type article
  // node_page_form - node create form for the content type page
  // nodes use for the create form the form mode default
  if ($form_id == 'node_nodetype_form') {
    $form['#attributes']['novalidate'] = 'novalidate';
    $form['field_tos_accept'] = [
      '#type' => 'checkbox',
      '#title' => t('I agree to the terms of service.'),
      '#weight' => '999',
      '#required' => TRUE,
      '#required_error' => t('Please accept the terms of service.'), 
    ];
  }
}

See https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form#attr-novalidate

Berry Dingle avatar
флаг cn
Вау - большое спасибо! Это было именно то, что я искал, и это работает так, как хотелось. Еще раз большое спасибо!

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.