งานของฉันคือสร้าง ajaxify แบบฟอร์มแฟล็กที่ซับซ้อน (พร้อมฟิลด์เพิ่มเติม)
ฉันต้องการสิ่งนี้เนื่องจากแฟล็ก ajax เริ่มต้นไม่รองรับ fiedls
ฉันต้องมีแบบฟอร์มการแฟล็กสำหรับสร้างการแฟล็กและอัปเดตเมื่อสร้างการแฟล็กแล้ว
ฉันต้องการวางแบบฟอร์ม ajaxified ตั้งค่าสถานะแบบกำหนดเองในเทมเพลตของฉัน
ก่อนอื่นฉันได้รับการสร้างแบบฟอร์ม:
$term = $ตัวแปร['term'];
$flag = \Drupal::service('flag')->getFlagById('subscribe_term');
$flagging_entity = \Drupal::service('flag')->getFlagging($flag, $variables['term']);
ถ้า (!$flagging_entity) {
$flagging_entity = \Drupal::entityTypeManager()->getStorage('ตั้งค่าสถานะ')->สร้าง([
'uid' => \Drupal::currentUser()->id(),
'session_id' => โมฆะ,
'flag_id' => $flag->id(),
'entity_id' => $term->id(),
'entity_type' => $term->getEntityTypeId(),
'ทั่วโลก' => $flag->isGlobal(),
]);
}
$form = \Drupal::entityTypeManager()
->getFormObject('การตั้งค่าสถานะ', 'แก้ไข')
->setEntity($flagging_entity);
$variables['flag'] = \Drupal::formBuilder()->getForm($form);
ฟอร์มใช้ได้เลย
จากนั้นฉันแก้ไขแบบฟอร์มโฆษณาเพิ่ม ajax callback:
$form['actions']['submit']['#ajax'] = [
'callback' => 'mymodule_flag_form_ajax_callback',
'เอฟเฟกต์' => 'จาง',
];
จากนั้นในการโทรกลับ ajax ฉันพยายามรับแบบฟอร์มเดียวกัน:
$render_selector = ".flag-form-wrapper";
$response = ใหม่ AjaxResponse();
$form_object = $form_state->getFormObject();
$flagging_entity = $form_object->getEntity();
$flagged_entity_field = $flagging_entity->get('flagged_entity')->getValue();
ถ้า ($ flagged_entity_field) {
$tid = $flagged_entity_field[0]['target_id'];
$term = \Drupal::entityTypeManager()->getStorage('taxonomy_term')->load($tid);
ถ้า ($ คำ) {
$flag = \Drupal::service('flag')->getFlagById('subscribe_term');
$flagging_entity = \Drupal::service('flag')->getFlagging($flag, $term);
ถ้า (!$flagging_entity) {
$flagging_entity = \Drupal::entityTypeManager()->getStorage('ตั้งค่าสถานะ')->สร้าง([
'uid' => \Drupal::currentUser()->id(),
'session_id' => โมฆะ,
'flag_id' => $flag->id(),
'entity_id' => $term->id(),
'entity_type' => $term->getEntityTypeId(),
'ทั่วโลก' => $flag->isGlobal(),
]);
}
$form_new = \Drupal::entityTypeManager()
->getFormObject('การตั้งค่าสถานะ', 'แก้ไข')
->setEntity($flagging_entity);
$form_build = \Drupal::formBuilder()->getForm($form_new);
$response->addCommand(new HtmlCommand($render_selector, $form_build));
}
}
แต่ฉันได้รับข้อยกเว้นต่อไปนี้: FormAjaxException
ฉันทำอะไรผิดและจะรีเฟรชแบบฟอร์มโดยใช้ ajax ได้อย่างไร