Score:0

การสร้างอินสแตนซ์ของเอนทิตีแบบกำหนดเองที่มีฟิลด์อ้างอิงเอนทิตีจะแบ่งหน้าการรวบรวมเอนทิตี

ธง cn

ฉันสร้างเอนทิตีแบบกำหนดเองสองรายการ คือentity_one และentity_two entity_one มีฟิลด์อ้างอิงเอนทิตีที่ช่วยให้คุณสามารถเลือกอินสแตนซ์ของ entity_twos ได้ไม่จำกัด แบบฟอร์มแก้ไขสำหรับ entity_one ดูเหมือนจะทำงานได้ดี ฟิลด์นี้มีอยู่และเติมข้อมูลโดยอัตโนมัติด้วย entity_twos อย่างไรก็ตาม ทันทีที่ฉันส่งและสร้าง entity_one หน้ารายการสำหรับ entity_ones แสดงข้อผิดพลาดให้ฉัน

ข้อผิดพลาด: การเรียกใช้ฟังก์ชันสมาชิก getValue() ในสตริง Drupal\Core\Entity\ContentEntityBase->__sleep() (บรรทัดที่ 524 ของ core/lib/Drupal/Core/Entity/ContentEntityBase.php)

หากฉันลบฟิลด์นั้นออกและมีเพียงฟิลด์ข้อความ ฉันไม่พบพฤติกรรมนี้ มันเกิดขึ้นเมื่อฉันมีฟิลด์อ้างอิงเอนทิตีเท่านั้น สัญชาตญาณแรกของฉันอาจอยู่ใน EntityOneListBuilder.php ซึ่งใช้ฟิลด์ในตารางที่จัดรูปแบบไม่ถูกต้อง แต่ฟิลด์ที่ใช้คือ ID และชื่อเท่านั้น

นี่คือส่วนหนึ่งของ EntityOneListBuilder ของฉัน

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

  ฟังก์ชันสาธารณะแสดงผล () {
    $build['รายละเอียด'] = [
      '#markup' => $this->t('ข้อความอธิบาย'),
    ];
    $build['table'] = parent::render();
    ส่งคืน $build;
  }

  buildHeader ฟังก์ชันสาธารณะ () {
    $header['id'] = $this->t('ID');
    $header['title'] = $this->t('ชื่อเรื่อง');
    ส่งคืน $header + parent::buildHeader();
  }

  
  ฟังก์ชันสาธารณะ buildRow (EntityInterface $entity) {
    $row['id'] = $entity->id();
    $row['title'] = $entity->toLink()->toString();
    ส่งคืน $row + parent::buildRow($entity);
  }

และนี่คือวิธีที่ฉันสร้างฟิลด์อ้างอิงเอนทิตีสำหรับ entity_one

    $fields['entity_twos'] = BaseFieldDefinition::create('entity_reference')
            ->setLabel(t('ฟิลด์แบบฟอร์ม'))
            ->setDescription(t('ฟิลด์ที่จะเพิ่มในแบบฟอร์มนี้'))
            ->ตั้งค่าแก้ไขได้(จริง)
            ->setSetting('target_type', 'entity_two')
            ->setTargetEntityTypeId('entity_two')
            ->setSetting('ตัวจัดการ','ค่าเริ่มต้น')
            ->setDisplayOptions('ดู', [
                'ฉลาก' => 'ซ่อน',
                'type' => 'entity_two',
                'น้ำหนัก' => 0,
            ])
            ->setDisplayOptions('แบบฟอร์ม', [
                'type' => 'entity_reference_autocomplete',
                'น้ำหนัก' => 5,
                'การตั้งค่า' => [
                    'autocomplete_type' => 'แท็ก',
                    'ขนาด' => '60',
                    'match_operator' => 'มี',
                    'placeholder' => '',
                ]
            ])
            ->setDisplayConfigurable('รูปแบบ', จริง)
            ->setDisplayConfigurable('ดู', จริง)
            -> setRequired (จริง)
            ->ตั้งค่าจำนวนนับ (FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED);

เหตุใดฟิลด์นั้นจึงทำลายหน้าคอลเลกชันของฉัน

