आप एंट्री_मेटडाटा_वॉपर () के साथ फ़ील्ड मान कैसे साफ़ करते हैं?


20

मान लीजिए कि मेरे पास इस field_fooपर एक क्षेत्र के साथ एक इकाई है और मैं उस क्षेत्र के मूल्य को साफ करना चाहता हूं।

मुझे क्या करना चाहिए $wrapper->set()?

मैंने कोशिश की है NULLऔर array()दोनों एक त्रुटि संदेश देते हैं।


1
क्या आप EntityStructureWrapper::clear()या EntityValueWrapper::clear()शायद तरीकों की तलाश कर रहे हैं ?
क्लाइव

::clearसीधे कॉल करना फ़ील्ड को रिक्त मान सेट करने के बराबर नहीं है, क्योंकि यह updateParentउस तरह से कॉल नहीं करता है जिस तरह से setखाली मान होता है। अन्य बातों के अलावा, updateParentयह सुनिश्चित करता है कि setter callbackसंपत्ति की जानकारी ( drupalcontrib.org/api/drupal/… देखें ) में परिभाषित है।
ऐलिस हेतोन

जवाबों:


24

समस्या यह है कि आपको एक खाली मान सेट करना होगा जो आपके क्षेत्र के डेटा प्रकार के अनुकूल हो। यदि आप नहीं करते हैं, तो आपको एक अपवाद मिलेगा। पास होने NULLया array()जब एक स्ट्रिंग की उम्मीद की जाती है, इसलिए एक त्रुटि बढ़ जाएगी।

एक और बात का ध्यान रखें कि आपके द्वारा पास किया जाने वाला डेटा इस बात पर भी निर्भर करेगा कि आपका क्षेत्र एकल मूल्य है, बहु-मूल्य फ़ील्ड है, या एकाधिक गुणों वाला फ़ील्ड है।

यदि आपका फ़ील्ड एक एकल मान है (और इस प्रकार फ़ील्ड के लिए आवरण EntityValueWrapper का एक उदाहरण है ) तो आपको इसे प्रश्न में डेटा प्रकार के साथ संगत एक खाली मान असाइन करना चाहिए । उदाहरण के लिए दो निम्नलिखित विधियाँ समतुल्य हैं:

$wrapper->title = '';
$wrapper->title->set('');

हालांकि निम्नलिखित तीन उदाहरण एक अपवाद को बढ़ाएंगे, क्योंकि डेटा प्रकार titleफ़ील्ड के साथ संगत नहीं हैं :

$wrapper->title->set();
$wrapper->title->set(NULL);
$wrapper->title->set(array());

यदि आपका क्षेत्र कई गुणों वाला एक क्षेत्र है (उदाहरण के लिए एक स्वरूपित पाठ क्षेत्र, जो दोनों एक valueऔर formatसंपत्ति को परिभाषित करता है ) और इस प्रकार EntityStructureWrapper का उदाहरण है , तो array()या NULLसही खाली मान होगा। तो आप निम्न कार्य कर सकते हैं:

$wrapper->field_formatted_text = array();
$wrapper->field_formatted_text = NULL;

लेकिन उस मामले में, एक खाली स्ट्रिंग पास करने से एक त्रुटि पैदा हुई होगी। ध्यान दें कि आप valueइसके बजाय संपत्ति को खाली करने के लिए चुन सकते हैं , जिस स्थिति में एक स्ट्रिंग सही डेटा प्रकार है:

$wrapper->field_formatted_text->value = '';

अंत में, यदि आपका फ़ील्ड एक बहु-मूल्य फ़ील्ड है (और इस प्रकार आपका आवरण EntityListWrapper का एक उदाहरण है ) तो arrayया NULLसही खाली मान हैं, और निम्नलिखित तीन लाइनें बराबर हैं:

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

नोट: clearरैपर पर विधि को कॉल करना फ़ील्ड को रिक्त मान पर सेट करने के बराबर नहीं है। जब फ़ील्ड को रिक्त मान पर सेट किया जाता है, तो वह EntityMetadataWrapper :: updateParent को फ़ील्ड के पैरेंट रैपर पर कॉल करता है । यह उन अन्य चीजों के बीच सुनिश्चित करता है, जिन्हें hook_entity_property_infosetter callback द्वारा परिभाषित किया जाता है। कॉलिंग ऐसा नहीं करती है।clear


