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.