如何从实体获取捆绑包标签


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我希望它不要使用不推荐使用的类/函数

Answers:


24

我看不到任何直接的信息,虽然可以选择加载节点类型实体本身:

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

或正如Berdir在评论中指出的那样,有一种更快的方法来访问实体引用字段:

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

1
谢谢,那行得通。我只会使用EntityTypeManager而不是已弃用的entityManager。
Linus

1
不好,我没意识到它已被弃用。修正了问题
克莱夫(Clive)

9
它不能作为方法使用,但是类型是实体引用,因此您也可以执行以下操作:$ node-> type->
entity-

1
这只是在回答节点类型..而不是一般的实体
。.– ssibal

2
@ssibal是的,根据问题。绑定密钥因实体类型而异(但也可以从元数据中检索)
Clive

9

请注意,接受的答案专门适用于节点实体,但是所有实体都有捆绑。许多实体,例如usermenu_link_content(对于自定义菜单链接),只有一个捆绑包,与实体类型本身相对应。

entity_type.bundle.infoDrupal \ Core \ Entity \ EntityTypeBundleInfo实现的服务提供对实体捆绑包信息的访问。它的方法getAllBundleInfo()和分别getBundleInfo($entity_type_id)返回一个以实体类型和捆绑计算机名称为键的数组,其中前者包含一个以捆绑计算机名称作为键的捆绑数组。每个捆绑软件都有一个label带有翻译后的捆绑软件友好名称的密钥。

下面的示例显示了内容实体机器名称,标签,捆绑计算机名称和捆绑标签之间的区别。该代码假定至少有一个ID为的自定义菜单链接1。它还假定存在一个article节点类型(捆绑),至少有一个ID为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类的静态方法。


拥有适用于所有实体类型的答案非常有帮助。谢谢。
JamesWilson


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]);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.