엔티티에서 번들 레이블을 얻는 방법


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

기계 판독 가능 번들 이름 또는 엔티티 레이블 ( "컨텐트 유형", "택시 용어"등) 만 가져올 수 있지만 번들 레이블은 어떻게 얻습니까?

추신 : 더 이상 사용되지 않는 클래스 / 함수를 사용하지 않는 것이 좋습니다.

답변:


24

노드 유형 엔터티 자체를로드하는 것은 옵션이지만 직접 볼 수는 없습니다.

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

또는 Berdir이 주석에서 지적했듯이 엔티티 참조 필드를 통해 더 빠른 방법이 있습니다.

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

1
고마워요. 더 이상 사용되지 않는 entityManager 대신 entityTypeManager를 사용하려고합니다.
Linus

1
내 나쁜, 나는 그것이 더 이상 사용되지 않는다는 것을 몰랐다. 수정
Clive

9
메소드로 사용할 수 없지만 유형은 엔티티 참조이므로 다음을 수행 할 수도 있습니다. $ node-> type-> entity-> label ()
Berdir

1
이것은 일반적으로 엔티티가 아닌 노드 유형에만 응답합니다.
ssibal

2
질문에 따라 @ ssibal Yep. 번들 키는 엔터티 유형에 따라 달라 지지만 메타 데이터에서 검색 할 수도 있습니다.
Clive

9

허용 된 답변은 노드 엔터티에 적용되지만 모든 엔터티에는 번들이 있습니다. user또는 menu_link_content(사용자 정의 메뉴 링크의 경우) 와 같은 많은 엔티티 에는 엔티티 유형 자체에 해당하는 하나의 번들 만 있습니다.

entity_type.bundle.info에 의해 구현 서비스, 드루팔 \ 코어 \ 법인 \ 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]);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.