Cómo obtener la etiqueta del paquete de la entidad

14

¿Cómo obtengo la etiqueta legible para humanos de un paquete de una entidad cargada?

Digamos que quiero obtener la etiqueta de un nodo del paquete my_article, que es "Mi increíble artículo"

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

Solo puedo obtener el nombre legible por máquina del paquete o la etiqueta de entidad ("tipo de contenido", "término de taxonomía", etc.), pero ¿cómo obtengo la etiqueta del paquete?

PD: Preferiría que no use clases / funciones obsoletas

Linus
fuente

Respuestas:

23

No puedo ver nada directo, aunque cargar la entidad de tipo nodo es una opción:

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

O como Berdir señaló en los comentarios, hay una manera más rápida a través del campo de referencia de la entidad:

$bundle_label = $node->type->entity->label();
Clive
fuente
1
Gracias, eso funciona. Solo usaría entityTypeManager en lugar del entityManager en desuso.
Linus el
1
Lo malo, no me di cuenta de que estaba en desuso. Solucionado
Clive
99
No está disponible como método, pero el tipo es una referencia de entidad, por lo que también puede hacer esto: $ node-> type-> entity-> label ()
Berdir el
1
Esto responde solo al tipo de nodo ... y no a las entidades en general ...
ssibal
2
@ssibal Sip, según la pregunta. La clave del paquete será diferente por tipo de entidad (pero también se puede recuperar de los metadatos)
Clive
9

Tenga en cuenta que la respuesta aceptada se aplica específicamente a las entidades de nodo, pero todas las entidades tienen paquetes. Muchas entidades, como usero menu_link_content(para enlaces de menú personalizados), solo tienen un paquete que corresponde al tipo de entidad en sí.

El entity_type.bundle.infoservicio, implementado por Drupal \ Core \ Entity \ EntityTypeBundleInfo , proporciona acceso a la información del paquete de entidades. Sus métodos getAllBundleInfo()y getBundleInfo($entity_type_id)devolver una matriz con clave por tipo de entidad y nombre de máquina de paquete respectivamente, con el primero que contiene una matriz de paquetes con clave por nombre de máquina de paquete. Cada paquete tiene una labelclave con el nombre descriptivo del paquete traducido.

A continuación se muestra un ejemplo que muestra la diferencia entre los nombres de máquina de entidad de contenido, etiquetas, nombres de máquina de paquete y etiquetas de paquete. El código supone que hay al menos un enlace de menú personalizado con una ID de 1. También supone que hay un articletipo de nodo (paquete), que hay al menos un nodo con un ID de 1, y que el nodo es del tipo de nodo (paquete) 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;

Asegúrese de utilizar la inyección de dependencia siempre que sea posible en su código en lugar de confiar en los métodos estáticos de la Drupalclase.

CalebD
fuente
Muy útil para tener una respuesta que funcione para todos los tipos de entidad. Gracias.
JamesWilson
5

Lo siguiente también funciona:

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

Si no está seguro del $entitytipo, puede ser:

if ($entity->bundle()) {
  $bundle_type_id = $entity->getEntityType()->getBundleEntityType();
  $bundle_label = \Drupal::entityTypeManager()
    ->getStorage($bundle_type_id)
    ->load($entity->bundle())
    ->label();
}
vijaycs85
fuente
Esta debe ser la respuesta correcta: pregunta original pidiendo la "etiqueta de conjunto de la entidad" no la etiqueta de un nodo de paquete ..
ssibal
1

No es la solución más eficiente, pero en aras de la integridad, esto funciona:

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

o

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