Score:0

ฉันจะเพิ่มฟิลด์ในแบบฟอร์มโหนดได้อย่างไร

ธง km

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

สนามไม่พร้อมใช้งาน

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

Score:2
ธง km

เหตุการณ์แก้ไขแบบฟอร์มเป็นเหตุการณ์ที่ไม่ถูกต้องสำหรับการตรวจสอบข้อมูล แทนที่จะพยายามจัดการกับแบบฟอร์ม ให้ใช้เอนทิตีสำรอง

ในเหตุการณ์แก้ไขแบบฟอร์มให้เพิ่มตัวจัดการการส่ง

$form['actions']['submit']['#submit'][] = [$this, 'checkCbid'];

ตรวจสอบว่าค่านี้เป็นค่าล่าสุดเมื่อส่ง

ฟังก์ชั่นสาธารณะ checkCbiRaceCondition (&$form, FormState &$form_state) {
  $enteredValue = $form_state->getValue('field_bond_cbid')[0]['value'];
  $defaultCbid = $form['field_bond_cbid']['widget'][0]['value']['#default_value'];
  ถ้า (intval($enteredValue) != $defaultCbid) {
    กลับ;
  }

  $result = \Drupal::database()
    -> แบบสอบถาม ('เลือกสูงสุด (field_bond_cbid_value) จาก {node__field_bond_cbid}')
    ->fetchField();

  ถ้า (ผลลัพธ์ $) {
    $cbid = $ผลลัพธ์ +1;
  } อื่น {
    $cbid = 1;
  }

  $form_state->set('field_bond_cbid', $cbid);
}

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา