จุดประสงค์ของฟังก์ชั่น entity_metadata_wrapper () คืออะไรและเหตุใดฉันจึงควรใช้


23

ฉันดูเหมือนจะพัฒนาโปรแกรมเสริมไปยังโมดูลจำนวนมากที่ใช้Entity APIในขณะนี้และentity_metadata_wrapper()ฟังก์ชั่นยังคงปรากฏขึ้นเรื่อย ๆ

หน้าเอกสารบอกว่านี่เกี่ยวกับมัน

ส่งคืน wrapper คุณสมบัติสำหรับข้อมูลที่กำหนด

หากเอนทิตีถูกห่อคุณสามารถใช้ wrapper เพื่อดึง wrapper เพิ่มเติมสำหรับคุณสมบัติการให้สิทธิ์

การเพิกเฉยต่อการสะกดคำของ Freudian อย่างน่าพิศวงของคำว่า 'เอนทิตี' ในนั้นฉันไม่เข้าใจจริงๆว่าจุดประสงค์ของสิ่งห่อหุ้มเหล่านี้คืออะไร

ฉันเข้าใจว่าฟังก์ชันนั้นคืนค่าEntityDrupalWrapperคลาสเป็นหลัก:

wrapper ลดการใช้การเรียก getter และ setter ของคุณสมบัติเอนทิตี

แต่สิ่งที่ฉันไม่เข้าใจคือวิธีที่ทำให้สิ่งต่าง ๆ ง่ายขึ้น

ตัวอย่างเช่นเพื่ออัปเดตคุณสมบัติสถานะของโหนดฉันสามารถใช้รหัสนี้:

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

มันค่อนข้างสะอาด ตามที่ฉันเข้าใจ (แต่อาจจะผิด) การใช้โค้ดที่เทียบเท่าentity_metadata_wrapper()จะมีความละเอียดมากกว่านั้น

ฉันไม่แน่ใจว่าเป็นเพียงแค่การใช้คำว่า 'wrapper' ที่ทำให้ฉันสะดุดที่นี่ แต่ฉันได้ดูรหัสในโมดูล Entity ด้วยและฉันก็ไม่ได้เข้าใจอะไรมากขึ้น

ใครบ้างสามารถอธิบายว่าประโยชน์ของการใช้ฟังก์ชั่นนี้คืออะไรและอาจให้ตัวอย่างรหัสง่ายๆสำหรับกรณีใช้งานทั่วไป


สิ่งนี้อาจเพิ่มความเข้าใจที่ลึกซึ้งยิ่งขึ้นให้กับเอนทิตีและสิ่งห่อหุ้ม มันคือการพูดคุยของ Fago คนที่ชื่อเอนทิตี้ wolfgangziegler.net/drupalcon-denver
Ken

ขอบคุณที่ฟังมีประโยชน์จริง ๆ จากการเปิดกลเม็ด ฉันจะให้มันดูเมื่อฉันมีเวลา
Clive

"วิดีโอถูกลบออกจาก blip" แล้ว แต่ภาพนิ่งยังคงดาวน์โหลดอยู่
artfulrobot

คำตอบ:


23

ใช่การเปลี่ยนสถานะของโหนดนั้นเล็กน้อยเนื่องจากเป็นคุณสมบัติฮาร์ดโค้ด

ในทางกลับกันฟิลด์นั้นซับซ้อนกว่ามาก พวกเขาซ้อนกันสามระดับลึกในขณะที่มีfield_get_items ()เพื่อให้พวกเขาในภาษาที่ถูกต้องไม่มีฟังก์ชั่นดังกล่าวสำหรับการตั้งค่าฟิลด์ ดังนั้นคุณจำเป็นต้องตรวจสอบเสมอว่าฟิลด์ใดสามารถแปลได้หรือไม่และคุณจำเป็นต้องรู้ว่าคุณสมบัติใดที่มีค่าที่คุณกำลังค้นหา / ต้องการตั้งค่าอย่างแน่นอน

ตัวอย่างสองตัวอย่างที่แสดงว่า wrapper เอนทิตีสามารถทำอะไรได้บ้าง:

  • บรรทัดต่อไปนี้เพิ่มรายการโฆษณาเชิงพาณิชย์ลงในคำสั่งซื้อดูแลภาษาและอสังหาริมทรัพย์ที่ถือ id อ้างอิงจากคำตอบต่อไปนี้/drupal//a/23513/31

    $order_wrapper->commerce_line_items[] = $line_item;
  • ในทำนองเดียวกันความสามารถในการเข้าถึงค่าของเขตข้อมูลโดยตรงโดยไม่ต้องตรวจสอบภาษาหรือเดลต้าถึงแม้จะสามารถเข้าถึงเอนทิตีที่อ้างอิงโดยตรงจาก/drupal//a/ 33010/31

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

เอนทิตี wrapper คือแรงผลักดันที่อยู่เบื้องหลังโมดูลที่ยืดหยุ่นและทรงพลังเช่นSearch APIและRulesเนื่องจากช่วยให้พวกเขาทำงานผ่านการอ้างอิงหลายระดับเพื่อให้คุณสามารถเข้าถึงฟิลด์ของผลิตภัณฑ์ที่ผู้ใช้สั่งซื้อด้วยบางสิ่ง like [commerce-order:commerce-line-items:0:commerce-product:some-field](อาจไม่ถูกต้อง แต่เป็นอย่างนั้น) หรือเพิ่มเนื้อหาสรุปของโหนดที่อ้างอิงไปยังดัชนีการค้นหาของคุณ

ที่กล่าวว่าฉันไม่ชอบ API ที่แท้จริงของ wrapper มันเป็นอาร์เรย์ภายในขนาดใหญ่และแม้แต่คุณสมบัติที่เรียบง่ายก็เป็นคลาส wrapper อีกครั้ง ฉันหวังว่าระบบเอนทิตีที่ได้รับการปรับปรุง (และหวังว่าจะดีขึ้น) ใน Drupal 8 จะช่วยลดความจำเป็นในการห่อหุ้มดังกล่าวขอบคุณที่มีเอนทิตีที่จัดประเภทไว้


ยอดเยี่ยมฉันรู้ว่าฉันเพิ่งพลาดบางสิ่งกับสิ่งนี้ ฉันคิดว่ามันเป็นคำอธิบายของสิ่งEntityDrupalWrapperที่ทำให้เกิดความสับสน; เมื่อกล่าวถึง 'คุณสมบัติ' ฉันไม่ทราบว่ามีส่วนเกี่ยวข้องกับสาขาเลยฉันแค่คิดว่าหมายถึงชั้นเรียนดูแลคุณสมบัติ (nid, status, etc) ขอบคุณสำหรับการล้างที่รู้ว่าโมดูลกฎใช้มันสำหรับตัวเลือกข้อมูลที่ทำให้มันมีเหตุผลมากขึ้น
Clive

@Berdir "ฉันไม่ชอบ API ที่แท้จริงของเสื้อคลุม ... " ฉันมีความรู้สึกเช่นเดียวกับคุณ คุณทำอะไรเพื่อต่อสู้กับเรื่องนี้? คุณใช้ field_view_value () เพื่อดูค่าหรือไม่ คุณจะแนะนำให้ตั้งค่าในการเรียกกลับที่กำหนดเองสำหรับเวิร์กโฟลว์หรือแดชบอร์ดที่กำหนดเองได้อย่างไร
Charlie Schliesser
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.