भाषा [und] के साथ काम करते समय सबसे अच्छा अभ्यास क्या है?


51

मैं अपने मॉड्यूल में डेटा तक पहुंचने के लिए इस फॉर्म का उपयोग करना शुरू कर रहा हूं। ( टिप्पणी # 1 देखें )

$node->field_test[$node->language][0]['value']

मैंने सोचा था कि एक बहुत अच्छा समाधान की तरह लग रहा था, लेकिन आगे उसी सवाल मैं यह पाया :

यह मत समझो कि 'und' भाषा के बिना संस्थाओं के क्षेत्रों के लिए है, यह उन क्षेत्रों के लिए भी है जो अनुवाद योग्य नहीं हैं, और इकाई अनुवाद मॉड्यूल के बिना जो सभी फ़ील्ड हैं। इसके अलावा, ड्रुपल के विभिन्न 7.x संस्करणों के बीच इसमें अंतर हैं। फ़ंक्शन
का उपयोग करने के लिए बेहतर है field_get_items()जो डेटा कोड किस भाषा कोड के तहत आपके लिए छाँटेगा।

और अब मुझे नहीं पता कि मैं जो उपयोग कर रहा हूं वह सड़क के नीचे कुछ तोड़ सकता है।

जवाबों:


39

मुझे लगता है कि Entity API मॉड्यूल का उपयोग करना एक बड़ी मदद है और कोड को अधिक पठनीय बनाता है। उपरोक्त कोड हमेशा काम नहीं करेगा, क्योंकि नोड की भाषा और क्षेत्र की भाषा अलग हो सकती है।

इकाई API मॉड्यूल और इसके आवरण के साथ, आप निम्न कोड का उपयोग कर सकते हैं:

 $node_wrapper = entity_metadata_wrapper('node', $node);
 $field_val = $node_wrapper->field_test->value();

यह बुलेट प्रूफ होना चाहिए। इकाई मॉड्यूल का उपयोग करने के बारे में एक बात यह है कि यदि आप एक ऐसे क्षेत्र का उपयोग करने का प्रयास करते हैं जो मौजूद नहीं है, तो आपको एक नोटिस और गलत व्यवहार के बजाय एक त्रुटि और एक अपवाद फेंक दिया जाएगा।

इससे बचने के लिए, आप इस तरह की कोशिश कर सकते हैं

try {
  $field_val = $node_wrapper->field_doesnt_exist->value();
} catch (EntityMetadataWrapperException $e) {
  $field_val = 'default/fallback value';
}

या आप isset()जो EntityMetadataWrapperआंतरिक रूप से संभालता है उसका उपयोग कर सकते हैं :

$field_val = 'default/fallback value';
if (isset($node_wrapper->field_doesnt_exist)) {
  $field_val = $node_wrapper->field_doesnt_exist->value();
}

क्या इस समारोह entity_metadata_wrapper()में पदावनत किया गया है? मैंने अपने मॉड्यूल में इसे कॉल करने की कोशिश की, और मुझे मिल गया Fatal error: Call to undefined function entity_metadata_wrapper()- मैंने ड्रीमवेवर में अपने Drupal 7.12 इंस्टॉलेशन पर एक स्रोत खोज किया, और कोड में कहीं और 0 परिणाम के साथ आया!
आदित्य एमपी

1
aditya - यह Entity API मॉड्यूल में है - कोर में नहीं।
लाजियोसाइट्स सिस्टम

1
@adityamenon जैसा आलसी कहता है कि यह कोर में नहीं है ... फिर भी, यह शायद Drupal 8 के लिए होगा। इकाई एपीआई कम से कम बहुत सुधार होगा। वास्तव में Drupal 7 के लिए निकाय प्रणाली के लिए आवश्यक सभी API बनाने के लिए समय नहीं था, इसीलिए इकाई API मॉड्यूल को प्राप्त करने की कोशिश करता है।
googletorp

धन्यवाद दोस्तों, मैं बेवकूफ था कि मैं जवाब को ठीक से नहीं पढ़ पाया और एंटिटी एपीआई प्रोजेक्ट पेज के लिंक का अनुसरण कर रहा था :)
आदित्य एमपी

