บันทึกค่าใหม่ด้วย entity_metadata_wrapper ลงในฟิลด์เอนทิตีซึ่งเป็นอาร์เรย์


9

ฉันต้องการบันทึกค่าใหม่ให้กับเขตข้อมูลบนเอนทิตีและฉันสงสัยว่ามันเป็นไปได้ที่จะใช้เอนทิตีเมทาทาทาฐานที่ตั้งหรือมันเป็นไปได้เพียงเพื่อตั้งค่าที่มีอยู่?


นี่คือวิธีที่ฉันตั้งค่า $ wrapper-> vimn_related_subjects-> set (array ($ key)); แต่ถ้าฉันต้องการเพิ่มค่าในตอนท้ายของอาร์เรย์? เป็นไปได้ไหม
Andrew Welch

คุณเคยลอง$wrapper->vimn_related_subjects[] = $value;ไหม
Clive

คำตอบ:


31

เมื่อจัดการกับเขตข้อมูลที่มีหลายค่าวัตถุห่อหุ้มข้อมูลเมตาของเอนทิตีที่เกี่ยวข้องเป็นตัวอย่างของEntityListWrapper (อาจเป็นความคิดที่ดีที่จะเรียกดู API เพื่อดูวิธีการที่มีอยู่นอกจากนี้ยังทราบว่าคลาสนี้ใช้อินเทอร์เฟซ ArrayAccess )

ดังนั้นวิธีที่ง่ายที่สุดในการเพิ่มค่าใหม่ให้กับ EntityListWrapper คือการใช้โอเปอเรเตอร์ "[]":

$wrapper->field_example[] = $new_value;

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

$wrapper->field_example[$delta] = $new_value;
$wrapper->field_example->offsetSet($delta, $new_value);
$wrapper->field_example->get($delta)->set($new_value);

ในทั้งสามกรณีนี้จะเขียนทับค่าหากเดลต้ามีอยู่แล้วและสร้างรายการใหม่ถ้าไม่

นอกจากนี้คุณยังสามารถตั้งค่าอาร์เรย์ในฟิลด์ได้โดยตรง ทั้งสองวิธีมีความเท่าเทียมกัน:

$value = array
  0 => array('property_example' => 'hello'),
  1 => array('property_example' => 'world')
);
$wrapper->field_example = $value;
$wrapper->field_example->set($value);

อย่างไรก็ตามสิ่งนี้กำหนดให้คุณต้องทราบโครงสร้างภายในของฟิลด์ที่คุณกำหนดให้เนื่องจากคุณไม่ได้ใช้ตัวคลุมข้อมูลเมตาของฟิลด์

ในที่สุดคุณสามารถล้างค่าหลายค่าได้โดยตั้งค่าเป็นค่าว่าง ทั้งสามวิธีมีความเท่าเทียมกัน:

$wrapper->field_example->set();
$wrapper->field_example = array();
$wrapper->field_example = NULL;

"EntityMetadataWrapperException: Array คุณสมบัติของข้อมูลที่ไม่รู้จักใน EntityStructureWrapper-> getPropertyInfo ()" ฉันกำลังลองวิธีที่สองของคุณแม้ว่าฉันจะกำหนดเป้าหมายเป็นภาษาเฉพาะ เช่น $ wrapper-> language ($ lang) -> {$ field} -> set ($ new_array);
AlxVallejo

$w->field_allowed_regions->set(array(null));เป็นตัวเลือกการล้างเดียวที่ทำงานกับเขตข้อมูลอ้างอิงอนุกรมวิธานหลายค่าของฉัน
เหลือเชื่อ

3

ฉันพบว่า

$wrapper->field_example[]->set($new_value);

เป็นความล้มเหลวร้ายแรง แต่

$wrapper->field_example[NULL]->set($new_value);

ได้รับอนุญาต

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.