การตรวจสอบการมีอยู่ของเขตข้อมูลบนเอนทิตี _metadata_wrapper


22

ฉันกำลังวนซ้ำผ่านคอลเลกชันฟิลด์และตัดรายการคอลเล็กชันฟิลด์ด้วย entity_metadata_wrapper ฉันต้องการตรวจสอบการมีอยู่ของเขตข้อมูลก่อนที่จะเรียกvalueวิธีการของมัน(ซึ่งส่งผลให้เกิดข้อผิดพลาดในเขตข้อมูลที่ไม่มีค่า) แต่ฉันไม่สามารถหาวิธีที่จะทำ

$field_collection_item = field_collection_item_load($id);
$item_wrapper = entity_metadata_wrapper('field_collection_item', $field_collection_item);

// this results in an error if the field_contrib_headshot field is empty
$headshot = $item_wrapper->field_contributor->field_contrib_headshot->value();

วิธีแก้ปัญหาปัจจุบันของฉันคือการใช้field_get_itemsเพื่อดูว่าเขตข้อมูลว่างเปล่า แต่ฉันชอบที่จะทำเช่นนี้ผ่าน wrapper เมตาดาต้าถ้าเป็นไปได้

คำตอบ:


26

เพียงเรียกใช้ฟังก์ชัน PHP isset():

$headshot = array();
if (isset($item_wrapper->field_contributor->field_contrib_headshot)) {
  $headshot = $item_wrapper->field_contributor->field_contrib_headshot->value();
}

EntityStructureWrapper ดำเนิน__isset()ฟังก์ชั่นตาม Principe ของมากไป


ใช่นี่เป็นวิธีที่ฉันทำอยู่เสมอผูกติดกับ internals และอ่าน IMO ได้ง่ายขึ้น upvoted!
Cottser

9

ทุกครั้งที่มีการอ้างอิงเอนทิตีหรือการรวบรวมฟิลด์ isset () ไม่เคยทำงานให้ฉันเลย ดูเหมือนว่าจะทำงานอะไรเมื่อใดก็ตามที่เรามีการอ้างอิงนิติบุคคลที่ทำ:

if($wrapped_entity->entity_reference_field->getIdentifier()) {
  // This code only fires if there is an entity reference or field collection set.
}

คำตอบนี้และโพสต์ต่อไปนี้ใช้ได้สำหรับฉัน: dropbucket.org/node/1201
tyler.frankenstein

4

ดูเหมือนว่าคุณมีที่entity_referenceอยู่ในนั้นเนื่องจากวิธีการผูกมัด แต่ให้ดูที่__isset () วิธีการสำหรับ EntityStructureWrapper

ตรวจสอบเช่น:

$has_headshot = $item_wrapper->field_contributor->__isset('field_contrib_headshot');

จากนั้นใช้IFบล็อกเพื่อทำตรรกะของคุณ ...

แก้ไข:

$has_headshot ตอนนี้เป็นที่ต้องการตรวจสอบที่ถูกต้อง


ฉันไม่แน่ใจว่าสิ่งที่คุณหมายถึงโดย "ดูเหมือนว่าคุณมีการอ้างอิงเอนทิตีที่ไหนสักแห่ง" ถ้าคุณสามารถอธิบายได้ว่าอีกเล็กน้อยฉันขอขอบคุณ __issetใช้งานได้ดีกับการรวบรวมฟิลด์แม้ว่าฉันจะต้องเพิ่มชื่อฟิลด์แบบเต็ม: field_contrib_headshotแทนcontrib_headshot
Nick Tomlin

เขตข้อมูลคือค่า สตริงตัวเลขอะไรก็ได้ field_contributorกำลังอ้างอิงเขตข้อมูลอื่นfield_contrib_headshot... คุณมีการทำรังในที่นั่นอย่างใด ฉันสมมติว่าคุณกำลังใช้ entity_reference หรืออย่างอื่นเช่น field_group เพื่อซ้อนสิ่งเหล่านี้ ... นั่นคือทั้งหมดที่ฉันต้องการ
tenken

__isset () ชิ้นส่วนของรหัสที่เหมาะกับคุณคืออะไร
tenken

มันเป็น:$item_wrapper->field_contributor->__isset('field_contrib_headshot')
Nick Tomlin

ฉันรู้สึกแปลก ๆ ที่จะเรียก __isset () โดยตรงทำไมไม่: $has_headshot = isset($item_wrapper->field_contributor->field_contrib_headshot);
Cottser

1
$wrapper = entity_metadata_wrapper('node', 123);
if($wrapper->__isset('field_middle_name')) {
    // Do something awesome with the middle name.
} else {
    // Don't do anything awesome, they don't have a middle name.
}

ฟิลด์การอ้างอิงเอนทิตีและการรวบรวมฟิลด์

