Puncte:0

Cum pot obține un câmp cu mai multe valori inserat corect?

drapel kz

Am un modul personalizat care creează un tip de câmp. Este un câmp text simplu și l-am adăugat la un tip de conținut folosind interfața de utilizare Drupal. Cardinalitatea acestui câmp este „Nelimitat”.

Iată cum creez câmpul în cod:

clasa MyItem extinde FieldItemBase {

  /**
   * {@inheritdoc}
   */
  schema funcției statice publice (FieldStorageDefinitionInterface $field_definition) {
    întoarcere [
      'coloane' => [
        „valoare” => [
          'type' => 'text',
          'dimensiune' => 'minuscul',
          „nu nul” => FALSE,
        ],
        'safevalue' => [
          'type' => 'text',
          'dimensiune' => 'minuscul',
          „nu nul” => FALSE,
        ],
      ],
    ];
  }

  /**
   * {@inheritdoc}
   */
  funcția publică statică propertyDefinitions(FieldStorageDefinitionInterface $field_definition) {
    $properties['value'] = DataDefinition::create('șir')
      ->setLabel(t('Valoare'));
    $properties['safevalue'] = DataDefinition::create('șir')
      ->setLabel(t('Valoare sigură'))
      ->setComputed(TRUE);
    returnează $proprietăți;
  }

}

După cum puteți vedea, există două coloane: valoare ar trebui să stocheze intrarea brută a utilizatorului. valoare de siguranță ar trebui să stocheze o versiune igienizată a datelor.

Pentru testarea asta. Fac asta doar în interior hook_node_presave():

function mymodule_node_presave(\Drupal\Core\Entity\EntityInterface $entity) {
  comutați ($entity->getBundle()) {
    caz „mybundle”:
      $entity->field_myfield = ['unu', 'două', 'trei'];
      $entity->field_myfield->safevalue = ['unu', 'două', 'trei'];
      pauză;
  }
}

Dacă câmpul are cardinalitatea 1 (adică valorile introduse sunt scalare), aceasta funcționează bine.

Cu toate acestea, dacă inserez matrice, când examinez baza de date și mă uit la tabel node__câmp_câmpul meu, văd că coloanele field_myfield_value și field_myfield_safevalue ambele există cu configurații identice.

Dacă creez un nod folosind UI, observ asta:

  • field_myfield_value coloana conține trei rânduri cu șirurile „unu”, „două” și „trei”. Este corect.
  • field_myfield_safevalue au șirul „Matrice” în primul rând și NULL în celelalte două. Este gresit.

Bănuiesc că ceea ce face ca lucrurile să meargă prost este că acesta este un câmp cu mai multe valori și că trebuie să folosesc o altă acțiune pentru a introduce valorile corect.

Cum pot obține un câmp cu mai multe valori inserat corect în valoare de siguranță coloană?

Puncte:3
drapel cn

Deltele câmpului sunt cu un nivel mai sus decât proprietățile.

$entity->field_myfield = [
  0 => [
    'value' => 'unu',
    'safevalue' => 'unul',
  ],
  1 => [
    „value” => „două”,
    'safevalue' => 'două',
  ],
  2 => [
    'value' => 'trei',
    'safevalue' => 'trei',
  ],
];

BTW când salvați proprietatea câmpului, atunci nu specificați >setComputed(TRUE). Acest lucru se întâmplă numai atunci când calculați valoarea câmpului într-un plugin de date tastat.

Free Radical avatar
drapel kz
Nu sunt sigur dacă vă înțeleg „BTW”. Intenția este de a *calcula* valorile sigure prin rularea valorilor brute printr-o funcție de dezinfectare. În exemplu, nu am făcut acest lucru pentru a păstra exemplul simplu. Dacă calculez valorile sigure așa cum este descris, nu ar trebui să folosesc `->setComputed(TRUE)`?
4uk4 avatar
drapel cn
Valorile calculate sunt calculate în memorie, nu salvate în baza de date. Acest lucru se face de obicei într-un plugin de date tastate (specificat în `DataDefinition::create()` sau suprascris în `->setClass()`. Atunci nu aveți nicio problemă cu deltele câmpurilor, deoarece datele tastate sunt mai granulare .
Free Radical avatar
drapel kz
OK, mulțumesc pentru explicația suplimentară. Am eliminat proprietatea.
Puncte:1
drapel cn

Când accesezi

$entity->field_myfield->safevalue

Aceasta este implicit primul element din valoarea de siguranță a listei de câmpuri. Nu setați valoarea sigură pentru toate deltele din acel câmp.

Pentru a face acest lucru, trebuie să setați fiecare valoare separat. Ca astfel:

$valori = [
  ['value' => 'foo', 'safevalue' => 'bar'],
  ['value' => 'foo2', 'safevalue' => 'bar2'],
];
$entitate->câmp_câmpul meu = $valori;

Rețineți că există mai multe permutări diferite ale celor de mai sus, aceasta este doar una dintre ele, dacă stilul dvs. obișnuit de cod pentru setarea proprietăților entității este diferit, este bine să îl utilizați în schimb.

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.