Làm thế nào để tôi có được tài sản của một đối tượng nút?


7

Tôi cố gắng để có được moderation_state tài sản từ một đối tượng nút trong Drupal8 (xem hình ảnh đính kèm); tuy nhiên, tôi không thể tìm ra cách để làm điều này. Trong Drupal7, nó khá đơn giản $node->moderation_state.

Làm cách nào tôi có thể nhận được giá trị này trong Drupal8 trong đó nút $ là một phiên bản của Drupal \ node \ Entity \ Node?

Tôi đã thử: $ node-> moderator_state $ node-> moderator_state-> value

hình ảnh kèm theo


Luôn sử dụng $ node-> toArray () khi kết xuất nó, sau đó cung cấp cho bạn một cấu trúc gần với cách bạn có thể truy cập nó hơn. Có thể nó sử dụng một tài sản khác với giá trị, điều đó sẽ cho bạn biết.
Berdir

Câu trả lời:


14

Thứ nhất, một số nền tảng.

Khi bạn nhập, $node->somethingbạn sẽ nhận được FieldItemListInterface . Làm thế nào để bạn biết những giá trị bạn có thể sử dụng cho something? Vâng, bạn có thể hỏi các thực thể. $node->getFieldDefinitions()

Bây giờ bạn có một FieldItemListInterfacebạn có thể lặp lại các giá trị của nó, hoặc trong trường hợp của trường giá trị đơn, chỉ là trường đầu tiên. Vì vậy, ngay cả khi bạn đang sử dụng $node->title, tiêu đề là FieldItemListInterfacengay cả khi bạn chỉ mong đợi một mục trong danh sách.

Vì vậy, hãy để có được giá trị đầu tiên trong danh sách. $node->something->get(0). Điều này cung cấp cho bạn một FieldItemInterface . Từ đây bạn có thể truy cập các thuộc tính của mục trường. Ví dụ $node->title->get(0)->get('value'). Mỗi cái này là một thể hiện của TypedDataInterface . Nhưng làm thế nào để bạn biết những gì bạn có thể sử dụng cho value. Ví dụ: Đối với trường tham chiếu thực thể $node->some_er_field->target_idlà hợp lệ nhưng $node->some_er_field->valuekhông. Vâng, bạn có thể hỏi FieldItemInterfacenhư vậy $node->title->get(0)->getProperties(). Hoặc cách khác, bạn có thể biết kiểu dữ liệu của trường và kiểm tra propertyDefinitionsphương thức của nó . Ví dụ, trong trường hợp trường moderator_state, nó sử dụng trường Tham chiếu thực thể để theo dõi tham chiếu đến thực thể cấu hình trạng thái kiểm duyệt. Vì vậy, điều đó có nghĩa là mỗi cái FieldItemInterfacethực sự là một EntityReferenceItem và bạn có thể kiểm tra nó:: propertyDefDefs () phương thức để xem các thuộc tính mà nó định nghĩa.

Vì vậy, bây giờ bạn có một TypedDataInterfaceđối tượng, làm thế nào để bạn nhận được giá trị của nó? Vâng, bạn sử dụng ::getValue()phương pháp của nó .

Nhưng chờ đợi tại sao $node->title->valuecông việc - Tôi không cần phải ghi $node->title->get(0)->get('value')->getValue()- thats cũng bởi vì chúng ta đang sử dụng phương pháp ma thuật PHP trên FieldItemListInterfaceFieldItemInterfacenhư vậy mà $node->title->valuecác cuộc gọi $node->title->get(0)->get('value')->getValue()cho bạn.

Vì vậy, tóm lại:

  • $node->moderation_state->get(0)->get('target_id')->getValue() sẽ cung cấp cho bạn ID thực thể cấu hình trạng thái kiểm duyệt.
  • $node->moderation_state->get(0)->get('entity')->getValue()sẽ cung cấp cho bạn thực thể cấu hình ModeratorState, vì vậy bạn có thể sử dụng các phương thức của nó trực tiếp - như ::isPublished()::label().
  • $node->moderation_state->target_id$node->moderation_state->entitysẽ đạt được điều tương tự tương ứng.

Tôi đã làm một cuộc nói chuyện chớp nhoáng với các đồng nghiệp của mình về điều này, nếu bạn quan tâm các slide ở đây thật không may là bản thu âm không hoạt động.


Giải thích tốt nhất bao giờ hết! Nên được bao gồm trong tài liệu drupal.org. Cảm ơn bạn larowlan.
Ưu tiên Mohan

1

Đây là một giá trị được bảo vệ. Bạn sẽ không thể truy cập nó bằng kint () hoặc toArray (). Đối tượng nút bảo vệ điều này, vì nó muốn bạn sử dụng giao diện nút để đọc trạng thái:

$node->isPublished()

Việc xử lý nghiêm ngặt các giá trị được bảo vệ trong drupal 8 sẽ giúp mã của bạn tồn tại lâu hơn, hy vọng trong drupal 9 và hơn thế nữa. Bởi vì bây giờ có những thay đổi bên trong đối tượng nút có thể, mà không phản ánh giao diện ra bên ngoài.

Chỉnh sửa: Nhìn vào cốt lõi cho moderation_state, nó không có ở đó, có thể đóng góp. Bạn phải xem xét các phương thức có sẵn, chức năng nào sẽ cung cấp cho bạn thông tin tương tự $node->isPublished(), dành cho status.

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.