Puncte:0

Crearea unei instanțe de entitate personalizată cu câmpul de referință la entitate întrerupe pagina de colectare a entității

drapel cn

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.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.