Cara mendapatkan label bundel dari entitas


14

Bagaimana cara mendapatkan label bundel yang dapat dibaca manusia dari entitas yang dimuat.

Katakanlah saya ingin mendapatkan label dari simpul bundel my_article yang merupakan "Artikel Luar Biasa Saya"

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

Saya hanya bisa mendapatkan nama bundel atau Label entitas yang dapat dibaca mesin ("tipe konten", "istilah taksonomi", dll.), Tetapi bagaimana cara mendapatkan Label bundel?

PS Saya lebih suka tidak menggunakan kelas / fungsi yang sudah usang

Jawaban:


23

Saya tidak bisa melihat apa pun secara langsung, memuat entitas tipe simpul itu sendiri adalah sebuah opsi:

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

Atau seperti yang ditunjukkan Berdir dalam komentar, ada cara yang lebih cepat melalui bidang referensi entitas:

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

1
Terima kasih, itu berhasil. Saya hanya akan menggunakan entitasTypeManager daripada entitasManager yang sudah tidak digunakan lagi.
Linus

1
Buruk saya, saya tidak menyadari itu sudah usang. Memperbaikinya
Clive

9
Ini tidak tersedia sebagai metode, tetapi jenisnya adalah referensi entitas, jadi Anda juga bisa melakukan ini: $ node-> type-> label-> label ()
Berdir

1
Ini hanya menjawab jenis simpul .. dan bukan entitas secara umum ..
ssibal

2
@ssibal Yap, sesuai pertanyaan. Kunci bundel akan berbeda per jenis entitas (tetapi juga dapat diambil dari metadata)
Clive

9

Perhatikan bahwa jawaban yang diterima berlaku khusus untuk entitas simpul tetapi semua entitas memiliki bundel. Banyak entitas, seperti useratau menu_link_content(untuk tautan menu khusus), hanya memiliki satu bundel yang sesuai dengan jenis entitas itu sendiri.

The entity_type.bundle.infolayanan, dilaksanakan oleh Drupal \ Inti \ Entity \ EntityTypeBundleInfo , menyediakan akses ke informasi entitas bundel. Metode-metodenya getAllBundleInfo()dan getBundleInfo($entity_type_id)mengembalikan array yang diketik berdasarkan jenis entitas dan nama mesin bundel masing-masing, dengan yang sebelumnya berisi array bundel yang dikunci dengan nama mesin bundel. Setiap bundel memiliki labelkunci dengan nama ramah bundel yang diterjemahkan.

Di bawah ini adalah contoh yang menunjukkan perbedaan antara nama mesin entitas konten, label, nama mesin bundel, dan label bundel. Kode ini mengasumsikan bahwa setidaknya ada satu tautan menu khusus dengan ID dari 1. Ini juga mengasumsikan ada articletipe simpul (bundel), bahwa setidaknya ada satu simpul dengan ID 1, dan bahwa simpul tersebut adalah tipe simpul (bundel) 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;

Pastikan untuk menggunakan injeksi dependensi jika memungkinkan dalam kode Anda daripada mengandalkan metode statis Drupalkelas.


Sangat membantu memiliki jawaban yang berfungsi untuk semua jenis entitas. Terima kasih.
JamesWilson


3

Jika Anda tidak yakin tentang $entityjenisnya, itu bisa:

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

Ini harus menjadi jawaban yang benar: pertanyaan awal menanyakan "bundle label of entity" bukan label bundle dari sebuah node ..
ssibal

1

Bukan solusi yang paling efisien, tetapi demi kelengkapan, ini berfungsi:

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

atau

\Drupal::service('token')->replace('[node:type-name]', ['node' => $node]);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.