Come ottenere l'etichetta del pacchetto dall'entità


14

Come posso ottenere l'etichetta leggibile dall'uomo di un pacchetto da un'entità caricata.

Diciamo che voglio ottenere l'etichetta di un nodo del bundle my_article che è "Il mio fantastico articolo"

// Load a node
$node = Drupal::entityManager()->getStorage('node')->load(4);

print $node->bundle(); // prints the machine-readable name. e.g. 'my_article'.

print $node->getEntityType()->getBundleLabel(); // prints 'content type'.

Sono in grado di ottenere solo il nome leggibile dal computer del pacchetto o l'etichetta dell'entità ("tipo di contenuto", "termine di tassonomia", ecc.), Ma come posso ottenere l'etichetta del pacchetto?

PS Preferirei che non usasse classi / funzioni deprecate

Risposte:


23

Non riesco a vedere nulla di diretto, il caricamento dell'entità del tipo di nodo stesso è un'opzione però:

$bundle_label = \Drupal::entityTypeManager()
  ->getStorage('node_type')
  ->load($node->bundle())
  ->label();

O come ha sottolineato Berdir nei commenti, c'è un modo più rapido nel campo di riferimento dell'entità:

$bundle_label = $node->type->entity->label();

1
Grazie, funziona. Vorrei solo utilizzare entityTypeManager invece di entityManager deprecato.
Linus,

1
Mio male, non mi rendevo conto che era deprecato. Risolto il problema
Clive

9
Non è disponibile come metodo, ma il tipo è un riferimento di entità, quindi puoi anche farlo: $ node-> type-> entity-> label ()
Berdir

1
Questo sta rispondendo solo al tipo di nodo ... e non alle entità in generale ...
ssibal

2
@ssibal Sì, come da domanda. La chiave del bundle sarà diversa per tipo di entità (ma può anche essere recuperata dai metadati)
Clive

9

Si noti che la risposta accettata si applica specificamente alle entità nodo ma tutte le entità hanno fasci. Molte entità, come usero menu_link_content(per i collegamenti di menu personalizzati), hanno solo un pacchetto che corrisponde al tipo di entità stesso.

Il entity_type.bundle.infoservizio, implementato da Drupal \ Core \ Entity \ EntityTypeBundleInfo , fornisce l'accesso alle informazioni sul pacchetto di entità. I suoi metodi getAllBundleInfo()e getBundleInfo($entity_type_id)restituiscono una matrice codificata rispettivamente per tipo di entità e nome macchina bundle, con la prima contenente quindi una matrice di bundle chiave per nome macchina bundle. Ogni pacchetto ha una labelchiave con il nome descrittivo del pacchetto tradotto.

Di seguito è riportato un esempio che mostra la differenza tra nomi macchina, etichette, nomi macchina bundle ed etichette pacchetto entità entità contenuto. Il codice presuppone che esista almeno un collegamento di menu personalizzato con un ID di 1. Presuppone inoltre che esista un articletipo di nodo (bundle), che vi sia almeno un nodo con un ID di 1e che il nodo sia del tipo di nodo (bundle) article.

<?php

$entity_type_manager = \Drupal::entityTypeManager();
$bundle_info = \Drupal::service("entity_type.bundle.info")->getAllBundleInfo();

$current_user = \Drupal::currentUser()->getAccount();

// Prints "user".
print $current_user->getEntityTypeId() . PHP_EOL;

// Prints "User".
print $current_user->getEntityType()->getLabel() . PHP_EOL;

// Prints "user".
print $current_user->bundle() . PHP_EOL;

// Prints "User".
print $bundle_info[$current_user->getEntityTypeId()][$current_user->bundle()]['label'] . PHP_EOL;

$my_menu_link = $entity_type_manager->getStorage('menu_link_content')->load(1);

// Prints "menu_link_content".
print $my_menu_link->getEntityTypeId() . PHP_EOL;

// Prints "Custom menu link".
print $my_menu_link->getEntityType()->getLabel() . PHP_EOL;

// Prints "menu_link_content".
print $my_menu_link->bundle() . PHP_EOL;

// Prints "Custom menu link".
print $bundle_info[$my_menu_link->getEntityTypeId()][$my_menu_link->bundle()]['label'] . PHP_EOL;

$my_article = $entity_type_manager->getStorage('node')->load(1);

// Prints "node".
print $my_article->getEntityTypeId() . PHP_EOL;

// Prints "Content".
print $my_article->getEntityType()->getLabel() . PHP_EOL;

// Prints "article".
print $my_article->bundle() . PHP_EOL;

// Prints "Article".
print $bundle_info[$my_article->getEntityTypeId()][$my_article->bundle()]['label'] . PHP_EOL;

Assicurati di usare l' iniezione delle dipendenze, ove possibile, nel tuo codice piuttosto che fare affidamento sui metodi statici della Drupalclasse.


Molto utile avere una risposta che funzioni per tutti i tipi di entità. Grazie.
JamesWilson,


3

Se non sei sicuro del $entitytipo, può essere:

if ($entity->bundle()) {
  $bundle_type_id = $entity->getEntityType()->getBundleEntityType();
  $bundle_label = \Drupal::entityTypeManager()
    ->getStorage($bundle_type_id)
    ->load($entity->bundle())
    ->label();
}

Questa dovrebbe essere la risposta corretta: domanda originale che pone la "etichetta bundle di entità" non l'etichetta bundle di un nodo ...
ssibal

1

Non è la soluzione più efficiente, ma per completezza, funziona:

\Drupal::token()->replace('[node:type-name]', ['node' => $node]);

o

\Drupal::service('token')->replace('[node:type-name]', ['node' => $node]);
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.