เป้าหมายคือการตั้งค่าตัวนับเริ่มต้น แต่ให้ผู้อื่นแทนที่ตัวนับ ตัวนับควรเป็นค่าที่ใหญ่ที่สุดของฟิลด์บวก 1
การใช้ผู้สมัครสมาชิกกิจกรรม FORM ALTER เหตุการณ์
ฟังก์ชั่นคงที่สาธารณะ getSubscribedEvents (): อาร์เรย์ {
กลับ [
HookEventDispatcherInterface::FORM_ALTER => 'setDefaultCbid',
HookEventDispatcherInterface::ENTITY_PRE_SAVE => 'checkCbiRaceCondition'
];
}
ฟังก์ชั่นสาธารณะ setDefaultCbid (FormAlterEvent $event) {
$form_id = $event->getFormId();
ถ้า ($form_id !== 'node_bond_edit_form') {
กลับ;
}
$result = \Drupal::database()
-> แบบสอบถาม ('เลือกสูงสุด (field_bond_cbid_value) จาก {node__field_bond_cbid}')
->fetchField();
ถ้า (ผลลัพธ์ $) {
$cbid = $ผลลัพธ์ + 1;
}
อื่น {
$cbid = 1;
}
$form = &$event->getForm();
$form_already_alterered = เท็จ;
ถ้า (array_key_exists ('field_bond_cbid_default', $form)) {
$form_already_alterered = จริง;
}
$form['field_bond_cbid_default'] = [
'#title' => $this->t('default cbid'),
'#type' => 'หมายเลข',
'#value' => $cbid,
];
ถ้า (!$form_already_alterered) {
$form['field_bond_cbid']['widget'][0]['value']['#default_value'] = $cbid;
}
}
มันใช้งานได้ดี ค่าถูกตั้งค่าและฟิลด์ "ค่าเริ่มต้น" มองเห็นได้ในแบบฟอร์มที่ปรับแล้ว
จะเกิดอะไรขึ้นถ้าบุคคลที่สองแก้ไขโหนดอื่นและเพิ่มตัวนับโดยที่ฟอร์มแสดงข้อผิดพลาด INCORRECTCODEile นี่คือที่ field_bond_cbid_default ไม่สามารถใช้ได้ในเอนทิตี
ฟังก์ชั่นสาธารณะ checkCbiRaceCondition (EntityPresaveEvent $event) {
$bond = $event->getEntity();
ถ้า ($bond->bundle() !== 'พันธบัตร') {
กลับ;
}
$enteredValue = $bond->get('field_bond_cbid')->getString();
$defaultCbid = $bond->get('field_bond_cbid_default')->getString();
ถ้า ($ enteredValue != $defaultCbid) {
ฉันจะเข้าถึงค่าเริ่มต้นได้อย่างไร