web-dev-qa-db-fra.com

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

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

Disons que je veux obtenir l'étiquette d'un nœud de paquet mon_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?

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

16
Linus

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();
25
Clive

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 user ou 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 service entity_type.bundle.info, Implémenté par Drupal\Core\Entity\EntityTypeBundleInfo , donne accès aux informations sur les ensembles d'entités. Ses méthodes getAllBundleInfo() et getBundleInfo($entity_type_id) renvoient un tableau indexé par type d'entité et nom de machine de bundle respectivement, le premier contenant alors un tableau de bundles saisis par nom de machine de bundle. Chaque bundle a une clé label avec le nom convivial du bundle 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 type de nœud article (bundle), qu'il existe au moins un nœud avec un ID de 1 Et que le nœud est du type 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 injection de dépendances dans la mesure du possible dans votre code plutôt que de vous fier aux méthodes statiques de la classe Drupal.

9
CalebD

Les travaux suivants fonctionnent également:

$type = NodeType::load($node->bundle());
5

Si vous n'êtes pas sûr de la $entity type, il peut être:

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

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]);
1
oknate