1
ध्यान दें कि यदि फ़ील्ड एकाधिक और आवश्यक है, तो सेटिंग करना array()या NULLविफल हो सकता है, क्योंकि फ़ील्ड रिक्त नहीं हो सकती है। यह सामान्य $nodeफ़ील्ड असाइनमेंट से अलग है , जहाँ आप प्रोग्राम को आवश्यक रूप से एक खाली फ़ील्ड बचा सकते हैं (यह ड्रुपल के अपने UI के माध्यम से नहीं बचाएगा)। इस स्थिति में, वर्कअराउंड वह array(N)जगह है , जहां एन एक गैर-विद्यमान अभी तक संदर्भित इकाई की आईडी है। ध्यान दें कि यह उस आईडी के साथ बचाएगा, इसलिए आपके डेटा को तर्कसंगत रूप से "टूट" गया है; यदि आप वहां सभी सही काम कर रहे हैं (जैसे कि प्रदर्शन सूट या पैनलों का उपयोग करके) तो यह विषय परत को प्रभावित नहीं करना चाहिए।
जेपी

$w->field_allowed_regions->set(array(null));एकमात्र विकल्प है जिसने मेरे बहु-मूल्य वाले टैक्सोनॉमी संदर्भ क्षेत्र के लिए काम किया है।
अतुल्य

मेरे मामले में मेरे पास एक एकल मान के साथ एक इकाई संदर्भ क्षेत्र है। निम्नलिखित ने मेरे लिए काम किया: $ आवरण-> field_entity_reference-> set (NULL);
मार्कोस बुर्के

3

अन्य उत्तर और टिप्पणियों के लिए, यदि क्षेत्र एकाधिक और आवश्यक है, जैसा कि पहले उल्लेख किया गया है कि आप उपयोग नहीं कर सकते हैं

$wrapper->field_example_multiple->set()

$wrapper->field_example_multiple->set(NULL)

नहीं भी $wrapper->field_example_multiple->set(array()),

लेकिन इसके बजाय आप निम्नलिखित का उपयोग कर सकते हैं यदि आप इसके सभी मूल्यों के क्षेत्र को साफ करना चाहते हैं:

$wrapper->field_example_multiple->set(array(NULL));

वास्तव में, यह काम करता है कि क्या एकाधिक-मूल्य फ़ील्ड 'आवश्यक' पर सेट है या नहीं, और इसलिए मैं यह सुनिश्चित करने के लिए हमेशा उपयोग करने की सलाह दूंगा, ताकि यह सुनिश्चित हो सके कि आपका कोड मजबूत है।

(बेशक, यदि क्षेत्र 'आवश्यक' है, तो आपको शायद इसे पूरी तरह से साफ नहीं करना चाहिए, लेकिन आपका कोड पूरी इकाई या कुछ समान को हटाने के लिए एक प्रारंभिक कदम के रूप में ऐसा कर सकता है, इसलिए ऐसे समय होते हैं जब यह हो सकता है बस वैध हो।)


विदित हो कि `$ रैपर-> फ़ील्ड_एक्सप्ले_मूल्ट-> सेट (सरणी (NULL))` का उपयोग करने से डेटा सरणी में एक NULL तत्व होने का मार्ग प्रशस्त होगा। यह विधि मानों को स्पष्ट नहीं करती है, बल्कि मानों को एकल मान पर सेट करती है NULL
एलेक्स स्क्रीपनीक

अच्छी बात। मुझे लगता है कि एक आवश्यक मूल्य को मंजूरी नहीं देने के बारे में मेरी टिप्पणी पर हमें वापस लौटाता है। यह शायद जानबूझकर असंभव बना है।
मार्टिन क्यू

वास्तव में, आवश्यक फ़ील्ड में कम से कम एक गैर-शून्य मान होना चाहिए। यदि आप एक आवश्यक बहुविकल्पीय क्षेत्र को रीसेट करना चाहते हैं, तो बस इसे नए मान के साथ अधिलेखित कर दें। Ie:$product_display->field_product = array($product_id);
इंटरड्यूपर

2

ऐसा प्रतीत होता है कि अन्य टिप्पणियों में सूचीबद्ध जटिलताएं केवल एक आवश्यक क्षेत्र के लिए प्रासंगिक हैं। यदि फ़ील्ड आवश्यक नहीं है, तो यह बहुत सरल होना चाहिए:

$wrapper->field_foo = NULL;

क्षेत्र के गुणों की जांच करने के लिए आप रैपर का उपयोग कर सकते हैं:

$properties = $wrapper->getPropertyInfo();
$field_required = !empty($properties['field_foo']['required']);

संदर्भ के आधार पर, आप केवल एक क्षेत्र के गुणों का उपयोग कर सकते हैं:

$wrapper->getPropertyInfo('field_foo');

1

इस समस्या का एक और समाधान हो सकता है EntityMetadataWrapper::clear

$entity_wrapper->field->clear()


EntityMetadataWrapper :: स्पष्ट पद्धति को "संरक्षित" घोषित किया गया है, इसलिए इसे आपके कोड से नहीं बुलाया जा सकता है: केवल "सार्वजनिक" विधियों को सीधे ऑब्जेक्ट के बाहर से एक्सेस किया जा सकता है।
इंटरप्रिपर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.