আমি কীভাবে কোনও এনটিটিমেটাডেটা রেকার অবজেক্ট থেকে ইউআরআই ফাইলটি পেতে পারি?


11

কোনও ক্ষেত্রের মাধ্যমে নোড সম্পর্কিত ফাইলের বিষয়বস্তু ধরে রাখা সহজেই এটি ব্যবহার করে EntityMetadataWrapper:

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

সুতরাং এটি দুর্দান্ত। তবে আমি স্ট্যান্ডার্ড ফাইল অবজেক্টের কয়েকটি বৈশিষ্ট্য ব্যবহার করতে চাই এবং সেগুলি উপলভ্য নয়। আমি যখন $images[0]->fileউপরের কোডটি ব্যবহারের জন্য উপলব্ধ বৈশিষ্ট্যগুলি দেখি, তখন আমি এগুলি দেখতে পাই:

  • গোঁজ
  • নাম
  • মূকাভিনয়
  • আয়তন
  • URL
  • টাইমস্ট্যাম্প
  • মালিক

সবচেয়ে উল্লেখযোগ্যভাবে, uriঅনুপস্থিত এবং এর জায়গায় একটি urlসম্পত্তি রয়েছে যা চিত্র ফাইলের সম্পূর্ণ বাহ্যিক URL। আমি এই চিত্রগুলি তাদের ইউআরআই (থাম্ব ইত্যাদি তৈরি করুন) এর মাধ্যমে পরিচালনা করতে চাই, তাই আমি এটি করতেই বাকি রেখেছি:

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

যা EntityMetadataWrapperপ্রথম স্থানে একটি ব্যবহারের পুরো বিন্দুটিকে অস্বীকার করে বলে মনে হচ্ছে ।

আমি কী মিস করছি? মোড়ানো ফাইল অবজেক্টে ইউআরআই কোথায়? যদি এটি উপলভ্য না হয় তবে ভাল এবং খাঁটি সব কিছুর ভালবাসার জন্য কেন ?!

আমি সচেতন আমি ইউআরআইতে আবার ইউআরএল ডিকনস্ট্রাক্ট করতে পারি, তবে এটি খুব অপ্রয়োজনীয়ও বোধ করে।


1
আপনি কি file_entity ব্যবহার করছেন?
এমপিডোনাদিও

@ এমপিডি আহ্হহ, দুর্দান্ত আহ্বান, না আমি নই ... সম্ভবত যদি বিষয়টি কোনও সত্তার মতো আচরণ না করে তবে আমি কী 'সম্পত্তি' বিবেচনা করব তা দেখার আশা করা উচিত নয়। সত্তা মডিউল ছেলেরা বেছে নেওয়ার জন্য ইউআরআই পরিবর্তে ইউআরএলটিকে একটি অদ্ভুত পছন্দ বলে মনে হচ্ছে। যদি উত্তরটি "আপনার বাস্তবায়নের দরকার হয় hook_entity_property_info_alter()" তবে এটি ঠিক আছে, কেবল জানতে চেয়েছিলেন
ক্লাইভ

আমি আসলে নিশ্চিত নই যে এটি কোনও পার্থক্য তৈরি করবে কিনা, তবে সেই মডিউলটি সক্ষম হওয়া এখানে এবং সেখানে কিছু সূক্ষ্ম পার্থক্য শেষ করে। আমি অন্য জায়গায় ইএমডাব্লুয়ের সাথে ফাইল একীকরণের কিছুটা ঘাটতি পেয়েছি, তবে প্যাচ জমা দেওয়ার জন্য এটি এতটা মাথা ঘামায় নি।
এমপিডোনাদিও

@ এমপিডি আমার মনে হয় এটি হবে - স্রেফ 'অপরাধী' খুঁজে পেয়েছে entity_metadata_system_entity_property_info(), যেখানে একগুচ্ছ নতুন সম্পত্তি সন্ধান করা হবে $info['file']['properties']। আমি বাজি রাখতে রাজি যদি ফাইল_এন্টিটি সেখানে থাকে যে অ্যারে ইতিমধ্যে সেখানে সত্তার সম্পত্তি থাকবে themselves
ক্লাইভ

1
একটি তাত্ক্ষণিক পরীক্ষা করেছে এবং uriসেখানে ফাইল_েন্টিটি রয়েছে।
এমপিডোনাদিও

উত্তর:


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
এটি উল্লেখ করা ভাল যে এটি পিএইচপি 5.4 থেকে সমর্থিত।
এলেস রেবেক 17'15

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']) : '';
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.