অন্যান্য মডিউল এর ক্ষেত্র বিন্যাসে আবদ্ধ?


9

আমি বর্তমানে আমার ড্রুপাল site সাইটে একটি নোড রেফারেন্সযুক্ত চিত্র ক্ষেত্রটি বাস্তবায়নের চেষ্টা করছি যা রেন্ডার করার ঠিক আগে প্রোগ্রাম্যাটিকাল যুক্তির উপর নির্ভর করে এটি 'ভিউ মোড' পরিবর্তন করবে। ক্ষেত্রটি বর্তমানে তাদের প্রদর্শন মোড সেটিংসের মাধ্যমে বেশ কয়েকটি সামগ্রীর ধরণে রেন্ডার করা হচ্ছে, যার প্রতিটি ফিল্ড ফর্ম্যাটর 'রেন্ডারড নোড' ব্যবহার করছে।

প্রথম প্রচেষ্টা

আমার প্রথম ধারণাটি হ'ল একটি হুককে হুক হিসাবে বিবেচনা করে নিম্নলিখিতটি বাস্তবায়ন করা ছিল:

function HOOK_field_formatter_view( $entity_type, $entity, $field ... ){
  switch ($display['type']) {
    case 'node_reference_node':
      /* Programatical logic here to modfy field render settings */
    break;
  }
}

স্পষ্টতই আমার মডিউলটির নামের জন্য হুক এক্সচেঞ্জ করা।

উপরের মূল ফাংশনটির আগে বা পরে আগুন লাগবে কিনা তা আসলেই কিছু যায় আসে node_reference_field_formatter_viewনা node_reference.moduleকারণ আমি হয় এর ফলাফলকে পুরোপুরি ওভাররাইড করব বা আশা করি, রেন্ডারিংয়ের আগে এর মানগুলি সংশোধন করব। কেবলমাত্র সমস্যাটি হ'ল, উপরের হুকটি কেবলমাত্র একটি মডিউল ভিত্তিতে কাজ করে - যেমন এটি সাইট-প্রশস্ত নয়, তাই মূলত এটি আমার মডিউলটির জন্য আগুন দেয় না।

এখন স্পষ্টতই আমি রেন্ডার নোড আউটপুট করতে আমার নিজের ফিল্ড ফর্ম্যাটরটি লিখতে পারি। এটি ইতিমধ্যে একটি বিদ্যমান যা বিবেচনা করে কিছুটা বর্জ্য মনে হচ্ছে।

অন্যান্য পদ্ধতি

আমার অন্যান্য পদ্ধতিগুলি হয়েছে HOOK_preprocess_nodeএবং HOOK_preprocess_fieldতবে আগেরটিতে কোনও view_modeতথ্য নেই, এবং পরবর্তীটিতে কমপক্ষে 5 টি বিভিন্ন জটিল কাঠামো রয়েছে view_modeযাগুলির সমস্ত স্তরের বিভিন্ন স্তরের একটি সম্পত্তির উল্লেখ রয়েছে - এবং এটির প্রতিটি পরিবর্তন করতে হবে বলে মনে হয় হ্যাকি মান। এমনকি আমি যখন কিছু view_modeবৈশিষ্ট্য পরিবর্তন করেছি তখন ফলস্বরূপ চিত্রটি বদলাবে না।

প্রশ্ন

ফিল্ড ফর্ম্যাটরটি (একটি অবদানের মডিউল) রেন্ডার করার আগে পদক্ষেপ নেওয়ার এবং প্রতি পৃষ্ঠার অনুরোধের ভিত্তিতে এর সেটিংস পরিবর্তন করার জন্য - বা প্রকৃত সামগ্রীর ধরণের স্থায়ী ভিউ মোড সেটিংস পরিবর্তন না করে কী কেউ পরিষ্কার উপায় জানেন?


