मैं क्षेत्र मूल्यों का उपयोग करने के लिए इकाई मेटाडेटा आवरण कक्षाएं (Drupal 7 में इकाई मॉड्यूल द्वारा परिभाषित) का उपयोग कर रहा हूं, क्योंकि ऐसा करने का एक साफ तरीका प्रतीत होता है।
हालांकि कुछ चीजें हैं जो इसे थोड़ा अजीब बनाती हैं। मान लें कि मेरे पास सामग्री प्रकार के लिए एक आवरण है जो एक फ़ील्ड को परिभाषित करता है field_something
जैसे कि:
$wrapper = entity_metadata_wrapper('node', node_load($nid));
$value = $wrapper->field_something->value();
मेरे पास पहली समस्या यह है कि मेरे पास हाथ से पहले जानने का कोई तरीका नहीं है कि मुझे जो मिलता है वह वास्तविक मूल्य (एक स्ट्रिंग, एक इकाई, आदि) है, एक अन्य मेटाडेटा संरचना आवरण (जब फ़ील्ड में कई मान होते हैं) या एक सरणी (जब फ़ील्ड में कई गुण होते हैं)।
मैंने info()
विधि का उपयोग करके उन प्रश्नों का उत्तर देने का एक तरीका ढूंढ लिया है:
$info = $wrapper->field_something->info();
$is_multi_value = (strpos($info['type'], 'list<') === 0);
$has_multiple_properties = isset($info['property info']]);
हालांकि यह शायद ही व्यावहारिक है। जब भी मैं हाथ से पहले परिभाषा के बिना एक क्षेत्र का उपयोग करना चाहता हूं, मुझे कई मामलों को ध्यान में रखना चाहिए। इससे मेरा कोड काफी भारी हो गया है।
इससे निपटने के लिए मैंने कुछ कोड लिखे हैं:
- सुनिश्चित करता है कि हम हमेशा एक सरणी लौटाएँ, भले ही यह एक एकल मूल्य क्षेत्र हो;
- जब कई गुण हों, तो पहले कॉलम का मान लौटाएँ।
प्वाइंट 1. यहां हमेशा काम होगा, जब तक कि कॉलर यह जानना न चाहे कि यह एक एकल मूल्य क्षेत्र था या नहीं। बिंदु 2 कुछ मामलों में काम करता है, सभी नहीं, लेकिन जब यह लागू होता है तो सुविधाजनक होता है।
यहाँ कोड है:
function entity_metadata_simple_values($field) {
$fields = array();
$values = array();
$info = $field->info();
if (strpos($info['type'], 'list<') === 0) {
foreach ($field->getIterator() as $field_iteration) {
$fields[] = $field_iteration;
}
} else {
$fields[] = $field;
}
foreach ($fields as $final_field) {
$ff_info = $final_field->info();
if (isset($ff_info['property info'])) {
$column = reset(array_keys($ff_info['property info']));
$values[] = $final_field->{$column}->value();
} else {
$values[] = $final_field->value();
}
}
return $values;
}
तो मेरा सवाल यह है कि क्या क्षेत्र के प्रकार ज्ञात नहीं होने पर मेटाडेटा आवरण से मान प्राप्त करने की इस समस्या का समाधान करने के लिए सरल / बेहतर तरीके हैं?