Как проверить элементы формы в модальном без закрытия?

Я использую Drupal 8, и я определил тип пользовательской сущности 'my_entity_type', с обработчиками форм, определенными в аннотации @ContentEntityType:

 * @ContentEntityType(
 ...
 *   handlers = {
 *     "form" = {
 *       "add" = "Drupal\my_module\Form\MyEntityForm",
 *       "edit" = "Drupal\my_module\Form\MyEntityForm",
 *       "delete" = "Drupal\my_module\Form\MyEntityDeleteForm",
 ...

, где:

  • MyEntityForm расширяет ContentEntityForm
  • MyEntityDeleteForm расширяет ContentEntityConfirmFormBase

Они маршрутизируются в my_module.routing.yml, используя элемент _entity_form:

_entity_form: my_entity_type.add

Я представляю форму из другой формы как модальную:

$form['add_my_entity_button'] = [
  '#type' => 'link',
  '#title' => t('Add NewEntity'),
  '#url' => Url::fromRoute(
    'my_module.add_entity',
    array(
      'node' => is_numeric($node) ? $node : NULL,
    )
  ),
  '#attributes' => [
    'class' => ['button', 'use-ajax'],
    'data-dialog-type' => 'modal',
  ],
  '#attached' => [
    'library' => ['core/drupal.dialog.ajax'],
  ],
];

Все работает так, как предполагалось. Валидатор типа #required 'появляется в форме в модальной форме. «Модификация

Цель

Добавить пользовательскую проверку элементов этой формы («живая» проверка, которая не закрывает модальность). Я признаю, что этот тип проблемы не нова, и я часто делал это в немодальных формах. Обычно методы, которые я использовал бы, следующие:

  • '# element_validate' обратный вызов элемента формы
  • validateForm () тип обратного вызова формы

Оба, кажется, требуют представления формы, закрытия модальности и отображения ошибок на дисплее плоской формы. Затем я причесался через Core для идей и отправился в удивительно искривленное путешествие по як-бритью:

  1. Добавление проверки через BaseFieldDefinition :: addConstraint в entity baseFieldDefinitions () : это все еще отправило форму и привело к плоской (немодальной) форме с ошибками, которые были правильно выбраны. Как только я решу эту проблему, я, скорее всего, оставлю это, чтобы служить привратником на уровне хранилища.

  2. Расширение 'Number' TypeType через плагин, расширение виджета, типа или хранения . Это казалось слишком сложным для чего-то простого, как добавление валидатора. Я поклялся в этом, прежде чем зайти слишком далеко, поскольку я подумал:

  3. Внедрение генератора '#ajax' 'replace' обратного вызова элемента внутри buildForm () в MyEntityForm : я не мог бы получить ajax, вставленный таким образом, чтобы запустить здесь.

  4. Внедрение генератора '#ajax' 'replace' обратного вызова элемента в hook_form_alter : я не смог бы получить обратные вызовы ajax, вставленные таким образом, чтобы их запустить.

Вопросы

Что я пропустил? Я чувствую, что это просто. Есть ли что-то, что я пропустил в Form, который определяет простую проверку ajax?

Существует ли стандартный способ проверки элементов формы внутри модалов без закрытия модального?

Можно ли привязать обратные вызовы AJAX к формам, определенным и маршрутизируемым через аннотацию @ContentEntityType? Есть ли ограничение в конвейере рендеринга?

5 голосов | спросил Jake The Dweeb 23 MarpmThu, 23 Mar 2017 19:29:44 +03002017-03-23T19:29:44+03:0007 2017, 19:29:44

1 ответ


1

Это отличная статья, которую вы можете прочитать для «исправления» вашей проблемы: http://www.mediacurrent.com/blog/загрузочно-рендеринга покадрово-форм-Друпала-8

Имейте в виду следующие строки:

Сначала мы завершаем нашу форму div

public function buildForm(array $form, FormStateInterface $form_state, $options = NULL) {
  // It is important this id
  $form['#prefix'] = '<div id="modal_example_form">';
  $form['#suffix'] = '</div>';

  // The status messages that will contain any form errors.
  $form['status_messages'] = [
    '#type' => 'status_messages',
    '#weight' => -10,
  ];

  // more code

  $form['actions']['send'] = [
      '#type' => 'submit',
      '#value' => $this->t('Submit modal form'),
      '#attributes' => [
        'class' => [
          'use-ajax',
        ],
      ],
      // Function to call when the users click on submit button.
      '#ajax' => [
        'callback' => [$this, 'submitModalFormAjax'],
        'event' => 'click',
      ],
    ];

    // more code
}

Во-вторых, мы показываем ошибки:

/**
 * AJAX callback handler that displays any errors or a success message.
 */
public function submitModalFormAjax(array $form, FormStateInterface $form_state) {
  $response = new AjaxResponse();

  // If there are any form errors, re-display the form.
  if ($form_state->hasAnyErrors()) {
    // Remember the previous id ? Here it is
    $response->addCommand(new ReplaceCommand('#modal_example_form', $form));
  }
  else {
    $response->addCommand(new OpenModalDialogCommand("Success!", 'The modal form has been submitted.', ['width' => 800]));
  }

  return $response;
}
ответил rpayanm 28 22017vEurope/Moscow11bEurope/MoscowTue, 28 Nov 2017 19:22:46 +0300 2017, 19:22:46

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132