A livello di codice ottenere tutti i nomi di un campo di riferimento dell'entità


10

Esempio: voglio ottenere tutti i nomi dei tag che si trovano all'interno dei field_tags del nodo 5.

Posso ottenere il target_id con $ node-> field_tags-> getValue () ;

inserisci qui la descrizione dell'immagine

Ma il problema è che non so a quale entità appartiene il valore target_id. Potrebbe essere un ID nodo, un ID termine, un ID utente. Senza queste informazioni, non sono in grado di utilizzare target_id per ottenere il nome del tag.

Come posso ottenere tutti i nomi di un campo di riferimento dell'entità?

Risposte:


20

Il modo più semplice per ottenere ciò che vuoi è qualcosa del genere:

$names = [];
foreach ($node->field_tags as $item) {
  if ($item->entity) {
    $names[$item->entity->id()] = $item->entity->label();
  }
}

->entityè una cosiddetta proprietà calcolata, non viene visualizzata in getValues(). Tutti i campi di riferimento lo hanno.

E sì, dimentica print_r()l'entità o altri oggetti complessi. Contengono oggetti che si riferiscono l'un l'altro e print_r()non possono gestirlo. Se hai un'entità, usa sempre print_r($entity->toArray()), otterrai solo i valori dei campi. È possibile installare il modulo di sviluppo o utilizzare un debugger, ma ciò fornirà la struttura interna di un'entità, che non è proprio ciò che si desidera vedere.


2
$node->toArray();sembra molto più corto e pulito dell'uso\Drupal::service('entity_field.manager')->getFieldDefinitions('node', 'article');
No Sssweat,

Dove trovi la documentazione su questo?
AlxVallejo,

Puoi trovare alcune informazioni qui ad esempio: drupal.org/docs/8/api/entity-api
Berdir

@Berdir: print_r($entity->toArray())risolve questo problema. Sono in grado di ottenere tutti i dettagli dei campi. Grazie mille.
Kalidasan,

@Berdir puoi essere più specifico sulla documentazione? Ho cercato in quella pagina ma non ho visto esempi specifici relativi ai campi di riferimento dei termini.
Keven,

6

Un campo di riferimento dell'entità, per definizione, può scegliere come target solo un tipo di entità in modo da poter sapere qual è il tipo di destinazione richiamando getSetting()la definizione del campo.

// Print the targeted entity type field.
$field = \Drupal\field\Entity\FieldStorageConfig::loadByName('node','field_tags');
echo $field->getSetting('target_type');

O meglio ancora, utilizzare EntityReferenceFieldItemList::referencedEntities()per richiamare le entità referenziate del nodo e i dati associati necessari.

// Return an array of Entity objects referenced in the field.
$node->field_tags->referencedEntities();

print_r($node->field_tag->referencedEntities());sembra essere un porco di risorse, ho dovuto aggiornare la mia istanza AWS , solo per poterlo fare, dato che continuavo a ricevere WSOD.
No Sssweat,

Fammi sapere se questa dovrebbe essere una domanda separata. Come posso accedere al valore del nome, quando nell'array dice valori: protetto, il che significa che è possibile accedervi solo all'interno della classe.
No Sssweat,

Mi dispiace non accettare la tua risposta, ma la risposta di @Berdir non mi ha dato altra scelta che farlo. Non ho mai capito come ottenere il valore usando il tuo Or better yetmetodo. Il primo metodo è buono, ma richiederà se le istruzioni controllano il tipo di destinazione e quindi ottengono il valore. La risposta di Berdir è più efficiente in quanto non sono necessari controlli.
No Sssweat,

1
Non sudare (... gioco di parole inteso). La prima versione della tua domanda non era troppo chiara sul tuo obiettivo. Dovresti contrassegnare la risposta più adatta.
Shawn Conn,

Vorrei davvero che questa risposta non fosse sepolta in questo post SO. Volevo ottenere il target_typevalore da un entity_referencecampo e cercarlo in alto e in basso ... finché non hai risposto alla mia domanda qui.
Keven,
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.