Como obter o rótulo do pacote da entidade

14

Como obtenho o rótulo legível por humanos de um pacote de uma entidade carregada.

Digamos que quero obter o rótulo de um nó do pacote my_article que é "Meu artigo incrível"

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

Só consigo obter o nome legível por máquina do pacote configurável ou o Rótulo da entidade ("tipo de conteúdo", "termo de taxonomia" etc.), mas como obtenho o rótulo do pacote configurável?

PS: eu preferiria não usar classes / funções obsoletas

Linus
fonte

Respostas:

23

Não vejo nada direto, carregar a entidade do tipo de nó é uma opção:

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

Ou, como Berdir apontou nos comentários, há uma maneira mais rápida de entrar no campo de referência da entidade:

$bundle_label = $node->type->entity->label();
Clive
fonte
1
Obrigado, isso funciona. Gostaria apenas de usar entityTypeManager em vez do entityManager obsoleto.
Linus
1
Meu mal, eu não percebi que foi preterido. Corrigido
Clive
9
Ele não está disponível como método, mas o tipo é uma referência de entidade, portanto, você também pode fazer isso: $ node-> type-> entity-> label ()
Berdir
1
Esta é responder apenas o tipo de nó .. e não entidades em geral ..
ssibal
2
@ssibal Sim, conforme a pergunta. A chave do pacote configurável será diferente por tipo de entidade (mas também pode ser recuperada dos metadados)
Clive
9

Observe que a resposta aceita se aplica especificamente às entidades do nó, mas todas as entidades possuem pacotes configuráveis. Muitas entidades, como userou menu_link_content(para links de menu personalizados), possuem apenas um pacote que corresponde ao próprio tipo de entidade.

O entity_type.bundle.infoserviço, implementado por Drupal \ Core \ Entity \ EntityTypeBundleInfo , fornece acesso às informações do pacote de entidades. Seus métodos getAllBundleInfo()e getBundleInfo($entity_type_id)retornam uma matriz codificada por tipo de entidade e nome da máquina de pacote configurável, respectivamente, com o primeiro contendo uma matriz de pacotes configurados por nome da máquina de pacote configurável. Cada pacote configurável possui uma labelchave com o nome amigável do pacote traduzido.

Abaixo está um exemplo que mostra a diferença entre nomes de máquinas de entidades de conteúdo, rótulos, nomes de máquinas de pacote configurável e rótulos de pacote configurável. O código supõe que haja pelo menos um link de menu personalizado com um ID de 1. Ele também supõe que existe um articletipo de nó (pacote configurável), que existe pelo menos um nó com um ID de 1e que o nó é do tipo nó (pacote configurável) 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;

Certifique-se de usar injeção de dependência sempre que possível em seu código, em vez de confiar nos métodos estáticos da Drupalclasse.

CalebD
fonte
É muito útil ter uma resposta que funcione para todos os tipos de entidade. Obrigado.
21419 JamesWilson
5

O seguinte também funciona:

$type = NodeType::load($node->bundle());
Filipe Miguel Fonseca
fonte
3

Se você não tiver certeza sobre o $entitytipo, pode ser:

if ($entity->bundle()) {
  $bundle_type_id = $entity->getEntityType()->getBundleEntityType();
  $bundle_label = \Drupal::entityTypeManager()
    ->getStorage($bundle_type_id)
    ->load($entity->bundle())
    ->label();
}
vijaycs85
fonte
Esta deve ser a resposta correta: pergunta inicial pedindo o "rótulo pacote de entidade" não o rótulo pacote de um nó ..
ssibal
1

Não é a solução mais eficiente, mas por uma questão de integridade, isso funciona:

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

ou

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