Come posso accedere a un valore di campo per un oggetto entità (ad es. Nodo)?


63

node_load((int) $nid)carica un'entità nodo completamente popolata. $node->title->valueottiene il titolo, ma come posso accedere ai valori dei campi in Drupal 8?

Risposte:


89

Immagino che non sia necessario convertirli $entityin un array, funzionerebbe semplicemente.

$entity->get('field_name')->getValue();

Cordiali saluti: l'utilizzo kint()dal devel_kintmodulo ti farà conoscere tutti i metodi disponibili che potrebbero essere utilizzati per accedere agli elementi dell'oggetto, quindi comparativamente var_dump()è meno utile.


14
In realtà dovrebbe essere: $ entity-> get ('field_name') -> value;
Ed Hollinghurst,

1
Sai perché questo è @EdHollinghurst? getValue in effetti fa un errore per me, ma (usando dpm) è elencato nei metodi disponibili, mentre 'valore' non lo è.
autopoietico

2
getValue()funziona per me (sia su 8.1.xe 8.2.x) vedi riferimento api
leon.nk

16
->getValue()è generico e funziona indipendentemente dal tipo di campo. Se lo usi ->value, funziona solo se il valore del campo è memorizzato in una valueproprietà. Non funzionerà per tipi più complessi (ad es. Data o riferimento dell'entità).
Pierre Buyle,

4
Questo codice da solo genererà un errore se l'entità non ha un campo chiamato "field_name". Assicurati che questo codice venga eseguito solo su entità in cui sai che esiste un campo, puoi usare $ entity-> hasField ('field_name') per testare, oppure if (! Empty ($ entity-> field_name))
oknate

56

in drupal 8, $ node è del nodo class

 $node->field_machine_name->getValue();

o

$node->get('field_machine_name')->getValue();

restituirà una matrice di valori.

Se ti aspetti solo uno, puoi anche stringere l'array con

$node->field_machine_name->getString();

o

 $node->get('field_machine_name')->getString();

Non "get" (stringa e valore) "esso". Potete per favore aggiungere qualche dettaglio in più per spiegare questa risposta? Cordiali saluti: non farlo mette la tua risposta a rischio di essere cancellata con moderazione (scusa ...)
Pierre.Vriens,

34

Per i campi dovresti essere in grado di usare $node->body->valuead esempio. Se non sai quali sono i nomi dei campi, ti consiglio di installare il modulo Devel per Drupal 8 e di ispezionare il nodo tramite like dsm($node).


1
come si rende quel campo allora?
Alex,

1
questo sembra essere obsoleto
Alex,

1
@Alex Ti consiglio di porre una nuova domanda sul problema che stai riscontrando. Al momento questa era una risposta ok, sembra disgustoso modificare la risposta ora che è una risposta su questa pagina che ha più punti di questa.
Tenken,

5
Controlla questo articolo per una bella spiegazione. Puoi usare $ node-> field_name-> value per ottenere un singolo valore (o la prima chiave del campo multi-valore). Oppure puoi usare $ node-> field_name-> getValue () per ottenere tutti i valori di un campo come un array.
Mirsoft,

2
@tenken: in realtà, è preferibile aggiornare una risposta esistente piuttosto che aggiungere una domanda ridondante con nuove risposte.
Pierre Buyle,

17

Puoi sempre fare $entity->toArray()per vedere cosa c'è in un'entità. Anche quando si usa xdebug (ad esempio con phpstorm) è molto difficile dare un senso a un oggetto entità da solo. Dubito che dsm($node)in Drupal 8 abbia senso. Se insisti nel debug nel browser (ma non dovresti, Drupal 8 è troppo complesso per eseguire il debug senza xdebug) dsm($node->toArray())è ciò che desideri.


$ node-> toArray () non funziona per me su Drupal 8.
Axel Briche

Si prega di aggiungere una nuova domanda in dettaglio. Drupal\Core\Entity\EntityInterfaceha toArray.

1
Questa risposta non fornisce la soluzione; downvoting.
colan,

Sebbene questa risposta non sia necessariamente una risposta diretta a questa domanda, è una maledettamente grande funzione. Grazie.
Stef Van Looveren,

14

Utilizzare il seguente frammento di codice per ottenere i valori dei campi del nodo

Questo è usato per ottenere l'ID nodo dall'URL

$nid = \Drupal::routeMatch()->getRawParameter($node_id);

Per caricare i dati del nodo utilizzando nid

$node = \Drupal::entityTypeManager()->getStorage('node')->load($nid);

Questo è usato per ottenere il valore del campo.

$terms = $node->get('field_Name')->getValue();  

Questo è usato per ottenere il titolo del nodo.

$product_name = $node->getTitle();

2
Carica il nodo in questo modo: $ nid = \ Drupal :: routeMatch () -> getRawParameter ('node'); $ node = \ Drupal :: entityTypeManager () -> getStorage ('node') -> load ($ nid);
rémy il

8

Per me, avendo un $entity(un nodo) questo ha funzionato:

$entity->field_name->getValue();

usando 8.1.


2
Questo ottiene tutti i valori di un campo multi-valore in un array. Ovviamente può essere utilizzato anche per ottenere il valore del campo a valore singolo, tuttavia l'output conterrà quindi un array con un singolo valore. Per ottenere un singolo valore di un campo (o il primo valore di un campo multivalore), utilizzare $ entity-> field_name-> value
Mirsoft

7

Durante l'utilizzo (l'attuale modo corretto):

$node = \Drupal\node\Entity\Node::load($nid);
$node->get('nid')->value; // returns a raw value - Node ID

// Following both returns array structure containing value/target id nested value.
$node->get('nid')->value(); 
$node->nid->getValue();


4

È semplicemente:

$node->get('field_name')->getValue();

Se il campo è un campo di riferimento dell'entità, ci sono alcuni modi speciali per ottenere le entità referenziate.

Per ottenere l'id di destinazione (primo elemento):

$entity->get('field_entity_reference')->target_id;

Per ottenere l'entità caricata (primo elemento):

$entity->get('field_entity_reference')->entity;

Quando si utilizza ->entitysul campo carica automaticamente l'entità.

Se il campo può contenere più riferimenti, puoi recuperarli tutti in questo modo:

$entities = $entity->get('field_entity_reference')->referencedEntities();

Questo ti darà una serie di entità.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.