Lập trình lấy tất cả tên của trường tham chiếu thực thể


7

Ví dụ: Tôi muốn nhận tất cả các tên thẻ nằm trong field_tags của nút 5.

Tôi có thể nhận được target_id với getValues ​​() ;

nhập mô tả hình ảnh ở đây

Nhưng vấn đề là, tôi không biết giá trị target_id thuộc về thực thể nào. Có thể là id nút, id thuật ngữ, id người dùng. Không có thông tin đó, tôi không thể sử dụng target_id để lấy tên của thẻ.

Làm cách nào tôi có thể nhận được tất cả tên của trường tham chiếu thực thể?

Câu trả lời:


19

Cách dễ nhất để có được những gì bạn muốn là một cái gì đó như thế này:

$names = [];
foreach ($node->field_tags as $item) {
  if ($item->entity) {
    $names[$item->entity->id()] = $item->entity->label();
  }
}

->entitylà một tài sản được gọi là tính toán, nó không xuất hiện trong getValues(). Tất cả các lĩnh vực tham khảo có nó.

Và vâng, quên về print_r()thực thể hoặc các đối tượng phức tạp khác. Chúng chứa các đối tượng tham chiếu lẫn nhau và print_r()không thể xử lý điều đó. Nếu bạn có một thực thể, luôn luôn sử dụng print_r($entity->toArray()), thì bạn chỉ nhận được các giá trị trường. Bạn có thể cài đặt mô-đun phát hoặc sử dụng trình gỡ lỗi, nhưng điều đó sẽ cung cấp cho bạn cấu trúc bên trong của một thực thể, điều mà bạn không thực sự muốn thấy.


2
$node->toArray();chắc chắn trông ngắn hơn và sạch hơn rất nhiều so với sử dụng\Drupal::service('entity_field.manager')->getFieldDefinitions('node', 'article');
Không có Sssweat

Nơi nào bạn tìm thấy tài liệu về điều này?
AlxVallejo

Bạn có thể tìm thấy một số thông tin ở đây, ví dụ: drupal.org/docs/8/api/entity-api
Berdir

@Berdir: print_r($entity->toArray())Nó giải quyết vấn đề này. Tôi có thể nhận được tất cả các chi tiết lĩnh vực. Cảm ơn bạn rất nhiều.
kalidasan

@Berdir bạn có thể cụ thể hơn về tài liệu này không? Tôi đã xem qua trang đó nhưng không thấy bất kỳ ví dụ cụ thể nào liên quan đến các trường tham chiếu thuật ngữ.
Keven

5

Theo định nghĩa, một trường tham chiếu thực thể chỉ có thể nhắm mục tiêu một loại thực thể để bạn có thể biết loại mục tiêu của mình là gì bằng cách gọi lên getSetting()định nghĩa trường.

// Print the targeted entity type field.
$field = \Drupal\field\Entity\FieldStorageConfig::loadByName('node','field_tags');
echo $field->getSetting('target_type');

Hoặc tốt hơn nữa, sử dụng EntityReferenceFieldItemList::referencedEntities()để kéo lên các thực thể được tham chiếu của nút và dữ liệu liên quan bạn cần.

// Return an array of Entity objects referenced in the field.
$node->field_tags->referencedEntities();

print_r($node->field_tag->referencedEntities());dường như là một con heo tài nguyên, tôi đã nâng cấp cá thể AWS của mình , để có thể làm điều đó, vì tôi tiếp tục nhận được WSOD.
Không có Sssweat

Hãy cho tôi biết nếu đây là một câu hỏi riêng biệt. Làm thế nào tôi có thể truy cập giá trị tên, khi trong mảng nó nói các giá trị: được bảo vệ có nghĩa là nó chỉ có thể được truy cập bên trong lớp.
Không có Sssweat

Tôi cảm thấy tồi tệ khi không chấp nhận câu trả lời của bạn, nhưng câu trả lời @Berdir không cho tôi lựa chọn nào khác ngoài. Tôi không bao giờ tìm ra làm thế nào để có được giá trị bằng Or better yetphương pháp của bạn . Phương thức đầu tiên là tốt, nhưng nó sẽ yêu cầu nếu các câu lệnh kiểm tra loại mục tiêu và sau đó nhận được giá trị. Câu trả lời của Berdir hiệu quả hơn vì không cần kiểm tra.
Không có Sssweat

1
Đừng đổ mồ hôi (... ý định chơi chữ). Phiên bản đầu tiên của câu hỏi của bạn không quá rõ ràng về mục tiêu của bạn. Bạn nên đánh dấu câu trả lời phù hợp nhất.
Shawn Conn

Tôi thực sự muốn câu trả lời này không bị chôn vùi trong bài viết SO này. Tôi muốn nhận target_typegiá trị từ một entity_referencetrường và tìm kiếm cao và thấp cho nó ... cho đến khi bạn trả lời câu hỏi của tôi ở đây.
Keven
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.