मुझे EntityMetadataWrapper ऑब्जेक्ट से URI फ़ाइल कैसे मिलती है?


11

किसी फ़ील्ड के माध्यम से नोड्स से संबंधित फ़ाइल ऑब्जेक्ट्स को पकड़ना आसान है EntityMetadataWrapper:

$wrapper = entity_metadata_wrapper('node', $node);
$images = $wrapper->field_images;

तो यह बहुत अच्छा है। हालाँकि, मैं मानक फ़ाइल ऑब्जेक्ट के कुछ गुणों का उपयोग करना चाहता हूं, और वे उपलब्ध नहीं हैं। जब मैं $images[0]->fileउपरोक्त कोड का उपयोग करने पर उपलब्ध गुणों को देखता हूं, तो मैं इन्हें देखता हूं:

  • खूंटी
  • नाम
  • अंगविक्षेप
  • आकार
  • यूआरएल
  • टाइमस्टैम्प
  • मालिक

सबसे विशेष रूप से, uriगायब है, और इसके स्थान पर एक urlसंपत्ति है, जो छवि फ़ाइल के लिए पूर्ण बाहरी URL है। मैं इन चित्रों को उनके URI (अंगूठे आदि बनाना) के माध्यम से हेरफेर करना चाहता हूं, इसलिए मैं ऐसा करना छोड़ रहा हूं:

$fid = $images[0]->file->fid->value();
$uri = file_load($fid)->uri;

जो EntityMetadataWrapperपहली जगह में उपयोग करने के पूरे बिंदु को नकारात्मक लगता है।

मुझे किसकी याद आ रही है? लिपटे फ़ाइल ऑब्जेक्ट पर URI कहां है? यदि यह उपलब्ध नहीं है, सभी चीजों के प्यार के लिए अच्छा और शुद्ध, क्यों नहीं ?!

मुझे पता है कि मैं URL को एक URI में वापस आ सकता हूं, लेकिन यह भी बहुत अनावश्यक लगता है।


1
क्या आप file_entity का उपयोग कर रहे हैं?
mpdonadio

@MPD आह्ह्ह, महान कॉल, नहीं, मैं नहीं ... शायद मुझे यह देखने की उम्मीद नहीं करनी चाहिए कि अगर मैं एक इकाई की तरह काम नहीं कर रहा हूं तो मैं 'गुण' पर क्या विचार करूंगा। यूआरआई के बजाय यूआरआई के लिए यूआईआर के बजाय एक अजीब विकल्प URL को चुना गया है, हालांकि। इस सवाल का जवाब है, तो "आप की जरूरत करने जा रहे हैं लागू करने के लिए hook_entity_property_info_alter()" तो उस के ठीक, बस जानना चाहता था
क्लाइव

मुझे यकीन नहीं है कि अगर इससे कोई फर्क पड़ेगा, लेकिन उस मॉड्यूल को सक्षम करने से कुछ सूक्ष्म अंतर यहाँ और वहाँ समाप्त हो जाते हैं। मुझे अन्य स्थानों में EMW के साथ फ़ाइल एकीकरण की थोड़ी कमी है, लेकिन इसे पैच सबमिट करने के लिए पर्याप्त परेशान नहीं किया गया है।
mpdonadio

@MPD मुझे लगता है कि यह पता चलेगा - बस 'अपराधी' का पता चला है entity_metadata_system_entity_property_info(), जहां नई संपत्तियों का एक गुच्छा मिलता है $info['file']['properties']। अगर file_entity में है तो मैं शर्त लगाने के लिए तैयार हूं कि सरणी में पहले से ही इकाई गुण मौजूद होंगे। मैं बाद में या कल को एक उत्तर लिखने की कोशिश करूंगा यदि कोई पहले से नहीं करता है
क्लाइव

1
एक त्वरित परीक्षण किया और urifile_entity के साथ है।
mpdonadio

जवाबों:


9

मुझे सही दिशा में इंगित करने के लिए एमपीडी का बड़ा धन्यवाद। संक्षेप में, फ़ाइल एंटिटी मॉड्यूल के बिना , फाइलें इकाइयां नहीं हैं, इसलिए वे स्वाभाविक रूप से 'गुण' नहीं रखते हैं जिसकी मुझे उम्मीद थी।

इकाई मॉड्यूल उनकी ओर से कुछ प्रदान करता है, लेकिन यूआरआई उनमें से एक नहीं है। सौभाग्य से इसका उपयोग करना hook_entity_property_info_alter()और कस्टम प्रॉपर्टी कॉलबैक उपलब्ध कराना बहुत सरल है :

function MYMODULE_entity_property_info_alter(&$info) {
  $info['file']['properties']['uri'] = array(
    'label' => t("URI"),
    'description' => t("The URI of the file."),
    'getter callback' => 'MYMODULE_entity_get_file_properties',
    'schema field' => 'uri',
  );
}

function MYMODULE_entity_get_file_properties($file, array $options, $name) {
  switch ($name) {
    case 'uri':
      return $file->uri;
      break;
  }
}

उसके बाद, $images[0]->file->uri->value()उम्मीद के मुताबिक उपलब्ध है।


8

नीचे हैक के बिना काम करता है:

 $node_wrapper->field_media[0]->value()['uri'];

2
यह इंगित करना अच्छा है कि यह PHP 5.4 से समर्थित है।
एल्स रेबेक

3

यह वही है जो मेरे लिए एक छवि का पूरा रास्ता पाने के लिए काम करता है ...

// wrap it
$wrapper = entity_metadata_wrapper('node', node_load(16));
// get the value
$image = $wrapper->field_image->value();
// check it
if ($image) {
   // get the full path
   $path = file_create_url($image['uri']);
}
print_r($path);

वैकल्पिक रूप से ...

  $image = $wrapper->field_image->value();
  $image_path = $image ? file_create_url($image['uri']) : '';
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.