ซึ่งสามารถทำได้ผ่านการใช้งานการเรียกกลับของ Form API:
ข้างใน module/src/Element/ElementClass.php
, ใน ฟังก์ชั่นสาธารณะ getInfo() {}
กำหนดการเรียกกลับ เช่น processMyElement
ภายใต้ '#กระบวนการ'
กุญแจ:
ฟังก์ชั่นสาธารณะ getInfo () {
$คลาส = คงที่::คลาส;
กลับ [
// [...] คำจำกัดความอื่น ๆ
'#กระบวนการ' => [
[คลาส $, 'processMyElement'],
]
];
}
จากนั้นดำเนินการเสริมสองรายการ
(1) ประมวลผลข้อมูลที่ผู้ใช้ป้อนและส่งคืนค่าซึ่งจะระบุไว้ใน '#form_state'
ค่าใน ค่าโทรกลับ ()
กระบวนการ:
ค่าฟังก์ชันคงที่สาธารณะ callback (&$ องค์ประกอบ $ อินพุต FormStateInterface $ form_state) {
$output = parent::valueCallback($องค์ประกอบ, $อินพุต, $form_state);
ถ้า ($ อินพุต == 'บางอย่าง') {
$output = 'บางอย่าง_ELSE';
}
ส่งคืนเอาต์พุต $;
}
(2) และในทางกลับกันใน processMyElement()
วิธีการคืนค่าเดิม:
ฟังก์ชั่นสาธารณะแบบคงที่ processMyElement (&$ element, FormStateInterface $form_state, &$ Complete_form) {
ถ้า ($ element['#value'] == 'SOMETHING_ELSE') {
$element['#value'] = 'บางอย่าง';
}
ส่งคืนองค์ประกอบ $;
}
ตัวอย่างการใช้งาน
ฉันใช้สิ่งนี้เพื่อขยาย Drupal\Core\Render\Element\Textfield
คลาสร่วมกับ JS Storage Complete นั่นทำให้ฉันเติมข้อความอัตโนมัติ (โดยไม่ต้องใช้ URL โทรกลับ) การเติมข้อความอัตโนมัตินี้ส่งคืนรหัสเอนทิตีที่ได้รับจากการโหลดเอนทิตีตามป้ายกำกับที่ไม่ซ้ำกันภายใน ค่าโทรกลับ ()
วิธีการ แต่ผู้ใช้ยังคงแสดงด้วยการป้อนข้อความ (ได้รับจากการส่งคืน $entity->label()
ข้างใน processMyElement()
กระบวนการ).