เป้าหมายคือการตั้งค่าตัวนับเริ่มต้น แต่ให้ผู้อื่นแทนที่ตัวนับ ตัวนับควรเป็นค่าที่ใหญ่ที่สุดของฟิลด์บวก 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) {

ฉันจะเข้าถึงค่าเริ่มต้นได้อย่างไร