Am creat două entități personalizate, entity_one și entity_two. entity_one are un câmp de referință al entității care vă permite să selectați un număr nelimitat de instanțe de entity_twos. Formularul de editare pentru entity_one pare să funcționeze bine. Câmpul există și se completează automat în mod corespunzător cu entity_twos. Cu toate acestea, de îndată ce trimit și creez un entity_one, pagina cu listă pentru entity_ones îmi dă eroarea.
Eroare: Apel la o funcție membru getValue() pe șirul în
Drupal\Core\Entity\ContentEntityBase->__sleep() (linia 524 din
core/lib/Drupal/Core/Entity/ContentEntityBase.php).
Dacă elimin acel anumit câmp și doar am câmpuri text, nu întâmpin acest comportament. Apare doar când am câmpul de referință al entității.
Primul meu instinct a fost poate în EntityOneListBuilder.php, acesta folosește un câmp din tabel care nu este formatat corect, dar singurele câmpuri folosite sunt ID și titlu.
Iată o parte din EntityOneListBuilder-ul meu
funcția publică statică createInstance(ContainerInterface $container, EntityTypeInterface $entity_type) {
returnează static nou (
$entity_type,
$container->get('entity_type.manager')->getStorage($entity_type->id()),
$container->get('url_generator')
);
}
funcția publică render() {
$build['descriere'] = [
'#markup' => $this->t('Text de descriere'),
];
$build['table'] = parent::render();
returnează $build;
}
funcția publică buildHeader() {
$header['id'] = $this->t('ID');
$header['titlu'] = $this->t('Titlu');
returnează $header + parent::buildHeader();
}
funcția publică buildRow(EntityInterface $entity) {
$row['id'] = $entity->id();
$row['titlu'] = $entity->toLink()->toString();
returnează $row + parent::buildRow($entity);
}
Și iată cum construiesc câmpul de referință al entității pentru entity_one
$fields['entity_twos'] = BaseFieldDefinition::create('entity_reference')
->setLabel(t('Câmpuri de formular'))
->setDescription(t('Câmpurile de adăugat la acest formular.'))
->setRevisionable(TRUE)
->setSetting('target_type', 'entity_two')
->setTargetEntityTypeId('entity_two')
->setSetting('handler','default')
->setDisplayOptions('view', [
'label' => 'ascuns',
'type' => 'entity_two',
„greutate” => 0,
])
->setDisplayOptions('form', [
'type' => 'entity_reference_autocomplete',
„greutate” => 5,
'settings' => [
'autocomplete_type' => 'etichete',
'size' => '60',
'match_operator' => 'CONTINE',
'placeholder' => ''',
],
])
->setDisplayConfigurable('form', true)
->setDisplayConfigurable('view', true)
->setRequired(TRUE)
->setCardinality(FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED);
De ce mi-ar sparge acel anumit câmp pagina de colecție?
Actualizați: Îmi dau seama că este posibil ca codul din entity_two să fie cel care îl rupe. Iată o parte din cod aici pentru referință
funcția publică statică 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('șir')
->setLabel(t('Titlu'))
->setSettings([
'max_length' => 255,
'text_processing' => 0,
])
->setDefaultValue(null)
->setDisplayOptions('view', [
'label' => 'mai sus',
'type' => 'șir',
„greutate” => -6,
])
->setDisplayOptions('form', [
'type' => 'string_textfield',
„greutate” => -6,
])
->setDisplayConfigurable('form', true)
->setDisplayConfigurable('view', true);
$fields['field_type'] = BaseFieldDefinition::create('list_string')
->setLabel(t('Tipul câmpului'))
->setDisplayOptions('view', [
'label' => 'vizibil',
'type' => 'list_default',
])
->setSettings([
'allowed_values' => [
'checkbox' => 'Checkbox',
'text_field' => 'Câmp de text',
],
])
->setDisplayOptions('form', [
'type' => 'options_select',
]);
$fields['allowed_values'] = BaseFieldDefinition::create('string_long')
->setLabel(t('Valori permise'))
->setDisplayOptions('view', [
'label' => 'vizibil',
'type' => 'șir_de_bază',
„greutate” => 6,
])
->setDisplayOptions('form', [
'type' => 'string_textarea',
'rânduri' => 6,
„greutate” => 6,
'settings' => ['rows' => 4],
])
->setDisplayConfigurable('form', true)
->setDisplayConfigurable('view', true);
$fields['langcode'] = BaseFieldDefinition::create('language')
->setLabel(t('Codul de limbă'))
->setDescription(
t('Codul de limbă al entității ContentEntityExample.')
);
$fields['created'] = BaseFieldDefinition::create('created')
->setLabel(t('Creat'))
->setDescription(t('Momentul la care a fost creată entitatea.'));
$fields['schimbat'] = BaseFieldDefinition::create('schimbat')
->setLabel(t('Schimbat'))
->setDescription(t('Ora la care entitatea a fost editată ultima dată.'));
returnează $câmpuri;
}
}
Actualizare 2: Pot confirma că eroarea se întâmplă atunci când încearcă să folosească getValue() pe id-ul entității la care se face referire. În ContentEntityBase.php eșuează aici:
funcție publică __sleep() {
// Obține valorile obiectelor câmp instanțiate, serializează doar valorile.
foreach ($this->fields ca $name => $fields) {
foreach ($fields ca $langcode => $field) {
$this->values[$name][$langcode] = $field->getValue();
}
}
Când valoarea $field este doar un șir simplu care conține id-ul entității la care se face referire.