2
আমি hook_field_formatter_view_alter()সম্ভবত এক বছর ধরে একটি বা এর অনুরূপ সন্ধান করছি, দুর্ভাগ্যক্রমে এটির অস্তিত্ব নেই। অবগতির জন্য hook_preprocess_node()স্পষ্টভাবে নেই আছে view_modeএটি পাওয়া যায়, এটা এর $vars['view_mode']না $vars['node']->view_modeআপনি চেষ্টা করতে প্রলুব্ধ হয়েছে হতে পারে।
ক্লাইভ

তথ্য, ওহ এবং ইশারা জন্য @Clive ধন্যবাদ view_modeউপর hook_preprocess_node, বোকা আমাকে! আমি ভাবছি hook_field_formatter_view_alter()ডি 8-তে এর মতো কোনও কিছুর উপস্থিতি রয়েছে ...
পেব্বল

আমি এখনও কিছু দেখিনি ... তবে তারপরে সবকিছু ডি 8-এ প্লাগইনগুলিতে রূপান্তরিত হচ্ছে (আমি ক্ষেত্র সম্পর্কে নিশ্চিত নই) তাই এটি হতে পারে যে আপনি কাজটি করার জন্য কোনও বিদ্যমান শ্রেণিকে ওভাররাইড করতে পারেন, এটি আদর্শ হবে । এখানে আশা!
ক্লাইভ

1
@ ক্লাইভ, আপনি কি D7 এর জন্য এখানে বর্ণিত আপনার যাদু পরিবর্তনের হুক পেয়েছেন?
tyler.frankenstein

উত্তর:


11

প্রশ্নটিতে উল্লেখ করা হয়েছে যে hook_field_formatter_view()কেবল উত্সপ্রাপ্ত মডিউলটিতে ডাকা হয় তবে আপনি ক্ষেত্র বিন্যাসের মাধ্যমে মালিকানা নিতে পারেন hook_field_formatter_info_alter()

আপনার moduleএই ফর্ম্যাটরের কীটি মাইমডুডলের মতো সেট করতে সক্ষম হওয়া উচিত :

function MYMODULE_field_formatter_info_alter(&$info) {
  $info['some_field_formatter']['module'] = 'MYMODULE';
}

তারপরে আপনি প্রয়োগ করতে পারবেন MYMODULE_field_formatter_view(), বিদ্যমান মডিউলটি optionচ্ছিকভাবে খাওয়ানো যা এটির পরিবর্তিত করতে কোনও উপাদানকে পরিচালনা করে।

function MYMODULE_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
  // Your custom logic
  $element = OTHER_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display);
  // Any alterations
}

আপনি কি নিজের উত্তরে বিস্তারিত বলতে পারবেন? কিছু কোড সরবরাহ করবেন?
স্কট জৌদ্রি

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

1
@ স্কটজৌদ্রি just কেবলমাত্র লক্ষণীয় যে আপনি যদি এইভাবে দায়িত্ব গ্রহণ করেন তবে আপনাকে field_formatterনোড_রেফারেন্সের সমস্ত কার্যকারিতার জন্য পদ্ধতিগুলি নিশ্চিত করতে হবে MYMODULE_field_formatter_settings_summaryএবং MYMODULE_field_formatter_settings_form(যদিও তারা মূল মডিউলে কেবলমাত্র প্রক্সি ফাংশন রয়েছে) অন্যথায় ব্যাক- শেষ ইউআই কোনও ডিসপ্লে মোড প্যানেলগুলিতে বিরতি দেয়, যখন এটি ভুল মডিউলটিতে এই পদ্ধতিগুলি সন্ধান করার চেষ্টা করেছিল।
পেব্লিল

গ্রাহাম সি এর পদ্ধতির আকর্ষণীয়, তবে অনেকগুলি ওভাররাইডের প্রয়োজন।
দুধভস্কি

2

ঠিক আছে, তাই আমি আমার পরিবর্তনগুলি কেন উপলব্ধি #view_modeপারেন মধ্যে hook_preprocess_nodeএবং hook_preprocess_fieldsকাজ করা হয় নি। (যে ইশারা আমি সম্পূর্ণই উপস্থিতিতে হাতছাড়া হয়ে গেলো জন্য ক্লাইভের ধন্যবাদ #view_modeমধ্যে hook_preprocess_node)

