Mục đích của hàm entity_metadata_wrapper () là gì và tại sao tôi nên sử dụng nó?


23

Tôi dường như đang phát triển các tiện ích bổ sung cho rất nhiều mô-đun sử dụng API thực thể tại thời điểm này và entity_metadata_wrapper()chức năng tiếp tục bật lên.

Các trang tài liệu nói này về nó:

Trả về một trình bao bọc thuộc tính cho dữ liệu đã cho.

Nếu một thực thể được bọc, trình bao bọc có thể được sử dụng để truy xuất các trình bao bọc tiếp theo cho các thuộc tính quyền lợi.

Bỏ qua cách đánh vần Freudian tuyệt vời của từ 'thực thể' trong đó, tôi không thực sự hiểu mục đích của các hàm bao này là gì.

Tôi hiểu rằng về cơ bản hàm trả về một EntityDrupalWrapperlớp:

Trình bao bọc giúp giảm bớt việc áp dụng các hàm gọi lại getter và setter của các thuộc tính thực thể

Nhưng những gì tôi không thể hiểu là làm thế nào nó làm cho mọi thứ dễ dàng hơn.

Ví dụ: để cập nhật thuộc tính trạng thái của một nút tôi có thể sử dụng mã này:

$node = node_load($nid);
$node->status = 1;
node_save($node);

Điều đó khá sạch sẽ. Theo tôi hiểu (nhưng có thể sai), mã tương đương sử dụng entity_metadata_wrapper()sẽ dài dòng hơn thế.

Tôi không chắc liệu nó có đơn giản chỉ là việc sử dụng thuật ngữ 'trình bao bọc' đã khiến tôi vấp ngã ở đây không, nhưng tôi cũng đã xem qua mã trong mô-đun Thực thể và tôi thực sự không hiểu gì hơn về nó.

Có ai có thể giải thích những lợi ích của việc sử dụng chức năng này là gì không, và có lẽ cung cấp một ví dụ mã đơn giản cho trường hợp sử dụng phổ biến?


Điều này có thể thêm một sự hiểu biết sâu sắc hơn cho api thực thể và trình bao bọc. Đó là một cuộc nói chuyện của Fago, anh chàng thực thể. wolfgangziegler.net/drupalcon-denver
Ken

Cảm ơn, âm thanh đó thực sự hữu ích từ gambit mở đầu. Tôi sẽ xem xét lại khi tôi có chút thời gian
Clive

Đó là "video đã bị xóa khỏi blip" nhưng các slide vẫn tải xuống.
artfulrobot 6/03/2015

Câu trả lời:


23

Có, thay đổi trạng thái của một nút là không đáng kể, vì đó là một thuộc tính được mã hóa cứng.

Mặt khác, các lĩnh vực phức tạp hơn nhiều. Chúng được lồng sâu ba cấp độ, trong khi có field_get_items () để đưa chúng vào đúng ngôn ngữ, không có chức năng nào như vậy để đặt giá trị trường. Vì vậy, bạn luôn cần kiểm tra xem một trường có thể dịch được hay không và bạn cần biết chính xác thuộc tính nào chứa các giá trị bạn đang tìm / muốn đặt.

Hai ví dụ, cho thấy những gì trình bao bọc thực thể có thể làm:

  • Dòng sau đây thêm mục hàng thương mại vào đơn hàng, chăm sóc ngôn ngữ và tài sản thực tế chứa id tham chiếu, được lấy từ câu trả lời sau /drupal//a/23513/31

    $order_wrapper->commerce_line_items[] = $line_item;
  • Theo cách tương tự, có thể truy cập trực tiếp vào giá trị của một trường mà không phải kiểm tra ngôn ngữ hoặc đồng bằng, thậm chí có thể truy cập trực tiếp các thực thể được tham chiếu, được lấy từ /drupal//a/ 3301031

    $subnode = entity_metadata_wrapper('node', $node)->field_subnode->value();
    $default = $subnode->title;

Trình bao bọc thực thể là động lực thúc đẩy các mô-đun linh hoạt, mạnh mẽ như API tìm kiếmQuy tắc vì nó cho phép chúng hoạt động theo nhiều cấp độ tham chiếu, do đó, bạn có thể truy cập vào một lĩnh vực sản phẩm mà người dùng đã mua theo thứ tự như [commerce-order:commerce-line-items:0:commerce-product:some-field](có thể không thực sự chính xác, nhưng một cái gì đó tương tự) hoặc thêm tóm tắt nội dung của một nút được tham chiếu vào chỉ mục tìm kiếm của bạn.

Điều đó nói rằng, tôi không nhất thiết phải thích API thực tế của trình bao bọc, đó là mảng nội bộ khổng lồ và thậm chí các thuộc tính đơn giản lại là các lớp trình bao bọc. Tôi hy vọng rằng hệ thống thực thể được cải thiện (và hy vọng trường) trong Drupal 8 sẽ loại bỏ sự cần thiết của một trình bao bọc như vậy nhờ có các thực thể được phân loại.


Rực rỡ, tôi biết tôi vừa bỏ lỡ điều gì đó với điều này. Tôi nghĩ rằng đó là mô tả của EntityDrupalWrappergây ra sự nhầm lẫn; khi nó đề cập đến 'các thuộc tính' Tôi không nhận ra các trường có liên quan, tôi chỉ nghĩ nó có nghĩa đen là lớp đã chăm sóc các thuộc tính (nid, status, v.v.). Cảm ơn bạn đã xóa, biết rằng mô-đun Rules sử dụng nó cho bộ chọn dữ liệu làm cho nó có ý nghĩa hơn nhiều
Clive

@Berdir "Tôi không nhất thiết phải thích API thực tế của trình bao bọc ..." Tôi có cùng cảm xúc với bạn. Bạn có làm gì để chống lại điều này không? Bạn có sử dụng field_view_value () để xem các giá trị không? Làm thế nào bạn sẽ đề xuất cài đặt giá trị trong các cuộc gọi lại tùy chỉnh cho một luồng công việc hoặc bảng điều khiển tùy chỉnh?
Charlie Schliesser
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.