Як отримати мітку пакета від юридичної особи


15

Як отримати зрозумілу людиною мітку пакета від завантаженої сутності.

Скажімо, я хочу отримати мітку вузла пакета 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 Я вважаю за краще не використовувати застарілі класи / функції

Відповіді:


24

Я не бачу нічого прямого, але завантаження вузла типу вузла є самим варіантом:

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

Або, як зазначив Бердір у коментарях, є більш швидкий шлях через поле посилання:

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

1
Дякую, це працює. Я б просто використав entitTypeManager замість застарілого entitManager.
Лінус

1
Моє погано, я не розумів, що це застаріло. Виправлено це
Клайв

9
Він не доступний як метод, але тип - це посилання на сутність, тому ви також можете просто зробити це: $ node-> type-> entit-> label ()
Бердір,

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.