Jak uzyskać etykietę pakietu od encji


15

Jak uzyskać czytelną dla człowieka etykietę pakietu od załadowanej jednostki.

Powiedzmy, że chcę uzyskać etykietę węzła pakietu my_article, który brzmi „Mój wspaniały artykuł”

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

Jestem w stanie uzyskać nazwę pakietu do odczytu maszynowego lub etykietę encji („typ zawartości”, „termin systematyki” itp.), Ale jak mogę uzyskać etykietę pakietu?

PS Wolałbym nie używać przestarzałych klas / funkcji

Odpowiedzi:


24

Nie widzę nic bezpośredniego, ładowanie samego obiektu typu węzła jest jednak opcją:

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

Lub, jak zauważył Berdir w komentarzach, istnieje szybsze przejście przez pole odniesienia encji:

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

1
Dzięki, to działa. Chciałbym użyć po prostu podmiotTypeManager zamiast przestarzałego obiektuManager.
Linus

1
Mój zły, nie zdawałem sobie sprawy, że to jest przestarzałe. Naprawiono
Clive

9
Nie jest dostępna jako metoda, ale typ jest odwołaniem do encji, więc możesz również po prostu to zrobić: $ node-> type-> entity-> label ()
Berdir

1
Odpowiada to tylko na typ węzła ... a nie na ogół podmioty ...
ssibal

2
@ssibal Tak, zgodnie z pytaniem. Klucz pakietu będzie różny w zależności od typu jednostki (ale można go również pobrać z metadanych)
Clive

9

Zauważ, że zaakceptowana odpowiedź dotyczy konkretnie węzłów, ale wszystkie podmioty mają pakiety. Wiele encji, takich jak userlub menu_link_content(dla niestandardowych łączy menu), ma tylko jeden pakiet, który odpowiada samemu typowi encji.

entity_type.bundle.infoUsługi, realizowane przez Drupala podstawowej \ \ Entity \ EntityTypeBundleInfo , zapewnia dostęp do informacji jednostka wiązki. Jego metody getAllBundleInfo()i getBundleInfo($entity_type_id)zwracana jest tablica wpisywana odpowiednio według typu jednostki i nazwy maszyny pakującej, przy czym ta pierwsza zawiera tablicę pakietów kluczowanych według nazwy maszyny pakującej. Każdy pakiet ma labelklucz z przetłumaczoną przyjazną nazwą pakietu.

Poniżej znajduje się przykład pokazujący różnicę między nazwami komputerów encji treści, etykietami, nazwami maszyn pakujących i etykietami pakietów. Kod zakłada, że ​​istnieje co najmniej jedno niestandardowe łącze menu o identyfikatorze 1. Zakłada również, że istnieje articletyp węzła (pakiet), że istnieje co najmniej jeden węzeł o identyfikatorze 1i że węzeł jest typu węzła (pakiet) 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;

Pamiętaj, aby w kodzie używać wstrzykiwania zależności, zamiast polegać na statycznych metodach Drupalklasy.


Bardzo pomocne, aby uzyskać odpowiedź, która działa dla wszystkich typów jednostek. Dzięki.
JamesWilson


3

Jeśli nie masz pewności co do $entitytypu, może to być:

if ($entity->bundle()) {
  $bundle_type_id = $entity->getEntityType()->getBundleEntityType();
  $bundle_label = \Drupal::entityTypeManager()
    ->getStorage($bundle_type_id)
    ->load($entity->bundle())
    ->label();
}

To powinna być prawidłowa odpowiedź: oryginalne pytanie zadające „etykietę pakietu encji”, a nie etykietę pakietu węzła.
ssibal

1

Nie jest to najbardziej wydajne rozwiązanie, ale dla kompletności działa to:

\Drupal::token()->replace('[node:type-name]', ['node' => $node]);

lub

\Drupal::service('token')->replace('[node:type-name]', ['node' => $node]);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.