ฉันกำลังพยายามสร้างโหนดในกล่องโต้ตอบด้วยลิงก์ต่อไปนี้:
ป้อนชื่อแบบฟอร์มการลงทะเบียนหรือ <a class="use-ajax"
data-dialog-options="{"width":800}"
data-dialog-type="modal"
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');
ถ้า (!empty($enableAjaxSubmit) && $enableAjaxSubmit === 'จริง') {
$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 (อาร์เรย์ &$form, 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($ตอบกลับ);
}
ฉันตาม:
อัปเดต
เปลี่ยน:
$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']['ตัวเลือก'] = [
'แบบสอบถาม' => [
\Drupal\Core\Form\FormBuilderInterface::AJAX_FORM_REQUEST => จริง,
]
];
แต่ได้รับข้อผิดพลาด PHP:
Symfony\Component\HttpKernel\Exception\HttpException: การเรียกกลับ #ajax ที่ระบุว่างเปล่าหรือไม่สามารถเรียกได้ ใน Drupal\Core\Form\FormAjaxResponseBuilder->buildResponse()
เมื่อฉัน แก้ไขจุดบกพร่อง ($ triggering_element)
ใน FormAjaxResponseBuilder
ไฟล์องค์ประกอบการส่งไม่มี #อาแจ็กซ์
คีย์หรือ ใช้-ajax-ส่ง
ระดับ. ดังนั้น องค์ประกอบทริกเกอร์จะไม่ถูกเปลี่ยนแปลงในท้ายที่สุด
ความคิดใด ๆ ?