Как получить метку пакета от сущности


14

Как получить удобочитаемую метку пакета из загруженного объекта?

Допустим, я хочу получить метку узла связки my_article, которая называется «Моя потрясающая статья»

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

Я могу получить только машиночитаемое имя пакета или метку сущности («тип контента», «термин таксономии» и т. Д.), Но как мне получить метку пакета?

PS Я бы предпочел не использовать устаревшие классы / функции

Ответы:


23

Я не вижу ничего непосредственного, хотя загрузка самой сущности типа узла является опцией:

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

Или, как отметил Бердир в комментариях, есть более быстрый путь через поле ссылки на сущность:

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

1
Спасибо, это работает. Я бы просто использовал entityTypeManager вместо устаревшего entityManager.
Линус

1
Мой плохой, я не осознавал, что это устарело. Исправлено
Клайв

9
Он не доступен как метод, но тип является ссылкой на сущность, поэтому вы также можете просто сделать это: $ node-> type-> entity-> label ()
Berdir

1
Это отвечает только на тип узла .., а не на сущности вообще ..
ssibal

2
@ssibal Да, согласно вопросу. Ключ пакета будет отличаться в зависимости от типа объекта (но также может быть получен из метаданных)
Clive

9

Обратите внимание, что принятый ответ относится конкретно к объектам узла, но все объекты имеют пакеты. Многие объекты, такие как userили menu_link_content(для пользовательских ссылок меню), имеют только один пакет, соответствующий самому типу объекта.

entity_type.bundle.infoСервис, реализуемый Drupal \ ядро \ Entity \ EntityTypeBundleInfo , обеспечивает доступ к информации , сущность расслоения. Его методы getAllBundleInfo()и getBundleInfo($entity_type_id)возвращают массив, основанный на типе сущности и имени компьютера пакета соответственно, а первый содержит массив пакетов, ключом которого является имя компьютера пакета. У каждого пакета есть labelключ с переведенным дружественным названием пакета.

Ниже приведен пример, который показывает разницу между именами компьютеров сущности контента, метками, именами машин комплекта и метками комплекта. Код предполагает, что есть хотя бы одна пользовательская ссылка меню с идентификатором1 . Также предполагается, что существует articleтип узла (связка), что существует хотя бы один узел с идентификатором 1, и что узел имеет тип узла (связка) 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;

Обязательно используйте инъекцию зависимостей возможности в своем коде, а не полагайтесь на статические методы Drupalкласса.


Очень полезно иметь ответ, который работает для всех типов объектов. Благодарю.
Джеймс Энтони Уилсон


3

Если вы не уверены в $entityтипе, это может быть:

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

Это должен быть правильный ответ: оригинальный вопрос, задающий «метку пакета сущности», а не метку пакета узла.
ssibal

1

Не самое эффективное решение, но для полноты картины это работает:

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

или

\Drupal::service('token')->replace('[node:type-name]', ['node' => $node]);
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.