एक इकाई पर एक क्षेत्र के लिए अस्तित्व की जाँच करना


22

मैं एक फ़ील्ड संग्रह के माध्यम से पुनरावृत्ति कर रहा हूं, और एक इकाई_मेटडाटा_वापर के साथ फ़ील्ड संग्रह आइटम लपेट रहा हूं। मैं इसकी 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देखने के लिए उपयोग करना है कि क्या क्षेत्र खाली है, लेकिन यदि संभव हो तो मैं मेटाडेटा आवरण के माध्यम से ऐसा करने में सक्षम होना चाहूंगा।

जवाबों:


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()की प्रिंसिपे अनुसार समारोह ओवरलोडिंग


हां, यह हमेशा होता है कि मैंने इसे कैसे किया है, कम से कम इंटर्नल में बंधा हुआ है और आईएमओ पढ़ने में आसान है। Upvoted!
कोटशेयर

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विधि जंजीर के कारण वहाँ कहीं है। लेकिन, EntityStructureWrapper के लिए __isset () विधि देखें

इस तरह की जाँच करें:

$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दे रहा है ... आपके पास किसी तरह से घोंसला है। मैं मान रहा हूँ कि आप इन चीजों को घोंसला बनाने के लिए field_group की तरह Unit_reference या कुछ और का उपयोग कर रहे हैं ... मेरे लिए इसका मतलब है।
तेनकेन

आपके लिए काम करने वाला __isset () कोड क्या है?
तेनकेन

यह था:$item_wrapper->field_contributor->__isset('field_contrib_headshot')
निक टॉमलिन

मुझे __isset () को सीधे कॉल करना अजीब लगता है, क्यों नहीं: $has_headshot = isset($item_wrapper->field_contributor->field_contrib_headshot);
कोटर्स

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;
}

आप पा सकते हैं कि उपयोग करना मुश्किल है जैसे कि सच का मूल्यांकन करना चाहिए भले ही एनआईडी मौजूद न हो। -> getIdentifier (), या -> मूल्य (), या -> कच्चा () अपवाद फेंक सकते हैं।

प्यार हमेशा की तरह

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 () का उपयोग नहीं किया जा सकता है। चूंकि एक बूलियन निम्नलिखित कथन के साथ लौटा है, इसलिए मैं सत्यापित करने में सक्षम था कि लिपटे तत्व, वास्तव में, एक मूल्य था।

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

0

लोगों को अक्सर यह गलत लगता है। जब आप किसी इकाई मेटाडेटा आवरण पर isset कहते हैं, तो आप जाँच रहे हैं कि इकाई बंडल उस संपत्ति का समर्थन करता है या नहीं। क्षेत्र के वास्तविक मूल्य से इसका कोई लेना देना नहीं है।

वास्तव में यह जाँचने के लिए कोई स्वतंत्र तरीका नहीं है कि कोई मान निर्धारित है या नहीं। आपको बस मूल्य () या, अधिमानतः, कच्चे () का मूल्यांकन करना होगा। (आप गणना को भी कॉल कर सकते हैं) (यदि यह एक बहु-मूल्य फ़ील्ड है, लेकिन कच्चा () एक खाली सरणी लौटाएगा, तो इसकी वास्तव में आवश्यकता नहीं है।)

$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;
  }
}

$ गोइयत लिपटे हुए इकाई है, $ फ़ील्ड_चैन फ़ील्ड_नाम की एक सरणी है जैसे:

[
  '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'
]

यह काम करेंगे!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.