อัปเดต: ฉันรู้ว่าเป็นไปได้ที่รหัสใน entity_two อาจเป็นสิ่งที่ทำลายมัน นี่คือรหัสบางส่วนที่นี่สำหรับการอ้างอิง

    ฟังก์ชันสาธารณะคงที่ baseFieldDefinitions(
        EntityTypeInterface $entity_type
    ) {
        $fields['id'] = BaseFieldDefinition::create('จำนวนเต็ม')
            ->setLabel(t('รหัส'))
            ->setReadOnly(จริง);

        $fields['uuid'] = BaseFieldDefinition::create('uuid')
            ->setLabel(t('UUID'))
            ->setReadOnly(จริง);

        $fields['title'] = BaseFieldDefinition::create('สตริง')
            ->setLabel(t('ชื่อเรื่อง'))
            ->ตั้งค่าการตั้งค่า([
                'max_length' => 255,
                'text_processing' => 0,
            ])
            ->setDefaultValue(โมฆะ)
            ->setDisplayOptions('ดู', [
                'ฉลาก' => 'ด้านบน',
                'ประเภท' => 'สตริง',
                'น้ำหนัก' => -6,
            ])
            ->setDisplayOptions('แบบฟอร์ม', [
                'type' => 'string_textfield',
                'น้ำหนัก' => -6,
            ])
            ->setDisplayConfigurable('รูปแบบ', จริง)
            ->setDisplayConfigurable('ดู', จริง);
        $fields['field_type'] = BaseFieldDefinition::create('list_string')
            ->setLabel(t('ประเภทฟิลด์'))
            ->setDisplayOptions('ดู', [
                'label' => 'visible',
                'type' => 'list_default',
            ])
            ->ตั้งค่าการตั้งค่า([
                'allowed_values' => [
                    'ช่องทำเครื่องหมาย' => 'ช่องทำเครื่องหมาย',
                    'text_field' => 'ช่องข้อความ',
                ]
            ])
            ->setDisplayOptions('แบบฟอร์ม', [
                'type' => 'ตัวเลือก_select',
            ]);
        $fields['allowed_values'] = BaseFieldDefinition::create('string_long')
            ->setLabel(t('ค่าที่อนุญาต'))
            ->setDisplayOptions('ดู', [
                'label' => 'visible',
                'type' => 'basic_string',
                'น้ำหนัก' => 6,
            ])
            ->setDisplayOptions('แบบฟอร์ม', [
                'type' => 'string_textarea',
                'แถว' => 6,
                'น้ำหนัก' => 6,
                'การตั้งค่า' => ['แถว' => 4],
            ])
            ->setDisplayConfigurable('รูปแบบ', จริง)
            ->setDisplayConfigurable('ดู', จริง);
        $fields['langcode'] = BaseFieldDefinition::create('ภาษา')
            ->setLabel(t('รหัสภาษา'))
            ->ชุดคำอธิบาย(
                t('รหัสภาษาของเอนทิตี ContentEntityExample')
            );
        $fields['created'] = BaseFieldDefinition::create('สร้าง')
            ->setLabel(t('สร้าง'))
            ->setDescription(t('เวลาที่สร้างเอนทิตี'));

        $fields['เปลี่ยน'] = BaseFieldDefinition::create('เปลี่ยน')
            ->setLabel(t('เปลี่ยนแปลงแล้ว'))
            ->setDescription(t('เวลาที่เอนทิตีถูกแก้ไขครั้งล่าสุด'));

        ส่งคืนฟิลด์ $;
    }
}

อัปเดต 2: ฉันสามารถยืนยันได้ว่าข้อผิดพลาดเกิดขึ้นเมื่อพยายามใช้ getValue() กับรหัสของเอนทิตีที่อ้างอิง ใน ContentEntityBase.php ล้มเหลวที่นี่:

  ฟังก์ชั่นสาธารณะ __sleep () {
    // รับค่าของอ็อบเจกต์ฟิลด์ที่สร้างอินสแตนซ์ เฉพาะค่าอนุกรมเท่านั้น
    foreach ($this->fields เป็น $name => $fields) {
      foreach ($fields เป็น $langcode => $field) {
        $this->values[$name][$langcode] = $field->getValue();
      }
    }

เมื่อค่าของ $field เป็นเพียงสตริงธรรมดาที่มีรหัสของเอนทิตีที่อ้างอิง

โพสต์คำตอบ

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