अन्य मॉड्यूल के क्षेत्र फॉर्मेटर में हुक?


9

वर्तमान में मेरे Drupal 7 साइट पर एक नोड संदर्भित छवि क्षेत्र को लागू करने की कोशिश कर रहा है, जो इसे बदलने से पहले प्रोग्रामेटिक लॉजिक के आधार पर 'व्यू मोड' को बदल देगा। वर्तमान में फ़ील्ड को उनके प्रदर्शन मोड सेटिंग्स के माध्यम से कई सामग्री प्रकारों पर प्रदान किया जा रहा है, जिनमें से प्रत्येक फ़ील्ड फ़ॉर्मेटर 'रेंडर नोड' का उपयोग कर रहे हैं।

पहला प्रयास

मेरा पहला विचार निम्नलिखित को लागू करना था, एक हुक है एक हुक पर विचार करना:

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;
  }
}

स्पष्ट रूप से मेरे मॉड्यूल के नाम के लिए HOOK का आदान-प्रदान करना।

यह वास्तव में बात करता है, तो ऊपर से पहले या मूल कार्य के बाद से निकाल देते थे नहीं था node_reference_field_formatter_viewमें node_reference.module, क्योंकि मैं या तो यह उत्पादन पूरी तरह से उम्मीद है कि ओवरराइड होगा या, प्रतिपादन से पहले अपने मूल्यों को संशोधित करते हैं। एकमात्र समस्या यह है, उपरोक्त हुक केवल प्रति मॉड्यूल आधार पर कार्य करता है - अर्थात यह साइट-वाइड नहीं है, इसलिए मूल रूप से यह मेरे मॉड्यूल में आग नहीं लगाता है।

अब जाहिर है कि मैं एक रेंडर नोड के आउटपुट के लिए अपना खुद का फील्ड फॉर्मेटर लिख सकता हूं। लेकिन ऐसा लगता है कि वहाँ पहले से मौजूद एक कचरे का थोड़ा सा लगता है।

अन्य दृष्टिकोण

मेरे अन्य तरीकों के लिए किया गया है HOOK_preprocess_nodeऔर HOOK_preprocess_fieldलेकिन पूर्व कुछ भी नहीं है view_modeके बारे में जानकारी, और बाद में कम से कम 5 अलग जटिल संरचनाओं कि सब एक के लिए संदर्भ है शामिल view_modeविभिन्न स्तरों पर संपत्ति - और यह में से प्रत्येक को संशोधित करने के लिए नहीं बल्कि hacky लगता है उनके मान। यहां तक ​​कि जब मैंने कुछ 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()D8 में मौजूद है ...
पेब्बल

मैंने अभी तक कुछ भी नहीं देखा है ... लेकिन फिर सब कुछ डी 8 में प्लगइन्स में परिवर्तित किया जा रहा है (मैं खेतों के बारे में निश्चित नहीं हूं) इसलिए यह हो सकता है कि आप काम करने के लिए एक मौजूदा वर्ग को ओवरराइड कर सकते हैं, यह आदर्श होगा । यहाँ उम्मीद है!
क्लाइव

1
@ क्लिक करें, क्या आपने D7 के लिए अपने जादुई परिवर्तन हुक का उल्लेख किया है?
tyler.frankenstein

जवाबों:


11

सवाल का उल्लेख है कि hook_field_formatter_view()केवल मूल मॉड्यूल पर कहा जाता है, लेकिन आप के माध्यम से क्षेत्र फ़ॉर्मेटर का स्वामित्व ले सकते हैं hook_field_formatter_info_alter()

आपको moduleफॉर्मेट की कुंजी को MYMODULE पर सेट करने में सक्षम होना चाहिए जैसे:

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

फिर आप MYMODULE_field_formatter_view()मौजूदा मॉड्यूल के माध्यम से वैकल्पिक रूप से खिला सकते हैं , जो इसे बदलने के लिए एक तत्व प्राप्त करने के लिए नियंत्रित करता है।

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
@ScottJoudry ~ केवल इस बात पर ध्यान देने योग्य हो सकता है कि यदि आप इस तरह से 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संपत्ति में बदल दिया गया था - ऐसा कुछ जिसे मैंने खोज करने के लिए उपेक्षित किया था।

फिर भी, इस मूल्य को बदलना बहुत अधिक निर्भर करता है कि आपने इसे किस हुक में संशोधित किया है। मुझे आखिरकार कुछ कोड काम करने लगे, हालांकि यह वास्तव में प्रदान किए गए परिवर्तनों को बदल देता है:

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

सबसे आसान तरीका पैनलिज़र का उपयोग करना होगा ।

यदि पैनलिज़र का उपयोग न करें, लेकिन डिफ़ॉल्ट ड्रुपल व्यू मोड या डिस्प्ले सूट, हुक_फ़ील्ड_डिसप्ले_ल्टर () या हुक_फ़ील्ड_डिसप्ले_एंटी_वाईटर_लेटर () आज़माएँ

आपके पास इकाई, प्रदर्शन संदर्भ और साथ ही सभी फॉर्मेट सेटिंग्स हैं। और आप आसानी से फ़ील्ड रेंडर सेटिंग्स बदल सकते हैं। आप फ़ील्ड फ़ॉर्मेटर को किसी भिन्न में भी बदल सकते हैं।

दृष्टिकोण मेरे लिए एकदम सही काम करता है। एकमात्र नुकसान यह है कि आप "मैनेज डिस्प्ले" यूआई में विभिन्न सेटिंग्स के साथ भ्रमित हो सकते हैं।


0

https://www.drupal.org/node/2130757 यह एक अच्छा उदाहरण देता है। हुक_फ़ील्ड_फॉर्मेटर_थर्ड_पार्टी_सेटिंग्स_फॉर्म () मौजूदा फ़ील्ड फॉर्मेटर के रूप को बदलने के लिए उपयोगी है।

लेकिन यह फील्ड समूहों के साथ काम नहीं करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.