Puncte:0

FieldItemList::getValue returnează întotdeauna un șir, chiar și pentru un câmp boolean

drapel gr

Se presupune că am adăugat un câmp boolean personalizat, a cărui cardinalitate este 1, la un tip de conținut. Creez un nod de acel tip de conținut, introdu o valoare pentru acel câmp (de exemplu, ADEVĂRAT) și salvați nodul.

Când primesc valoarea câmpului cu $valoare = nod->get('field_custom')->getValue(); $valoare conține următorul tablou.

0 => matrice (1)
  valoare => șir (1) „1”

Există o modalitate de a obține valoarea câmpului care reflectă tipul câmpului, boolean în acest caz?

0 => matrice (1)
  valoare => boolean adevărat

Am aruncat manual valoarea, de exemplu cu un cod similar cu următorul.

// Boolean
$valoare = (boolean) $valoare;

// Număr întreg
$valoare = intval($valoare);

am incercat si eu obține('x')->valoare si folosind __obține().

Drupal cunoaște tipul de câmp, din care este returnat $field->getFieldDefinition()->getType(). Bănuiesc că există o modalitate de a arunca corect valoarea câmpului.

Kevin avatar
drapel in
Valorile nu sunt exprimate la returnare de către Drupal.
Kevin avatar
drapel in
Puteți arunca ca `$valoare = (boolean) $valoare;`
Puncte:3
drapel cn

În mod normal, tipul de turnare nu contează: https://softwareengineering.stackexchange.com/questions/24378/type-casting-variables-in-php-what-is-the-practical-reason-for-doing-this.

Deci, recuperarea unei valori a câmpului de entitate nu trebuie să fie turnată:

$nod->field_bool->valoare

returnează un șir '0'/'1' sau NUL dacă câmpul este gol. Toate cele trei valori posibile funcționează conform așteptărilor în PHP. '1' rezultă logic adevărat și celelalte două valori logic false. Acest lucru reflectă modul în care este vizibil în UI, unde o casetă de selectare poate avea doar două stări. Golit este debifat, bifat este salvat ca '1' iar când este debifat din nou, este salvat ca '0'.

Cu toate acestea, sistemul de entități Drupal este construit pe date tastate și dacă doriți să scrieți cod OOP cu tip casting, puteți:

$node->field_bool->first()->get('value')->getCastedValue()

se intoarce FALS/ADEVĂRAT.

Avertisment: Acest lucru nu funcționează la nivel de teren. Trebuie să obțineți un element de câmp pentru a obține datele tip boolean și trebuie să prindeți un câmp gol pentru a evita get() pe NULL.

john Smith avatar
drapel gr
Vă mulțumesc foarte mult pentru răspuns, sunt total de acord, mai ales cu „normal”. Deci, pentru cazul meu, acest lucru este foarte util și funcționează bine pentru elementele primitive, cum ar fi întregul, booleanul float și șirul nu va arunca o dată și oră
4uk4 avatar
drapel cn
Pentru a *cast* un obiect data înlocuiți getCastedValue() cu [DateTimeIso8601::getDateTime()](https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21TypedData%21Type%21DateTimeInterface.php /function/DateTimeInterface%3A%3AgetDateTime/9.2.x).

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.