1
जब मैं Unit_metadata_wrapper के स्रोत कोड को देखता हूं और उन सभी वर्गों के माध्यम से खरगोश के निशान का पालन करता हूं, जो त्वरित रूप से विस्तारित होते हैं और मुझे आसान क्षेत्र हेरफेर देने के लिए विस्तारित होते हैं, तो मुझे आश्चर्य होता है कि क्या यह सब इसके लायक है। मेरे बूटस्ट्रैप में कोड की एक और 3k + लाइनों को जोड़ना और सभी चर असाइनमेंट से निपटने के लिए अधिक मेमोरी लेना ... क्या कुछ हल्का है? यह सिर्फ ऐसा लगता है कि $node->field_name[LANGUAGE_NONE][0]['value'] = 'foo';वास्तव में सबसे कुशल तरीका है।
चार्ली श्लिसेर

19

पढ़ने के लिए, आपको हमेशा field_get_items () का उपयोग करने में सक्षम होना चाहिए , जो आपके लिए सही भाषा चुनेगा और यह भी जाँच करेगा कि फ़ील्ड में कोई मान है या नहीं।

दुर्भाग्य से, फ़ील्ड API बहुत ही सीमित है। 7.x में, पहला फ़ील्ड आइटम प्राप्त करने का कोई तरीका नहीं है, यहां तक ​​कि एकल फ़ंक्शन कॉल के साथ मूल्य प्राप्त करने के बारे में पूछने की हिम्मत न करें ... और कोई फ़ील्ड_सेट_मिट्स नहीं है ( ) समकक्ष।

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


1
मुझे इस बात से आभास होता है कि आप क्या कह रहे हैं कि ड्रुपल 8 में इस तरह की चीज को बेहतर बनाया जा सकता है? यदि ऐसा है तो कोई यह कैसे पता लगा सकता है कि इस प्रकार की चीजें कैसे प्रगति कर रही हैं? मॉड्यूल पृष्ठों से अलग मेरे लिए एक भूलभुलैया की तरह है! :)
क्लाइव

1
खैर, हमेशा उम्मीद है :) और ड्रुपल 8 में क्या चल रहा है, इसका एक उच्च स्तरीय अवलोकन भी रखना मुश्किल है, एक तरीका यह है कि iniatives का पालन करें। हालांकि यह मौजूदा निर्देशों का प्रत्यक्ष लक्ष्य नहीं है। इकाई के मॉड्यूल के कुछ हिस्सों को स्थानांतरित किया जा रहा है / कोर में ले जाया जा रहा है (अब एंटिटी वर्ग है और मौजूदा इकाइयां नई प्रणाली में परिवर्तित हो गई हैं)। इसलिए एक मौका है कि हम उदाहरण के लिए खेतों से निपटने के लिए उन वर्गों पर सीधे तरीके प्राप्त करेंगे। प्रारंभ किए गए परिवर्तनों के लिए, एक अच्छा संसाधन नया परिवर्तन रिकॉर्ड सिस्टम है, drupal.org/list-changes/drupal देखें ।
बेदीर

शानदार, यह वास्तव में मुझे बहुत बहुत धन्यवाद के लिए देख रहा था की तरह है! :) आशा है कि आप बुरा नहीं मानेंगे मेरे पूछने पर मुझे पता है कि यह वास्तव में विषय के लिए साइट पर नहीं है ... मैं कोर में योगदान करने में शामिल होना पसंद करूंगा लेकिन वास्तव में कभी भी ओपन-सोर्स में शामिल नहीं हुआ, मुझे पूरी बात पता चली थोड़ा कठिन है ... यह एक अच्छी जगह :) शुरू करने के लिए अच्छा है
क्लाइव

क्लाइव: drupalofficehours.org की जाँच करें - लोगों को योगदान देने के साथ शुरू करने में मदद करना ठीक है। वहां और संसाधन। मैं एक उपयोगकर्ता समूह की बैठक में जाने की भी सिफारिश करूंगा जो कोर देवों को अक्सर या एक DrupalCamp की संभावना है जहां एक कोर देव या दो होंगे। अपने स्थानीय समूह को group.drupal.org पर खोजें और आपको इसे पूरा करने में सक्षम होना चाहिए। drupical.org भी उपयोगी हो सकता है।
विघ्ननाशन

-2
$node = node_load($lot_id);
$field_language = field_language('node', $node, 'field_name');
$node->field_name[$field_language][0]['value'] = $custom_value;

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