Рейтинг: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 и title.

Вот часть моего EntityOneListBuilder

общедоступная статическая функция createInstance (ContainerInterface $container, EntityTypeInterface $entity_type) {
    вернуть новую статику(
      $entity_type,
      $container->get('entity_type.manager')->getStorage($entity_type->id()),
      $контейнер->получить('url_generator')
    );
  }

  публичная функция рендеринга () {
    $сборка['описание'] = [
      '#markup' => $this->t('Текст описания'),
    ];
    $build['table'] = parent::render();
    вернуть $сборку;
  }

  общедоступная функция buildHeader() {
    $header['id'] = $this->t('ID');
    $header['title'] = $this->t('Title');
    вернуть $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('Поля для добавления в эту форму.'))
            ->setRevisionable(ИСТИНА)
            ->setSetting('target_type', 'entity_two')
            ->setTargetEntityTypeId('entity_two')
            ->setSetting('обработчик','по умолчанию')
            ->setDisplayOptions('вид', [
                'метка' => 'скрыто',
                'тип' => 'entity_two',
                'вес' => 0,
            ])
            ->setDisplayOptions('форма', [
                'тип' => 'entity_reference_autocomplete',
                'вес' => 5,
                'настройки' => [
                    'autocomplete_type' => 'теги',
                    'размер' => '60',
                    'match_operator' => 'СОДЕРЖИТ',
                    'заполнитель' => '',
                ],
            ])
            ->setDisplayConfigurable('форма', правда)
            ->setDisplayConfigurable('вид', правда)
            -> setRequired (ИСТИНА)
            ->setCardinality(FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED);

Почему именно это поле сломает мою страницу коллекции?

Обновить: Я понимаю, что код в entity_two может быть тем, что его ломает. Вот некоторые из кода здесь для справки

    общедоступная статическая функция baseFieldDefinitions(
        EntityTypeInterface $entity_type
    ) {
        $fields['id'] = BaseFieldDefinition::create('integer')
            ->setLabel(t('ID'))
            -> установить только для чтения (истина);

        $fields['uuid'] = BaseFieldDefinition::create('uuid')
            ->setLabel(t('UUID'))
            -> установить только для чтения (истина);

        $fields['title'] = BaseFieldDefinition::create('string')
            ->setLabel(t('Заголовок'))
            -> установить настройки ([
                'max_length' => 255,
                'текстовая_обработка' => 0,
            ])
            ->setDefaultValue (ноль)
            ->setDisplayOptions('вид', [
                'метка' => 'выше',
                'тип' => 'строка',
                'вес' => -6,
            ])
            ->setDisplayOptions('форма', [
                'тип' => 'строковое_текстовое поле',
                'вес' => -6,
            ])
            ->setDisplayConfigurable('форма', правда)
            ->setDisplayConfigurable('вид', правда);
        $fields['field_type'] = BaseFieldDefinition::create('list_string')
            ->setLabel(t('Тип поля'))
            ->setDisplayOptions('вид', [
                'метка' => 'видимый',
                'тип' => 'список_по умолчанию',
            ])
            -> установить настройки ([
                'разрешенные_значения' => [
                    'флажок' => 'Флажок',
                    'text_field' => 'Текстовое поле',
                ],
            ])
            ->setDisplayOptions('форма', [
                'тип' => 'options_select',
            ]);
        $fields['allowed_values'] = BaseFieldDefinition::create('string_long')
            ->setLabel(t('Разрешенные значения'))
            ->setDisplayOptions('вид', [
                'метка' => 'видимый',
                'тип' => 'базовая_строка',
                'вес' => 6,
            ])
            ->setDisplayOptions('форма', [
                'тип' => 'string_textarea',
                'ряды' => 6,
                'вес' => 6,
                'настройки' => ['строки' => 4],
            ])
            ->setDisplayConfigurable('форма', правда)
            ->setDisplayConfigurable('вид', правда);
        $fields['код языка'] = BaseFieldDefinition::create('язык')
            ->setLabel(t('Код языка'))
            -> установитьОписание(
                t('Код языка сущности ContentEntityExample.')
            );
        $fields['создано'] = BaseFieldDefinition::create('создано')
            ->setLabel(t('Создано'))
            ->setDescription(t('Время создания сущности.'));

        $fields['изменено'] = BaseFieldDefinition::create('изменено')
            ->setLabel(t('Изменено'))
            ->setDescription(t('Время последнего редактирования сущности.'));

        вернуть $поля;
    }
}

Обновление 2: Я могу подтвердить, что ошибка возникает, когда он пытается использовать getValue() для идентификатора объекта, на который ссылается. В ContentEntityBase.php здесь происходит сбой:

  общественная функция __sleep() {
    // Получить значения созданных объектов полей, только сериализовать значения.
    foreach ($this->fields as $name => $fields) {
      foreach ($fields как $langcode => $field) {
        $this->values[$name][$langcode] = $field->getValue();
      }
    }

Когда значение $field представляет собой простую строку, содержащую идентификатор объекта, на который делается ссылка.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.