ロードされたエンティティからバンドルの人間が読めるラベルを取得するにはどうすればよいですか。
バンドルのノードのラベルを取得したいとしましょうmy_article"My awesome 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'.
バンドルの機械可読名またはエンティティのラベル(「コンテンツタイプ」、「分類用語」など)しか取得できませんが、バンドルのラベルを取得するにはどうすればよいですか?
追伸非推奨のクラス/関数を使用しない方がいい
ノードタイプエンティティ自体の読み込みはオプションですが、直接見ることはできません。
$bundle_label = \Drupal::entityTypeManager()
->getStorage('node_type')
->load($node->bundle())
->label();
または、Berdirがコメントで指摘しているように、エンティティ参照フィールドをすばやく処理する方法があります。
$bundle_label = $node->type->entity->label();
受け入れられた回答は特にノードエンティティに適用されますが、すべてのエンティティにはバンドルがあります。 user
や_menu_link_content
_(カスタムメニューリンクの場合)などの多くのエンティティには、エンティティタイプ自体に対応するバンドルが1つしかありません。
Drupal\Core\Entity\EntityTypeBundleInfo によって実装される_entity_type.bundle.info
_サービスは、エンティティバンドル情報へのアクセスを提供します。そのメソッドgetAllBundleInfo()
およびgetBundleInfo($entity_type_id)
は、エンティティタイプとバンドルマシン名でそれぞれキー付けされた配列を返します。前者には、バンドルマシン名でキー付けされたバンドルの配列が含まれています。各バンドルには、翻訳されたバンドルのわかりやすい名前が付いたlabel
キーがあります。
以下は、コンテンツエンティティのマシン名、ラベル、バンドルマシン名、およびバンドルラベルの違いを示す例です。このコードでは、IDが_1
_のカスタムメニューリンクが少なくとも1つあると想定しています。また、article
ノードタイプ(バンドル)があり、IDが_1
_のノードが少なくとも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
クラスの静的メソッドに依存するのではなく、コード内で可能な限り 依存性注入 を使用してください。
以下も機能します:
$type = NodeType::load($node->bundle());
$entity
タイプが不明な場合は、次のようになります。
if ($entity->bundle()) {
$bundle_type_id = $entity->getEntityType()->getBundleEntityType();
$bundle_label = \Drupal::entityTypeManager()
->getStorage($bundle_type_id)
->load($entity->bundle())
->label();
}
最も効率的なソリューションではありませんが、完全を期すために、これは機能します。
\Drupal::token()->replace('[node:type-name]', ['node' => $node]);
または
\Drupal::service('token')->replace('[node:type-name]', ['node' => $node]);