Tôi đã tạo hai thực thể tùy chỉnh, thực thể_một và thực thể_hai. entity_one có một trường tham chiếu thực thể cho phép bạn chọn các phiên bản không giới hạn của entity_twos. Biểu mẫu chỉnh sửa cho entity_one dường như hoạt động tốt. Trường này tồn tại và tự động điền đúng thực thể_twos. Tuy nhiên, ngay sau khi tôi gửi và tạo một entity_one, trang danh sách cho entity_ones sẽ báo lỗi cho tôi.
Lỗi: Gọi hàm thành viên getValue() trên chuỗi trong
Drupal\Core\Entity\ContentEntityBase->__sleep() (dòng 524 của
core/lib/Drupal/Core/Entity/ContentEntityBase.php).
Nếu tôi xóa trường cụ thể đó và chỉ có trường văn bản, tôi không gặp phải hành vi này. Nó chỉ xảy ra khi tôi có trường tham chiếu thực thể.
Bản năng đầu tiên của tôi có thể là trong EntityOneListBuilder.php của tôi, nó sử dụng một trường trong bảng không được định dạng đúng nhưng các trường duy nhất được sử dụng là ID và tiêu đề.
Đây là một phần của EntityOneListBuilder của tôi
hàm tĩnh công cộng createInstance(ContainerInterface $container, EntityTypeInterface $entity_type) {
trả về tĩnh mới (
$entity_type,
$container->get('entity_type.manager')->getStorage($entity_type->id()),
$container->get('url_generator')
);
}
chức năng công cộng kết xuất () {
$build['description'] = [
'#markup' => $this->t('Văn bản mô tả'),
];
$build['table'] = parent::render();
trả lại bản dựng $;
}
chức năng công khai buildHeader() {
$header['id'] = $this->t('ID');
$header['title'] = $this->t('Title');
trả về $header + parent::buildHeader();
}
chức năng công cộng buildRow(EntityInterface $entity) {
$row['id'] = $entity->id();
$row['title'] = $entity->toLink()->toString();
trả về $row + parent::buildRow($entity);
}
Và đây là cách tôi xây dựng trường tham chiếu thực thể cho entity_one
$fields['entity_twos'] = BaseFieldDefinition::create('entity_reference')
->setLabel(t('Trường biểu mẫu'))
->setDescription(t('Các trường để thêm vào biểu mẫu này.'))
->đặtCó thể xem lại(TRUE)
->setSetting('target_type', 'entity_two')
->setTargetEntityTypeId('entity_two')
->setSetting('xử lý','mặc định')
->setDisplayOptions('view', [
'nhãn' => 'ẩn',
'loại' => 'thực thể_hai',
'trọng lượng' => 0,
])
->setDisplayOptions('biểu mẫu', [
'type' => 'entity_reference_autocomplete',
'trọng lượng' => 5,
'cài đặt' => [
'autocomplete_type' => 'thẻ',
'kích thước' => '60',
'match_operator' => 'CHỨA',
'giữ chỗ' => '',
],
])
->setDisplayConfigurable('form', true)
->setDisplayConfigurable('view', true)
-> thiết lậpBắt buộc(TRUE)
->setCardinality(FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED);
Tại sao trường cụ thể đó lại phá trang bộ sưu tập của tôi?
cập nhật: Tôi nhận ra rằng có thể mã trong entity_two có thể là thứ đã phá vỡ nó. Đây là một số mã ở đây để tham khảo
hàm tĩnh công khai baseFieldDefinitions(
EntityTypeInterface $entity_type
) {
$fields['id'] = BaseFieldDefinition::create('integer')
->setLabel(t('ID'))
-> setReadOnly(true);
$fields['uuid'] = BaseFieldDefinition::create('uuid')
->setLabel(t('UUID'))
-> setReadOnly(true);
$fields['title'] = BaseFieldDefinition::create('string')
->setLabel(t('Tiêu đề'))
->setSettings([
'độ dài tối đa' => 255,
'xử lý văn bản' => 0,
])
-> setDefaultValue(null)
->setDisplayOptions('view', [
'nhãn' => 'ở trên',
'loại' => 'chuỗi',
'trọng lượng' => -6,
])
->setDisplayOptions('biểu mẫu', [
'type' => 'string_textfield',
'trọng lượng' => -6,
])
->setDisplayConfigurable('form', true)
->setDisplayConfigurable('view', true);
$fields['field_type'] = BaseFieldDefinition::create('list_string')
->setLabel(t('Loại Trường'))
->setDisplayOptions('view', [
'nhãn' => 'hiển thị',
'type' => 'list_default',
])
->setSettings([
'giá trị_được phép' => [
'hộp kiểm' => 'Hộp kiểm',
'text_field' => 'Trường văn bản',
],
])
->setDisplayOptions('biểu mẫu', [
'type' => 'options_select',
]);
$fields['allowed_values'] = BaseFieldDefinition::create('string_long')
->setLabel(t('Giá trị được phép'))
->setDisplayOptions('view', [
'nhãn' => 'hiển thị',
'type' => 'basic_string',
'trọng lượng' => 6,
])
->setDisplayOptions('biểu mẫu', [
'type' => 'string_textarea',
'hàng' => 6,
'trọng lượng' => 6,
'cài đặt' => ['hàng' => 4],
])
->setDisplayConfigurable('form', true)
->setDisplayConfigurable('view', true);
$fields['langcode'] = BaseFieldDefinition::create('language')
->setLabel(t('Mã ngôn ngữ'))
->setDes mô tả(
t('Mã ngôn ngữ của thực thể ContentEntityExample.')
);
$fields['created'] = BaseFieldDefinition::create('created')
->setLabel(t('Đã tạo'))
->setDescription(t('Thời gian thực thể được tạo.'));
$fields['changed'] = BaseFieldDefinition::create('changed')
->setLabel(t('Đã thay đổi'))
->setDescription(t('Thời gian thực thể được chỉnh sửa lần cuối.'));
trả lại các trường $;
}
}
Cập nhật 2: Tôi có thể xác nhận rằng lỗi xảy ra khi nó cố gắng sử dụng getValue() trên id của thực thể được tham chiếu. Trong ContentEntityBase.php nó không thành công ở đây:
hàm công khai __sleep() {
// Nhận các giá trị của các đối tượng trường được khởi tạo, chỉ tuần tự hóa các giá trị.
foreach ($this->fields as $name => $fields) {
foreach ($fields as $langcode => $field) {
$this->values[$name][$langcode] = $field->getValue();
}
}
Khi giá trị của $field chỉ là một chuỗi đơn giản chứa id của thực thể được tham chiếu.