ฉันใช้แบบฟอร์ม 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;
}
...
...
}