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

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

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.


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


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();
}

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]);
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.