Làm cách nào để truy cập giá trị trường cho đối tượng thực thể (ví dụ nút)?


63

node_load((int) $nid)tải một thực thể nút được điền đầy đủ. $node->title->valuecó được tiêu đề, nhưng làm cách nào để truy cập các giá trị trường trong Drupal 8?

Câu trả lời:


89

Tôi đoán bạn không cần phải chuyển đổi $entitythành một mảng, điều này chỉ đơn giản là hoạt động.

$entity->get('field_name')->getValue();

FYI: Sử dụng kint()từ devel_kintmô-đun sẽ cho bạn biết tất cả các phương thức có sẵn có thể được sử dụng để truy cập các phần tử đối tượng, do đó, tương đối var_dump()ít hữu ích hơn.


14
Trên thực tế, nó phải là: $ entity-> get ('field_name') -> value;
Ed Hollinghurst

1
Bạn có biết tại sao đây là @EdHollinghurst không? getValue thực sự có lỗi với tôi, nhưng (sử dụng dpm) nó được liệt kê trong các phương thức có sẵn, trong khi 'giá trị' thì không.
autopoietic

2
getValue()hoạt động với tôi (cả trên 8.1.x và 8.2.x) xem tài liệu tham khảo api
leon.nk

16
->getValue()là chung chung và sẽ hoạt động bất kể loại trường. Nếu bạn sử dụng ->value, nó chỉ hoạt động nếu giá trị trường được lưu trữ trong một thuộc valuetính. Nó sẽ không hoạt động đối với các loại phức tạp hơn (ví dụ: ngày hoặc tham chiếu thực thể).
Pierre Buyle

4
Chỉ riêng mã này sẽ gây ra lỗi nếu thực thể không có trường có tên là "field_name". Đảm bảo mã này chỉ được chạy trên các thực thể nơi bạn biết trường đó tồn tại, bạn có thể sử dụng $ entity-> hasField ('field_name') để kiểm tra hoặc nếu (! Trống ($ entity-> field_name))
oknate

56

trong drupal 8, nút $ là nút của lớp

 $node->field_machine_name->getValue();

hoặc là

$node->get('field_machine_name')->getValue();

sẽ trả về một mảng các giá trị.

Nếu bạn chỉ mong đợi một, bạn cũng có thể xâu chuỗi mảng với

$node->field_machine_name->getString();

hoặc là

 $node->get('field_machine_name')->getString();

Tôi không "nhận" (chuỗi và giá trị) "nó". Bạn có thể vui lòng thêm một số chi tiết để giải thích câu trả lời này? FYI: không làm như vậy sẽ khiến câu trả lời của bạn có nguy cơ bị xóa thông qua kiểm duyệt (xin lỗi ...)
Pierre.Vriens

34

Đối với các lĩnh vực bạn sẽ có thể sử dụng $node->body->valueví dụ. Nếu bạn không biết tên trường là gì, tôi khuyên bạn nên cài đặt mô-đun Devel cho Drupal 8 và kiểm tra nút thông qua như thế nào dsm($node).


1
Làm thế nào để bạn làm cho lĩnh vực đó sau đó?
Alex

1
điều này dường như đã lỗi thời
Alex

1
@Alex Tôi đề nghị bạn hỏi một câu hỏi mới với vấn đề bạn đang gặp phải. Tại thời điểm này là một câu trả lời ok, có vẻ không thích hợp để chỉnh sửa câu trả lời bây giờ đó là một câu trả lời trên trang này có nhiều điểm hơn câu này.
tenken

5
Kiểm tra bài viết này cho một lời giải thích tốt đẹp. Bạn có thể sử dụng $ node-> field_name-> value để nhận một giá trị duy nhất (hoặc khóa đầu tiên của trường đa giá trị). Hoặc bạn có thể sử dụng $ node-> field_name-> getValue () để lấy tất cả các giá trị của một trường dưới dạng một mảng.
Mirsoft

2
@tenken: Trên thực tế, cập nhật một câu trả lời hiện có tốt hơn là thêm một câu hỏi dư thừa với các câu trả lời mới.
Pierre Buyle

17

Bạn luôn có thể làm $entity->toArray()để xem những gì trong một thực thể. Ngay cả khi sử dụng xdebug (ví dụ với phpstorm), việc tự mình hiểu một đối tượng thực thể là rất khó. Tôi nghi ngờ dsm($node)trong Drupal 8 có ý nghĩa gì. Nếu bạn khăng khăng gỡ lỗi trong trình duyệt (nhưng bạn không nên, Drupal 8 quá phức tạp để gỡ lỗi mà không có xdebug) dsm($node->toArray())là điều bạn muốn.


$ node-> toArray () không hoạt động với tôi trên Drupal 8.
Axel Briche

Vui lòng thêm một câu hỏi mới chi tiết rằng. Drupal\Core\Entity\EntityInterfacetoArray.

1
Câu trả lời này không cung cấp giải pháp; hạ cấp.
colan

Trong khi câu trả lời này không nhất thiết là câu trả lời trực tiếp cho câu hỏi này, nó là một chức năng tuyệt vời chết tiệt. Cảm ơn.
Stef Van Looveren

14

Sử dụng đoạn mã sau để nhận giá trị trường nút

Điều này được sử dụng để có được id nút từ url

$nid = \Drupal::routeMatch()->getRawParameter($node_id);

Để tải dữ liệu nút bằng nid

$node = \Drupal::entityTypeManager()->getStorage('node')->load($nid);

Điều này được sử dụng để có được giá trị trường.

$terms = $node->get('field_Name')->getValue();  

Điều này được sử dụng để có được tiêu đề nút.

$product_name = $node->getTitle();

2
Tải nút như thế này: $ nid = \ Drupal :: routeMatch () -> getRawParameter ('node'); $ node = \ Drupal :: entityTypeManager () -> getStorage ('nút') -> load ($ nid);
rémy

8

Đối với tôi, có một $entity(một nút) điều này hoạt động:

$entity->field_name->getValue();

sử dụng 8.1.


2
Cái này lấy tất cả các giá trị của trường đa giá trị thành một mảng. Tất nhiên nó cũng có thể được sử dụng để nhận giá trị của trường giá trị đơn, tuy nhiên đầu ra sau đó sẽ chứa một mảng với một giá trị duy nhất. Để nhận một giá trị duy nhất của một trường (hoặc giá trị đầu tiên của trường đa giá trị), hãy sử dụng $ entity-> field_name-> value
Mirsoft

7

Trong khi sử dụng (cách chính xác thực tế):

$node = \Drupal\node\Entity\Node::load($nid);
$node->get('nid')->value; // returns a raw value - Node ID

// Following both returns array structure containing value/target id nested value.
$node->get('nid')->value(); 
$node->nid->getValue();


4

Nó đơn giản:

$node->get('field_name')->getValue()

Nếu trường là một trường tham chiếu thực thể, có một số cách đặc biệt để có được các thực thể được tham chiếu.

Để lấy id đích (phần tử đầu tiên):

$entity->get('field_entity_reference')->target_id

Để có được thực thể được tải (phần tử đầu tiên):

$entity->get('field_entity_reference')->entity

Khi sử dụng ->entitytrên trường, nó sẽ tự động tải thực thể.

Nếu trường có thể chứa nhiều tài liệu tham khảo, bạn có thể tìm nạp tất cả chúng như thế này:

$entities = $entity->get('field_entity_reference')->referencedEntities();

Điều đó sẽ cung cấp cho bạn một loạt các thực thể.

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.