সত্তা_মেডাটাটা_আপনার ব্যবহার করার সময় অজানা ক্ষেত্রের মানগুলির অ্যাক্সেস


12

ক্ষেত্রের মানগুলি অ্যাক্সেস করার জন্য আমি সত্তা মেটাডেটা র্যাপার ক্লাসগুলি (দ্রুপাল in-তে সত্তা মডিউল দ্বারা সংজ্ঞায়িত) ব্যবহার করার চেষ্টা করছি, কারণ এটি এটি করার একটি পরিষ্কার উপায় বলে মনে হয়।

কয়েকটি জিনিস আছে যা এটিকে কিছুটা বিশ্রী করে তোলে। ধরুন আমার কাছে একটি সামগ্রীর প্রকারের জন্য একটি মোড়ক রয়েছে যা একটি ক্ষেত্রকে 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রেফারেন্সড সত্তা (বা সত্তা ID), অথবা একটি arrayরেফারেন্সড সত্তা ID এর।


উফফফ, আমি খুব তাড়াতাড়ি enteredুকলাম! আমি যুক্ত করতে চেয়েছিলাম: $ মোড়ক-> ফিল্ড_সোমথিং-> টাইপ () টাইপ করে অ্যারের 'টাইপ' উপাদান হিসাবে একই তথ্য দেয় as মোড়ক-> ফিল্ড_সামিং-> তথ্য ()। গুরুতরভাবে, এটি এখনও বহু-মূল্যবান প্রকারের জন্য একটি স্ট্রিং "তালিকা <টাইপ>" প্রদান করে, সুতরাং এটির মাল্টিভ্যালুয়েড করার জন্য আমার এখনও একটি স্ট্রপোস (বা সমতুল্য) প্রয়োজন (যদি আমি এটি আনার আগে এটি কাজ করতে চাই)।
অ্যালিস হিটন

দ্বিতীয় পয়েন্ট হিসাবে: আমি -> কাঁচা () বা -> মান () এর রিটার্ন পরীক্ষা করে যদি এটি বহু মূল্যবান হয় তবে আমি কাজ করতে পারি তবে মানটি আনার আগে আমি বরং জানতাম, এটি যদি বহু মূল্যবান হয় আমি এটিকে ম্যানুয়ালি অ্যারে দিয়ে যাবার পরিবর্তে -> getIterator () দিয়ে একটি পূর্বাঞ্চ লুপ দিয়ে চালাতে চাই যার জন্য প্রতিটি আইটেমের জন্য আমার পুনরায় তৈরি করতে হবে।
অ্যালিস হিটন

3

সুতরাং যেহেতু কেউই অন্য সমাধান নিয়ে আসে নি, আমি নিজের প্রশ্নের উত্তর দেব:

সেখানে নয় যখন সত্তা মেটাডেটা চাদরে ব্যবহার অজানা ক্ষেত্র ধরনের এক্সেস মান সহজ উপায়।

আমি প্রাথমিকভাবে বর্ণিত পদ্ধতিতে বিকল্প পদ্ধতি রয়েছে (উদাহরণস্বরূপ @ থিপিয়াসন দ্বারা নির্দেশিত)। বিশেষত এই পদ্ধতিটি দরকারী:

 entity_property_list_extract_type($type)

এটি যদি আপনার প্রকারের তালিকা থাকে তবে তালিকাবদ্ধ প্রকারটি (যেমন: 'ধরণটি যদি আপনার টাইপটি' তালিকা <ইনটিজার> 'হয় তবে) অথবা আপনার প্রকারের তালিকাটি যদি ভুল না হয় তবে এটি প্রত্যাবর্তন করবে। অভ্যন্তরীণভাবে এটি প্রথম দিকে পোস্ট করা কোডের মতোই একটি স্ট্রপোস করে তবে আমার ধারণা এটি ভবিষ্যতের আরও প্রমাণ।

উপসংহারটি হ'ল:

  • সারণীর মেটাডেটা মোড়কগুলি ভাল কাজ করে যদি আপনার ক্ষেত্রের ধরণের সম্পর্কে আপনার কোনও ধারণা না থাকে এবং প্রতিটি সম্ভাব্য কেস সাবধানতার সাথে সম্বোধন করতে চান;

  • সত্তা মেটাডেটা মোড়কগুলি ভালভাবে কাজ করে যদি আপনি জানেন যে আপনার ক্ষেত্রগুলি কী ধরণের হয় এবং আপনি সেগুলি ব্যবহার করতে চান;

  • আপনার ক্ষেত্রের ধরণগুলি কী কী তা সম্পর্কে কেবল কিছু ধারণা থাকলে (উদাহরণস্বরূপ সমস্ত পাঠ্য হয় তবে সেগুলি ফর্ম্যাট করা হয়েছে কিনা এবং আপনি জানেন না যে সেগুলি একক বা বহু মূল্যবান কিনা) তবে সত্তা মেটাডেটা র‌্যাপারগুলি কোনও শর্ট-কাট সরবরাহ করবেন না এবং আপনার নিজের লেখার দরকার যেমন আমি প্রাথমিক প্রশ্নে করেছি।


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