Рейтинг:2

Пользовательский обратный вызов отправки срабатывает только тогда, когда форма действительна в диалоговом окне

флаг cg

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

Введите название регистрационной формы или <a class="use-ajax" 
    data-dialog-options="{"ширина":800}" 
    тип диалогового окна данных = "модальный" 
    href="/node/add/mycontenttype?enableAjaxSubmit=true">
    создать новую регистрационную форму.
</a>

Обратный вызов _mymodule_close_dialog() работает отлично, когда нет ошибок проверки. Но когда возникает ошибка (например, заголовок пуст), JS просто выводит ошибку Uncaught TypeError: this.url не определен.

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

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

Обратный вызов:

/**
 * Реализует hook_form_BASE_FORM_ID_alter() для \Drupal\node\NodeForm.
 */
функция mymodule_form_node_mycontenttype_form_alter(&$form, FormStateInterface $form_state) {
    $enableAjaxSubmit = \Drupal::request()->query->get('enableAjaxSubmit');
    if (!empty($enableAjaxSubmit) && $enableAjaxSubmit === 'true') {    
      $form['#attached']['library'][] = 'core/drupal.dialog.ajax';
      $form['#attached']['library'][] = 'core/jquery.form';

      $form['actions']['submit']['#attributes']['class'][] = 'use-ajax-submit';
      $form['actions']['submit']['#submit'][] = '_mymodule_close_dialog';
    }
}

используйте Drupal\Core\Ajax\AjaxResponse;
используйте Drupal\Core\Ajax\CloseModalDialogCommand;
используйте Drupal\Core\Ajax\PrependCommand;
используйте Drupal\Core\Ajax\AlertCommand;

функция _mymodule_close_dialog (массив и $ форма, FormStateInterface $ form_state) {
  $response = новый AjaxResponse();

  // если (!$form_state->getErrors()) {
    $response->addCommand(новый CloseModalDialogCommand());
  // }

  $messages = ['#type' => 'status_messages'];
  $response->addCommand(new PrependCommand('.some-wrapper', $messages));

  $form_state->setResponse($response);
}

Я последовал за:

Обновлять

Измененный:

$form['actions']['submit']['#submit'][] = '_mymodule_close_dialog';

К:

$form['actions']['submit']['#ajax']['callback'] = '_mymodule_close_dialog'; // Переименовать функцию, чтобы удалить `_`
$form['actions']['submit']['#ajax']['url'] = \Drupal\Core\Url::fromRoute('node.add', ['node_type' => $contentType]) ;
$form['actions']['submit']['#ajax']['options'] = [
  'запрос' => [
    \Drupal\Core\Form\FormBuilderInterface::AJAX_FORM_REQUEST => ИСТИНА,
  ],
];

Но получаю ошибку PHP:

Symfony\Component\HttpKernel\Exception\HttpException: Указанный обратный вызов #ajax пуст или не может быть вызван. в Drupal\Core\Form\FormAjaxResponseBuilder->buildResponse()

Когда я отладка ($triggering_element) в FormAjaxResponseBuilder файл, у элемента submit не было #аякс ключ или использовать-ajax-отправить учебный класс. Таким образом, пусковой элемент в конечном счете не изменяется.

Любые идеи?

Рейтинг:0
флаг ua

и немного: https://www.drupal.org/project/drupal/issues/2934463#comment-13180158

Вы пропустили добавление этой части в свой альтер, который должен решить вашу проблему с неопределенным URL.

$form['actions']['submit']['#ajax']['url'] = \Drupal\Core\Url::fromRoute('node.add');
$form['actions']['submit']['#ajax']['options'] = [
  'запрос' => [
    Drupal\Core\Form\FormBuilderInterface::AJAX_FORM_REQUEST => ИСТИНА,
  ],
];
Chris Happy avatar
флаг cg
Я попытался добавить код ниже `$form['actions']['submit']['#submit'][] = '_mymodule_close_dialog';`, но затем он перестал сохраняться. Разве приведенный выше код не предназначен для открытия формы `node.add` (а не для сохранения формы узла)? Или я чего-то не понимаю?
Chris Happy avatar
флаг cg
Я добавил обновление с вашим решением. К сожалению, Drupal не использует измененный элемент с ключом `#ajax`.

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

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