ฉันใช้แบบฟอร์ม AJAX แบบฟอร์มนี้ฉันสร้างจากคลาสย่อยของ ContentEntityForm. เอนทิตีที่แก้ไขโดยแบบฟอร์มนี้มีฟิลด์ มายฟิลด์. เพื่อนำค่าฟิลด์ทั้งหมดในโครงสร้างที่เหมาะสมที่ฉันใช้อยู่ ค่าแบบฟอร์มการนวด() ใน วิดเจ็ต MyField class (คลาสย่อยของ WidgetBase).
ปัญหาเล็กน้อยคือ: วิธีการ ค่าแบบฟอร์มการนวด() ถูกเรียกสองครั้งในการส่งทุกครั้ง ไม่มีปัญหาอื่น ๆ กับแบบฟอร์ม ฉันสามารถแก้ไขค่าในแบบฟอร์มนี้ได้อย่างถูกต้อง
ดังนั้นจึงเป็นเพียงคำถามของการทำความเข้าใจ: ทำไม Drupal ถึงโทรมา ค่าแบบฟอร์มการนวด() สองครั้งในการส่งทุกครั้ง
รหัสที่กล่าวถึงและของฉัน (ง่ายมาก):
ตัวควบคุม ajax ของฉัน
คลาส AjaxController ขยาย ControllerBase {
...
...
ฟังก์ชั่นสาธารณะ myController ($ eid) {
$myEntity = $this->entityTypeManager()->getStorage('my_entity')->load($eid);
$form = $this->entityFormBuilder()->getForm($myEntity, 'my_mode');
$renderer = \Drupal::service('เรนเดอร์');
$output = $renderer->renderRoot($แบบฟอร์ม);
$response = ใหม่ AjaxResponse();
$response->addCommand(new OpenModalDialogCommand($title, $output));
ส่งคืน $response;
}
...
...
}
แบบฟอร์มของฉัน เป็นคลาสย่อยของ ContentEntityForm และเป็น แบบฟอร์มโหมด สำหรับ โหมด my_mode ของนิติบุคคล my_entity:
คลาส MyForm ขยาย ContentEntityForm {
...
...
การกระทำของฟังก์ชันที่ได้รับการป้องกัน (อาร์เรย์ $form, FormStateInterface $form_state) {
$actions = parent::actions($form, $form_state);
$actions['ส่ง'] = [
'#type' => 'ส่ง',
'#value' => t('บันทึก'),
'#อาแจ็กซ์' => [
'callback' => '::ajaxCallback',
'event' => 'mousedown',
]
];
ส่งคืน $actions;
}
...
...
}
คลาสวิดเจ็ตฟิลด์ของฉัน:
คลาส MyFieldWidget ขยาย WidgetBase ใช้ ContainerFactoryPluginInterface {
...
...
ฟังก์ชันสาธารณะ massageFormValues (อาร์เรย์ $values, อาร์เรย์ $form, FormStateInterface $form_state) {
// รหัสนี้ถูกเรียกใช้สองครั้งในทุก ๆ การส่งของปุ่มส่งของฉันที่กำหนดไว้ข้างต้น
// แต่ทำไมสองครั้ง?
คืน $rightStructureValues;
}
...
...
}