Score:0

เหตุใดแบบฟอร์มจึงไม่เก็บค่าที่สร้างขึ้นระหว่างการก่อสร้าง

ธง sa

นี่คือแบบฟอร์มที่ใช้ DI สำหรับ $this->entity_type_manager

นอกจากนี้ยังมีปุ่มตัวเลือกพร้อม Ajax (ฉันได้เพิ่มรหัสเนื่องจากอาจเป็นสาเหตุของปัญหาของฉัน)

คลาส myForm ขยาย FormBase {

  ส่วนตัว ?EntityTypeManagerInterface $entity_type_manager=NULL;

  ฟังก์ชั่นสาธารณะ __construct (Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager) {

    $this->entity_type_manager=$entity_type_manager;
  }

  สร้างฟังก์ชันคงที่สาธารณะ (ContainerInterface $container) {
    ส่งคืนค่าคงที่ใหม่ (
      $container->get('entity_type.manager'),
    );
  }

  ฟังก์ชันสาธารณะ buildForm (อาร์เรย์ $form, FormStateInterface $form_state) {
    // เก็บค่าใน $form_state เพื่อใช้ในการส่ง
    $form_state->set('entity_type_manager', $this->entity_type_manager);
    ...
    // บางทีส่วนประกอบ Ajax อาจเป็นปัญหา
    $form['คอนเทนเนอร์'] = [
      '#type' => 'คอนเทนเนอร์',
      '#prefix' => '<div id="ajax-wrapper">',
      '#suffix' => '</div>',
      'my_radio' => [
        '#type' => 'วิทยุ',
        '#options' => ["option1","option2"],
        '#required' => จริง,
        '#default_value' => $type_of_bo,
        '#อาแจ็กซ์' => [
          'callback' => [$this, 'ajaxGetInvestmentHandler'],
          'wrapper' => 'ajax-wrapper',
          'เหตุการณ์' => 'คลิกอินพุต',
        ]
      ]
      ...
    ];
  }

  ฟังก์ชันสาธารณะคงที่ ajaxGetInvestmentHandler (อาร์เรย์ $form, FormStateInterface $form_state) {
    ส่งคืน $form['container'];
  }
  
  ฟังก์ชันสาธารณะ submitForm (อาร์เรย์ &$form, FormStateInterface $form_state) {
    // $this->entity_type_manager เป็นโมฆะ
    // $form_state->get('entity_type_manager') ยังเป็นโมฆะ
    ...
  }

  ...
  
}

อย่างที่คุณเห็นใน ส่ง, $this->entity_type_manager เป็น NULL และ $form_state->get('entity_type_manager') ยังเป็น NULL

เกิดอะไรขึ้น?

Jaypan avatar
de flag
"อย่างที่คุณเห็น" - เราจะเห็นสิ่งนี้ได้อย่างไร ไม่มีเหตุผลว่าทำไมจึงควรเป็นโมฆะ คุณรู้ได้อย่างไรว่าเป็นโมฆะ
Baud avatar
sa flag
ขอโทษที่ไม่ชัดเจนพอ ฉันหมายความว่าฉันได้ทำการทดสอบค่าเหล่านั้นแล้วและมีค่าเป็น NULL (ดังที่แสดงโดย somments ในการส่ง) ฉันยอมรับว่าสิ่งนี้ไม่ควรเป็น NULL แต่มันคือ... อาจจะมาจาก AJAX?
Jaypan avatar
de flag
ตามรหัสที่แสดง เป็นไปไม่ได้ที่ `$this->entity_type_manager` จะเป็นโมฆะ ไม่สามารถเรียกใช้ฟังก์ชัน submitForm โดยไม่สร้างอินสแตนซ์ของฟอร์ม และฟอร์มต้องการให้ตัวแปรถูกส่งไปยังฟอร์มนั้นเพื่อสร้างฟอร์ม นั่นเป็นเหตุผลที่ฉันถามว่าคุณวินิจฉัยว่าเป็น NULL ได้อย่างไร
Baud avatar
sa flag
$this->entity_type_manager ยังเป็น NULL ในฟังก์ชันตรวจสอบ...
No Sssweat avatar
ua flag
เนื่องจากคุณกำลังตั้งค่าเป็น null... `$entity_type_manager=NULL;`
Baud avatar
sa flag
หากฉันไม่ได้ตั้งค่าเป็น NULL เป็นค่าเริ่มต้น ฉันจะได้รับ `$entity_type_manager must be not be accessed before initialization`
Jaypan avatar
de flag
นั่นเป็นปัญหาที่แตกต่างกัน
Score:2
ธง cn

ดังที่คุณเห็นในการส่ง $this->entity_type_manager เป็นโมฆะ

คุณต้องประกาศคุณสมบัติของบริการ มีการป้องกัน. ไม่สามารถเรียกคืนคุณสมบัติส่วนตัวได้ ดู https://www.drupal.org/docs/drupal-apis/services-and-dependency-injection/dependency-injection-for-a-form#s-considerations-for-dependency-injection

.. และ $form_state->get('entity_type_manager') ก็เป็นโมฆะเช่นกัน

form_state ไม่ถูกแคชระหว่างการสร้างแบบฟอร์มแรกและคำขอส่ง ดู buildForm: ความแตกต่างระหว่างการโหลดหน้าซ้ำกับการโทรกลับ ajax เป็นอย่างไร. และเมื่อคุณเรียกใช้การสร้างแบบฟอร์มในคำขอ Ajax ในภายหลัง ให้คุณเขียนทับค่าสถานะของแบบฟอร์มด้วย NULL

Baud avatar
sa flag
นี่คือเวทมนตร์ คุณช่วยชีวิตฉัน!!!

โพสต์คำตอบ

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