hook_preprocess_page (): एक विचार पृष्ठ कैसे बताएं?


10

Im एक कस्टम मॉड्यूल लिख रहा है जिसे केवल एक दृश्य पृष्ठ में कुछ जावास्क्रिप्ट और सीएसएस फ़ाइलों को सम्मिलित करने की आवश्यकता है।

Im हुक_preprocess_page का उपयोग कर रहा हूं, लेकिन मैं यह नहीं बता सकता कि वर्तमान पृष्ठ दृश्य से है:

function mymodule_preprocess_page(&vars)
{
    var_dump($vars); //output: nothings that reference the views!
    if([view page])
    {
        drupal_add_js([...]);
        drupal_add_css([...]);
        // Rebuild scripts 
        $scripts = drupal_get_js();
        $vars['scripts'] = $scripts;
        // Same for css
    }
}

मुझे पता है कि मैं एक टेम्पलेट फ़ाइल (पेज-my_view_page_path.tpl.php) का उपयोग कर सकता हूं, लेकिन js और अतिरिक्त css को केवल तभी शामिल किया जाना चाहिए जब मेरा मॉड्यूल सक्षम हो; इसलिए मुझे यह चीजें सीधे अपने मॉड्यूल कोड के अंदर रखना पसंद है

विचार?


आप अपने मॉड्यूल में टेम्पलेट फ़ाइलों का उपयोग कर सकते हैं।
जेरेमी फ्रेंच

@ जेरेमी: अपने उत्तर को यह बताएं कि कैसे, ताकि लोग मतदान कर सकें और बहस कर सकें।
स्ट्रै

यह सीधे उत्तर से संबंधित नहीं था, केवल यह इंगित करता है कि एक tpl फ़ाइल को एक मॉड्यूल में शामिल किया जा सकता है। एक DANieL को लगता है कि यह नहीं कर सकता है।
जेरेमी फ्रेंच

अच्छी तरह से .. मैं विषय शामिल कर सकते हैं पृष्ठ .pl, लेकिन मेरा लक्ष्य इस मॉड्यूल विषय से पूरी तरह से दूर रखने के लिए है ..
स्ट्रे

आप जेरेमी फ्रेंच के जवाब में सुझाए गए अपने मॉड्यूल को पूर्व-प्रसंस्करण करके व्यूज़ टेम्प्लेट को लागू कर सकते हैं।
पियरे बाइल

जवाबों:


12

views_get_page_view()पता चलता है कि क्या, यदि कोई हो, पृष्ठ दृश्य वर्तमान में उपयोग में है। यदि यह NULL लौटाता है, तो वर्तमान पृष्ठ एक दृश्य पृष्ठ नहीं है।

लेकिन उपयोग करना drupal_add_js()और drupal_add_css()एक hook_preprocess_page()उम्मीद के मुताबिक काम नहीं करेगा क्योंकि चर $scriptऔर $styleचर पहले से ही निर्धारित किए गए हैं template_preprocess_page()। व्यू का टेम्प्लेट प्रीप्रोसेसिंग (जेरेमी फ्रेंच का जवाब देखें) शायद आपके सीएसएस और जावास्क्रिप्ट को जोड़ने के लिए बेहतर जगह है।


मैंने आपके उत्तर को दूसरे पैराग्राफ के लिए अपडेट कर दिया है - मुझे पता है कि थीम (theme_preprocess_ *) में css या js जोड़ने के लिए एक अच्छा अभ्यास है, लेकिन मेरी ज़रूरत मॉड्यूल निर्भरता है।
स्ट्रै

बहुत बढ़िया, views_get_page_view को केवल कैश से पहले से लोड किया गया दृश्य मिलता है, इसलिए इसका प्रदर्शन प्रभाव नहीं होना चाहिए। IMHO यह स्वीकृत उत्तर होना चाहिए।
marcvangend

@ मेरा सुझाव मेरा उपयोग करने के बजाय HOOK_preprocess_views_view(&$variables)या किसी अन्य दृश्य के टेम्पलेट प्रीप्रोसेस हुक का उपयोग करना था HOOK_preprocess_page(&$variables)। इस तरह आप में देखा गया प्राप्त कर सकते हैं $variablesऔर उपयोग drupal_add_js()और drupal_add_css()सुरक्षित रूप से।
बजे पियरे बाइल

11

यहां के दृश्यों के लिए प्रीप्रोसेसरों पर एक लंबा धागा है। यह टिप्पणी मुझे बहुत सरल लगती है।

function mymodule_theme_registry_alter(&$theme_registry) {
  //dpm($theme_registry);
  $theme_registry['views_view__YOUR_VIEW_NAME_HERE']['preprocess functions'][] = 'mymodule_preprocess_func';
}

// now go on and play with your new preprocess function
function mymodule_preprocess_func(&$vars) {
  // etc
}

मैं इस बात से सहमत हूं कि पूरे पृष्ठ के बजाय व्यू का आउटपुट प्रीप्रोसेस करना शायद अधिक सही दृष्टिकोण है।
गैरेट अलब्राइट

8

यदि आप एक हुक_परप्रोसेस_पेज () में हैं, तो परिभाषा के अनुसार, आपके विचार में एक पृष्ठ प्रदर्शन और एक मेनू पथ है, जो अद्वितीय होना चाहिए - ताकि आप यह कर सकें:

function mymodule_preprocess_page(&vars)
{
    var_dump($vars); //output: nothings that reference the views!
    if($_GET['q'] == 'my/view/path')
    {
        drupal_add_js([...]);
        drupal_add_css([...]);
    }
}

यदि आपके पास इस पृष्ठ पर तर्क दिए जा रहे हैं, तो आपको इसके कुछ हिस्सों की आवश्यकता है $_GET['q'], तो ड्रुपल के arg()कार्य के बजाय ऐसा करें :

if(arg(0) == 'my' && arg(1) == 'view' && arg(2) == 'path')

http://api.drupal.org/api/drupal/includes--bootstrap.inc/function/arg


मैं $ _GET ['q'] की जाँच करने की सिफारिश नहीं करूँगा। का प्रयोग करें menu_get_item () या menu_get_object () के बजाय। यदि आप वर्तमान पृष्ठ का निरीक्षण कर रहे हैं, तो न तो एक तर्क की आवश्यकता है, और वे दोनों अपने परिणामों को कैश करते हैं।
मिकी पी

Drupal_add_js () और drupal_add_css () का उपयोग हुक_परप्रोसेस_पेज () में अपेक्षित रूप से काम नहीं करेगा क्योंकि चर $ स्क्रिप्ट और $ शैली चर को पहले से ही template_sproprocess_page () द्वारा निर्धारित किया गया है। वर्तमान पृष्ठ (यदि कोई हो) के लिए दृश्य को पुनः प्राप्त करने के लिए उपयोगकर्ता के विचार_गेट_पेज_व्यू ()।
पियरे बाइल

3

मेरे लिए यह एक काम करता है:

function MYMODULE_preprocess_page(&$vars) {
  $view = (array)views_get_page_view();
  if (!empty($view)) {
    // do stuff
  }
}

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