ฉันสร้างเอนทิตีแบบกำหนดเองสองรายการ คือ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 เป็นเพียงสตริงธรรมดาที่มีรหัสของเอนทิตีที่อ้างอิง