Điểm:0

Tạo một phiên bản của thực thể tùy chỉnh với trường tham chiếu thực thể ngắt trang bộ sưu tập thực thể

lá cờ cn

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.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.