আমার সমস্যাটি #view_modeইতিমধ্যে প্রক্রিয়াভুক্ত হয়ে এবং সঠিক #image_styleসম্পত্তিতে রূপান্তরিত হয়েছিল - এমন কিছু যা আমার সন্ধানে অবহেলা ছিল from

তবুও, এই মানটি পরিবর্তন করা খুব বেশি নির্ভরশীল বলে মনে হয় যে আপনি এটিতে কীভাবে সংশোধন করেছেন। আমি অবশেষে কিছু কোড পেয়েছি যদিও এটি আসলে রেন্ডার ইমেজের পরিবর্তন করে:

function HOOK_preprocess_field( &$vars ){
  $element     = &$vars['element'];
  $entity_type = !empty($element['#entity_type']) ? $element['#entity_type'] : 'unknown';
  $bundle      = !empty($element['#bundle'])      ? $element['#bundle']      : 'unknown';
  $view_mode   = !empty($element['#view_mode'])   ? $element['#view_mode']   : 'unknown';
  $field_name  = !empty($element['#field_name'])  ? $element['#field_name']  : 'unknown';
  switch ( "$entity_type:$view_mode:$bundle/$field_name" ) {
    case 'node:full:mlandingpage/field_lead_image':
      if ( !empty($vars['items']) && 
           ($subelement = &$vars['items'][0]) ) {
        if ( !empty($subelement['field_image']) && 
             ($subfield = &$subelement['field_image'][0]) ) {
          /// this needs to be set to the image_style value, not the view_mode value.
          $subfield['#image_style'] = 'grid-normal-4-cols';
        }
      }
    break;
  }
}

উপরেরটি এখনও খুব স্পষ্ট অনুভব করে না, তবে কমপক্ষে এটি কার্যকর হয়। ক্লাইভের এই কথাটি আমি গ্রহণ করব যে মাঠের বিন্যাসগুলির জন্য এই জাতীয় তালিকার কোনও ব্যবস্থা নেই - এটি লজ্জার বিষয়, ফর্ম্যাটরগুলি ডি 7 এর একটি অত্যন্ত শক্তিশালী বৈশিষ্ট্য, আরও বর্ধন করার ক্ষমতা রাখলে ভাল লাগবে।

যাইহোক, ভবিষ্যতের কোনও লোকের যদি আরও ভাল ধারণা থাকে তবে উত্তর দিন :)


0

প্যানেলাইজারটি ব্যবহার করা সবচেয়ে সহজ পদ্ধতির ।

যদি প্যানেলাইজার ব্যবহার না করে তবে ডিফল্ট ড্রুপাল ভিউ মোড বা ডিসপ্লে স্যুট না ব্যবহার করেন তবে হুক_ফিল্ড_ডিসপ্লে_ল্টার () বা হুক_ফিল্ড_ডিসপ্লে_এনটিটি_ওয়াইপি_ল্টার () ব্যবহার করে দেখুন

আপনার সত্তা, প্রদর্শনের প্রসঙ্গে পাশাপাশি সমস্ত ফর্ম্যাটর সেটিংস রয়েছে। এবং আপনি সহজেই ক্ষেত্র রেন্ডার সেটিংস পরিবর্তন করতে পারেন। এমনকি আপনি ফিল্ড ফর্ম্যাটরটিকে অন্য একটিতেও পরিবর্তন করতে পারেন।

পদ্ধতির আমার জন্য নিখুঁত কাজ করে। একমাত্র অসুবিধা হ'ল আপনি "পরিচালনা পরিচালনা" UI- র বিভিন্ন সেটিংসের সাথে বিভ্রান্ত হতে পারেন।


0

https://www.drupal.org/node/2130757 এটি একটি ভাল উদাহরণ দেয়। হুক_ফিল্ড_ফর্ম্যাটটার_আর্থার_পার্টি_সেটিংস_ফর্ম () বিদ্যমান ফিল্ড ফর্ম্যাটারের ফর্ম পরিবর্তন করতে দরকারী।

তবে এটি ফিল্ড গ্রুপগুলির সাথে কাজ করে না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.