// also check if there is an identifier, __isset alone is not enough!
if ($wrapper->__isset('field_project_number') && $wrapper->field_project_number->getIdentifier()) {
    $number =  $wrapper->field_project_number->field_project_number_complete->value();
    return $number;
}

คัดลอกและวางตรงจากhttp://dropbucket.org/node/1201แต่ดูเหมือนจะเป็นตัวอย่างที่ดีกว่าคำตอบอื่น ๆ จนถึงตอนนี้ ...


1

สำหรับ EntityMetadataWrapper:

หากคุณมีบล็อกของรหัสที่ใช้งานไม่ควรหรือหากคุณพบข้อผิดพลาดของ PHP ให้ดูตัวอย่างด้านล่าง ตัวอย่างนี้ใช้คุณสมบัติ nid

อาจผิดพลาดทั้งหมด

if ($wrapper->__isset('nid')) {
  $var = $wrapper->nid->value();
}
else {
  // Do something it's FALSE;
}

หรือ

if ($wrapper->__isset('nid')) {
  $var = $wrapper->nid->getIdentifier();
}
else {
  // Do something it's FALSE;
}

หรือ

if ($wrapper->nid->value()) {
  // Do something it's TRUE.
}
else {
  // Do something it's FALSE;
}

คุณอาจพบว่าการใช้ isset อย่างนั้นอาจประเมินเป็นจริงแม้ว่า nid จะไม่ปรากฏ -> getIdentifier () หรือ -> value () หรือ -> raw () อาจมีข้อยกเว้น

เหมือนจริงเสมอ

if (isset($wrapper->nid)) {
  // Do something it must be TRUE....Ah Hem wait.. this runs every time.
}

ใช้แทนนี้

try {
  $var = $wrapper->nid->raw();
} 
catch (EntityMetadataWrapperException $e) {
  $var = FALSE;
}

0

ฉันพบว่าไม่สามารถใช้ isset () กับผลลัพธ์ของการเรียกฟังก์ชัน เนื่องจาก Boolean ถูกส่งคืนพร้อมกับข้อความสั่งต่อไปนี้ฉันจึงสามารถตรวจสอบได้ว่าองค์ประกอบที่ห่อไว้ซึ่งในความเป็นจริงแล้วมีค่า

if ( $wrapper->field_media_alternate[0]->value() ) {
  //...valid logic...
} else {
  //...not valid logic...
}

0

ผู้คนมักจะเข้าใจผิด เมื่อคุณเรียกใช้ isset บนเอนทิตี wrapper ข้อมูลเมตาคุณกำลังตรวจสอบว่าบันเดิลเอนทิตีสนับสนุนคุณสมบัตินั้นหรือไม่ มันไม่มีอะไรเกี่ยวข้องกับมูลค่าที่แท้จริงของสนาม

ไม่มีวิธีการที่เป็นอิสระในการตรวจสอบว่ามีการตั้งค่าหรือไม่ คุณเพียงแค่ต้องประเมินค่า () หรือโดยเฉพาะอย่างยิ่ง raw () (นอกจากนี้คุณยังสามารถโทรหา count () ถ้ามันเป็นฟิลด์ที่มีหลายค่า แต่ raw () จะส่งคืนอาร์เรย์ว่างดังนั้นจึงไม่จำเป็นต้องใช้จริง)

$w = entity_metadata_wrapper('node', $nid);
//Start by checking whether the node bundle supports field_entityref_myfield.
if (isset($w->field_entityref_myfield)) {
  //If we called value(), then that would cause the referenced entity
  //to be loaded, whereas raw() just gives us the entity_id if the value
  //is set, and Null if it isn't.
  if ($w->field_entityref_myfield->raw()) {
    //Do some things based on the entity-reference being set.
  } else {
    //Do some other things based on the entity-reference NOT being set.
  }
}

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


0

นี่คือฟังก์ชั่นผู้ช่วยส่วนตัวของฉันเพื่อรับค่าจากศักยภาพที่ไม่ได้ตั้งค่าเชนของการอ้างอิงเอนทิตี:

function _get_wrapped_value_ifset($wentity, $field_chain){
  $root = $wentity;
  try{
    foreach ( $field_chain as $field_name ) {
      $root = $root->{$field_name};
    }
    return $root->value();
  }
  catch (EntityMetadataWrapperException $e){
    return null;
  }
}

$ goesity เป็นเอนทิตีที่ถูกล้อมรอบ $ field_chain เป็นอาร์เรย์ของ field_names ดังนี้:

[
  'field_reference_from_the_wentity',
  'field_wanted_field_from_the_referenced_entity'
] 

คุณอาจจะ:

[
  'field_reference_from_the_wentity', 
  'field_reference_from_the_referenced_entity',
  ... 
  'field_wanted_field_from_the_N_referenced_entity'
]

มันจะทำงาน!

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