एंट्री_मेटाडाटा_वापर का उपयोग करते समय अज्ञात क्षेत्र प्रकारों तक पहुँचना


12

मैं क्षेत्र मूल्यों का उपयोग करने के लिए इकाई मेटाडेटा आवरण कक्षाएं (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. जब कई गुण हों, तो पहले कॉलम का मान लौटाएँ।

प्वाइंट 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;
}

तो मेरा सवाल यह है कि क्या क्षेत्र के प्रकार ज्ञात नहीं होने पर मेटाडेटा आवरण से मान प्राप्त करने की इस समस्या का समाधान करने के लिए सरल / बेहतर तरीके हैं?

जवाबों:


4

इस प्रक्रिया को थोड़ा आसान बनाने के लिए यहां कुछ सुझाव दिए गए हैं।

$wrapper->field_something->type();

क्षेत्र, यानी के प्रकार वापस आ जाएगी node, taxonomy_term, integer, textआदि इसके बाद आप को संभाल सकता मूल्य से लौटे $wrapper->field_something->value()सही ढंग से।

भी

$wrapper->field_something->raw()

फ़ील्ड का कच्चा मान लौटाएगा। जो या तो arrayसिर्फ मूल्य के बहु मूल्यवान क्षेत्रों के मामले में होगा। उदाहरण के लिए संदर्भित इकाई की या (संदर्भित इकाई आईडी की) entity_referenceएक nid(या इकाई आईडी) होगी array


उफ़, मैंने बहुत जल्दी प्रवेश किया! मैं जोड़ना चाहता था: $ आवरण-> field_something-> प्रकार () सरणी के 'प्रकार' तत्व के रूप में उसी जानकारी को वापस करता है जो $ आवरण द्वारा लौटाई गई-> field_something-> जानकारी ()। महत्वपूर्ण रूप से, यह अभी भी बहु-मूल्यवान प्रकारों के लिए एक स्ट्रिंग "सूची <प्रकार>" लौटाता है, इसलिए मुझे अभी भी इसे विकसित करने के लिए एक स्ट्रैप (या समतुल्य) की आवश्यकता है (यदि मैं इसे लाने से पहले इसे काम करना चाहता हूं)।
ऐलिस हेटन

दूसरे बिंदु के रूप में: मैं वास्तव में बाहर काम कर सकता हूं यदि यह -> कच्चे () या -> मूल्य () के रिटर्न का परीक्षण करके बहु मूल्यवान है, हालांकि मुझे मूल्य प्राप्त करने से पहले पता होगा, जैसे कि यह बहु मूल्यवान है मैं इसे फ़ॉरन लूप के माध्यम से चलाना चाहता हूं -> getIterator () के बजाय मैन्युअल रूप से उस सरणी से गुजरता हूं जिसके लिए मुझे प्रत्येक आइटम के लिए एक रैपर को फिर से बनाना होगा।
ऐलिस हेटन

3

इसलिए जैसा कि कोई अन्य समाधान नहीं आया है, मैं अपने प्रश्न का उत्तर दूंगा:

वहाँ नहीं है जब इकाई मेटाडाटा रैपर का उपयोग कर अज्ञात क्षेत्र प्रकार के पहुँच मूल्यों के लिए सरल तरीका।

मेरे द्वारा शुरू में वर्णित उदाहरण के लिए वैकल्पिक तरीके हैं (उदाहरण के लिए @thepearson द्वारा बताया गया)। विशेष रूप से यह विधि उपयोगी है:

 entity_property_list_extract_type($type)

यदि आपका प्रकार एक सूची है (जैसे। 'पूर्णांक' यदि आपका प्रकार 'सूची <पूर्णांक>') है, या गलत है यदि आपका प्रकार सूची नहीं है तो यह सूचीबद्ध प्रकार को लौटाएगा। आंतरिक रूप से यह उस कोड की तरह एक स्ट्रैप करता है जिसे मैंने शुरू में पोस्ट किया था, लेकिन मुझे लगता है कि यह भविष्य का प्रमाण है।

निष्कर्ष यह है कि:

  • यदि आपके क्षेत्र प्रकारों का कोई पता नहीं है, और प्रत्येक संभावित मामले को सावधानीपूर्वक संबोधित करना चाहते हैं, तो मेटाडेटा रैपर अच्छी तरह से काम करते हैं;

  • यदि आप जानते हैं कि आपके क्षेत्र कितने प्रकार के हैं, और आप उनका उपयोग करना चाहते हैं, तो मेटाडेटा रैपर अच्छा काम करते हैं;

  • यदि आपके पास केवल कुछ विचार हैं कि आपके फ़ील्ड प्रकार क्या हैं (उदाहरण के लिए सभी पाठ, लेकिन आप नहीं जानते कि क्या वे स्वरूपित हैं या नहीं, और आप नहीं जानते कि क्या वे एकल या बहु मूल्यवान हैं) तो Entity मेटाडेटा आवरण कोई भी शॉर्ट-कट प्रदान न करें और आपको अपना प्रश्न लिखने की आवश्यकता है जैसा कि मैंने प्रारंभिक प्रश्न में किया था।


1

सिंगल / मल्टीपल फील्ड चेक के लिए मैंने रैपर ऑब्जेक्ट के प्रकार का परीक्षण करना उपयोगी पाया है, जो EntityListWrapperबहु-मूल्य फ़ील्ड के लिए और EntityValueWrapperसिंगल-वैल्यू फ़ील्ड के लिए होगा:

<?php
...
$wrapper = entity_metadata_wrapper('user', $account);
// Get address, or first address if a multi-value field instance.
if (get_class($wrapper->field_address) == 'EntityListWrapper') {
  $value = $wrapper->field_address[0]->value();
}
else {
  $value = $wrapper->field_address->value();
}

या यहां तक ​​किif($wrapper->field_name instanceof EntityListWrapper) {...}
rudolfbyker
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.