Comment obtenir le libellé de bundle depuis l'entité

14

Comment puis-je obtenir le libellé lisible par l'homme d'un bundle à partir d'une entité chargée.

Disons que je veux obtenir le label d'un nœud du bundle my_article qui est "Mon article génial"

// 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'.

Je ne peux obtenir que le nom lisible par machine du bundle ou le Label d'entité ("type de contenu", "terme de taxonomie", etc.), mais comment obtenir le Label du bundle?

PS Je préférerais qu'il n'utilise pas de classes / fonctions obsolètes

Linus
la source

Réponses:

23

Je ne vois rien de direct, cependant, le chargement de l'entité de type de nœud est une option:

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

Ou, comme Berdir l'a souligné dans les commentaires, il existe un moyen plus rapide de parcourir le champ de référence d'entité:

$bundle_label = $node->type->entity->label();
Clive
la source
1
Merci, ça marche. Je voudrais simplement utiliser entityTypeManager au lieu du entityManager obsolète.
Linus
1
Mon mauvais, je ne savais pas qu'il était obsolète. Correction
Clive
9
Ce n'est pas disponible en tant que méthode, mais le type est une référence d'entité, vous pouvez donc simplement le faire: $ node-> type-> entity-> label ()
Berdir
1
Cela ne répond qu'au type de nœud .. et non aux entités en général ..
ssibal
2
@ssibal Yep, selon la question. La clé du bundle sera différente par type d'entité (mais peut également être récupérée à partir des métadonnées)
Clive
9

Notez que la réponse acceptée s'applique spécifiquement aux entités de noeud mais toutes les entités ont des bundles. De nombreuses entités, comme userou menu_link_content(pour les liens de menu personnalisés), n'ont qu'un seul ensemble qui correspond au type d'entité lui-même.

Le entity_type.bundle.infoservice, implémenté par Drupal \ Core \ Entity \ EntityTypeBundleInfo , permet d'accéder aux informations sur les ensembles d'entités. Ses méthodes getAllBundleInfo()et getBundleInfo($entity_type_id)renvoient respectivement un tableau composé par type d'entité et par nom de machine de regroupement, le premier contenant alors un tableau de regroupements codés par nom de machine de regroupement. Chaque paquet a une labelclé avec le nom convivial du paquet traduit.

Voici un exemple qui montre la différence entre les noms de machine d'entité de contenu, les étiquettes, les noms de machine de bundle et les étiquettes de bundle. Le code suppose qu'il existe au moins un lien de menu personnalisé avec un ID de 1. Il suppose également qu'il existe un articletype de nœud (bundle), qu'il existe au moins un nœud avec un ID de 1et que le nœud est du type de nœud (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;

Assurez-vous d'utiliser l' injection de dépendances dans la mesure du possible dans votre code plutôt que de vous fier aux méthodes statiques de la Drupalclasse.

CalebD
la source
Très utile pour avoir une réponse qui fonctionne pour tous les types d'entités. Merci.
JamesWilson
5

Les travaux suivants fonctionnent également:

$type = NodeType::load($node->bundle());
Filipe Miguel Fonseca
la source
3

Si vous n'êtes pas sûr du $entitytype, il peut s'agir:

if ($entity->bundle()) {
  $bundle_type_id = $entity->getEntityType()->getBundleEntityType();
  $bundle_label = \Drupal::entityTypeManager()
    ->getStorage($bundle_type_id)
    ->load($entity->bundle())
    ->label();
}
vijaycs85
la source
Cela devrait être la bonne réponse: question originale demandant le "label de bundle de l'entité" et non le label de bundle d'un nœud ..
ssibal
1

Pas la solution la plus efficace, mais par souci d'exhaustivité, cela fonctionne:

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

ou

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