วิธีรับเลเบลมัดจากเอนทิตี


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

ฉันจะได้รับชื่อเครื่องที่สามารถอ่านได้ของบันเดิลหรือเลเบลของเอนทิตี ("ประเภทเนื้อหา", "คำศัพท์อนุกรมวิธาน" ฯลฯ ) แต่ฉันจะรับเลเบลของบันเดิลได้อย่างไร

PS ฉันไม่ต้องการใช้คลาส / ฟังก์ชั่นที่เลิกใช้แล้ว

คำตอบ:


24

ฉันไม่เห็นสิ่งใดโดยตรงการโหลดเอนทิตีชนิดโหนดเองเป็นตัวเลือก:

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

หรือตามที่ Berdir ชี้ให้เห็นในความคิดเห็นมีวิธีที่รวดเร็วกว่าในช่องอ้างอิงเอนทิตี:

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

1
ขอบคุณที่ใช้งานได้ ฉันจะใช้ entityTypeManager แทนเอนทิตีที่เลิกใช้แล้ว
ไลนัส

1
ฉันไม่ดีฉันไม่ได้ตระหนักว่ามันเลิกใช้แล้ว แก้ไขได้
Clive

9
ไม่สามารถใช้เป็นวิธีการได้ แต่ประเภทคือการอ้างอิงเอนทิตีดังนั้นคุณสามารถทำเช่นนี้ได้: $ node-> type-> entity-> label ()
Berdir

1
นี้จะตอบเพียงชนิดของโหน .. และไม่ได้หน่วยงานทั่วไป ..
ssibal

2
@ssibal Yep ตามคำถาม รหัสมัดจะแตกต่างกันตามประเภทของเอนทิตี (แต่สามารถดึงได้จากข้อมูลเมตา)
ไคลฟ์

9

โปรดทราบว่าคำตอบที่ได้รับการยอมรับนั้นใช้กับหน่วยงานโหนดโดยเฉพาะ แต่หน่วยงานทั้งหมดมีชุดข้อมูล เอนทิตีจำนวนมากเช่นuserหรือmenu_link_content(สำหรับลิงก์เมนูที่กำหนดเอง) มีเพียงหนึ่งบันเดิลซึ่งสอดคล้องกับประเภทเอนทิตีเอง

entity_type.bundle.infoบริการดำเนินการโดยDrupal \ หลัก \ Entity \ 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.