エンティティからバンドルラベルを取得する方法


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();

または、Berdirがコメントで指摘したように、エンティティ参照フィールドをより迅速に確認する方法があります。

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

1
おかげで、それは動作します。非推奨のentityManagerではなく、entityTypeManagerを使用します。
リーナス

1
私の悪い、私はそれが非推奨であることに気づかなかった。修正済み
クライヴ

9
メソッドとしては使用できませんが、タイプはエンティティ参照なので、次のようにすることもできます。$
node-

1
これはノードタイプのみに応答しています。一般的なエンティティには応答していません
。– ssibal

2
@ssibalうん、質問どおり。バンドルキーはエンティティタイプごとに異なります(ただし、メタデータからも取得できます)
Clive

9

受け入れられた回答は、特にノードエンティティに適用されますが、すべてのエンティティにはバンドルがあります。userまたはmenu_link_content(カスタムメニューリンク用)などの多くのエンティティには、エンティティタイプ自体に対応するバンドルが1つしかありません。

entity_type.bundle.info実装されたサービス、Drupalは\コア\エンティティ\ EntityTypeBundleInfoは、エンティティバンドル情報へのアクセスを提供します。そのメソッドは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


すべてのエンティティタイプに有効な回答があれば非常に役立ちます。ありがとう。
ジェームズウィルソン


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]);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.