Tôi đang cố tạo một nút trong hộp thoại có liên kết sau:
Nhập tiêu đề của biểu mẫu đăng ký hoặc <a class="use-ajax"
data-dialog-options="{"width":800}"
data-dialog-type="modal"
href="/node/add/mycontenttype?enableAjaxSubmit=true">
tạo một mẫu đăng ký mới.
</a>
cuộc gọi lại _mymodule_close_dialog()
chạy hoàn hảo khi không có lỗi xác thực. Nhưng khi có lỗi (ví dụ: tiêu đề trống) thì JS chỉ báo lỗi Uncaught TypeError: this.url không xác định
.
Tôi có thể loại bỏ lỗi JS bằng cách ngăn các hành động biểu mẫu trở thành các nút mô hình, nhưng sau đó biểu mẫu chỉ âm thầm thất bại.
Làm cách nào để hiển thị thông báo lỗi của biểu mẫu khi tạo nút trong hộp thoại?
Cuộc gọi lại:
/**
* Triển khai hook_form_BASE_FORM_ID_alter() cho \Drupal\node\NodeForm.
*/
function 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';
}
}
sử dụng Drupal\Core\Ajax\AjaxResponse;
sử dụng Drupal\Core\Ajax\CloseModalDialogCommand;
sử dụng Drupal\Core\Ajax\PrependCommand;
sử dụng Drupal\Core\Ajax\AlertCommand;
function _mymodule_close_dialog(mảng &$form, FormStateInterface $form_state) {
$response = new AjaxResponse();
// if (!$form_state->getErrors()) {
$response->addCommand(CloseModalDialogCommand() mới);
// }
$messages = ['#type' => 'status_messages'];
$response->addCommand(prependCommand mới('.some-wrapper', $messages));
$form_state->setResponse($response);
}
Tôi đã làm theo:
Cập nhật
đã thay đổi:
$form['actions']['submit']['#submit'][] = '_mymodule_close_dialog';
Đến:
$form['actions']['submit']['#ajax']['callback'] = '_mymodule_close_dialog'; // Đổi tên hàm để loại bỏ `_`
$form['actions']['submit']['#ajax']['url'] = \Drupal\Core\Url::fromRoute('node.add', ['node_type' => $contentType]) ;
$form['actions']['submit']['#ajax']['options'] = [
'truy vấn' => [
\Drupal\Core\Form\FormBuilderInterface::AJAX_FORM_REQUEST => TRUE,
],
];
Nhưng gặp lỗi PHP:
Symfony\Component\HttpKernel\Exception\HttpException: Lệnh gọi lại #ajax được chỉ định trống hoặc không thể gọi được. trong Drupal\Core\Form\FormAjaxResponseBuilder->buildResponse()
Khi tôi gỡ lỗi($triggering_element)
bên trong Biểu mẫuAjaxResponseBuilder
tập tin, phần tử gửi không có #ajax
chìa khóa hoặc sử dụng-ajax-gửi
lớp. Do đó, yếu tố kích hoạt cuối cùng không bị thay đổi.
Bất kỳ ý tưởng?