Cách lấy nhãn bó từ thực thể


14

Làm cách nào để tôi có được nhãn có thể đọc được của một gói từ một thực thể được tải.

Hãy nói rằng tôi muốn lấy nhãn của một nút gói my_article , đó là "Bài viết tuyệt vời của tôi"

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

Tôi chỉ có thể lấy tên có thể đọc được của gói hoặc Nhãn thực thể ("loại nội dung", "thuật ngữ phân loại", v.v.), nhưng làm cách nào để có được Nhãn của gói?

PS Tôi muốn nó không sử dụng các lớp / hàm không dùng nữa

Câu trả lời:


23

Tôi không thể thấy bất cứ điều gì trực tiếp, tải chính thực thể loại nút là một tùy chọn:

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

Hoặc như Berdir đã chỉ ra trong các bình luận, có một cách nhanh hơn thông qua trường tham chiếu thực thể:

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

1
Cảm ơn, điều đó làm việc. Tôi sẽ chỉ sử dụng entityTypeManager thay vì entityManager không dùng nữa.
Linus

1
Thật tệ, tôi đã không nhận ra nó đã bị phản đối. Đã sửa lỗi
Clive

9
Nó không có sẵn như là một phương thức, nhưng loại này là một tham chiếu thực thể, vì vậy bạn cũng có thể chỉ cần làm điều này: $ node-> type-> entity-> nhãn ()
Berdir

1
Điều này chỉ trả lời loại nút .. và không phải là các thực thể nói chung ..
ssibal

2
@ssibal Yep, theo câu hỏi. Khóa gói sẽ khác nhau cho mỗi loại thực thể (nhưng cũng có thể được truy xuất từ ​​siêu dữ liệu)
Clive

9

Lưu ý rằng câu trả lời được chấp nhận áp dụng cụ thể cho các thực thể nút nhưng tất cả các thực thể đều có gói. Nhiều thực thể, như userhoặc menu_link_content(đối với các liên kết menu tùy chỉnh), chỉ có một gói tương ứng với chính loại thực thể.

Các entity_type.bundle.infodịch vụ, thực hiện bởi Drupal \ Lõi \ Entity \ EntityTypeBundleInfo , cung cấp quyền truy cập vào thông tin gói thực thể. Các phương thức của nó getAllBundleInfo()getBundleInfo($entity_type_id)trả về một mảng được khóa theo loại thực thể và tên máy bó, tương ứng với một mảng sau đó chứa một mảng các khóa được khóa bởi tên máy bó. Mỗi gói có một labelkhóa với tên thân thiện với gói được dịch.

Dưới đây là một ví dụ cho thấy sự khác biệt giữa tên máy thực thể nội dung, nhãn, tên máy bó và nhãn bó. Mã này giả định rằng có ít nhất một liên kết menu tùy chỉnh với ID là 1. Nó cũng giả sử có một articleloại nút (bó), có ít nhất một nút có ID 1và nút đó thuộc loại nút (bó) 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;

Hãy chắc chắn sử dụng phép nội xạ phụ thuộc nếu có thể trong mã của bạn thay vì dựa vào các phương thức tĩnh của Drupallớp.


Rất hữu ích để có một câu trả lời hoạt động cho tất cả các loại thực thể. Cảm ơn.
JamesWilson


3

Nếu bạn không chắc chắn về $entityloại, nó có thể là:

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

Đây phải là câu trả lời đúng: câu hỏi ban đầu hỏi "nhãn bó của thực thể" không phải là nhãn bó của một nút ..
ssibal

1

Không phải là giải pháp hiệu quả nhất, nhưng để hoàn thiện, điều này hoạt động:

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

hoặc là

\Drupal::service('token')->replace('[node:type-name]', ['node' => $node]);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.