Я пытаюсь создать узел в диалоговом окне со следующей ссылкой:
Введите название регистрационной формы или <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-отправить
учебный класс. Таким образом, пусковой элемент в конечном счете не изменяется.
Любые идеи?