Thứ nhất, một số nền tảng.
Khi bạn nhập, $node->something
bạ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 FieldItemListInterface
bạ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à FieldItemListInterface
ngay 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_id
là hợp lệ nhưng $node->some_er_field->value
không. Vâng, bạn có thể hỏi FieldItemInterface
như 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 propertyDefinitions
phươ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 FieldItemInterface
thự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->value
cô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 FieldItemListInterface
và FieldItemInterface
như vậy mà $node->title->value
cá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()
và ::label()
.
$node->moderation_state->target_id
và $node->moderation_state->entity
sẽ đạ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.