मैं किसी दृश्य के लिए जावास्क्रिप्ट विशिष्ट कैसे जोड़ सकता हूँ?


26

मेरी साइट में एक दृश्य है जिसमें एक विशिष्ट वर्ग का नाम है। मैं जानना चाहता हूं कि किसी थीम के टेम्पलेट.फैप फ़ाइल के अंदर, मैं कैसे जान सकता हूं कि क्या अनुरोधित पृष्ठ में विशिष्ट वर्ग नाम वाला कोई दृश्य उपलब्ध है।

यह मेरे लिए बहुत महत्वपूर्ण है क्योंकि मुझे विशिष्ट जावास्क्रिप्ट और सीएसएस को शामिल करने की आवश्यकता है, जब एक पृष्ठ में एक विशिष्ट वर्ग नाम (जैसे छवि-गैलरी) के साथ एक दृश्य का उपयोग किया जाता है।

जवाबों:


40

आप ऐसा करने के लिए template_preprocess_views_view()हुक का उपयोग कर सकते हैं :

function THEME_preprocess_views_view(&$vars) {
  $view = &$vars['view'];
  // Make sure it's the correct view
  if ($view->name == 'your-view-name') {
    // add needed javascript
    drupal_add_js(drupal_get_path('theme', 'your-theme') . '/your-js.js');
    // add needed stylesheet
    drupal_add_css(drupal_get_path('theme', 'your-theme') . '/your-css.css');
  }
}

ध्यान दें कि आप उपयोग करने वाले दृश्य के विशिष्ट प्रदर्शन की जांच कर सकते हैं:

if ($view->name == 'your-view-name' && $view->current_display == 'your-display-id') {
  // include javascript & css here
}

आप इस तरह एक कस्टम सीएसएस वर्ग के लिए जाँच करने में सक्षम होना चाहिए:

if ($view->name == 'your-view-name' && $view->display[$view->current_display]->display_options['css_class'] == 'your-css-class') {
   // include javascript & css here
}

बहुत बहुत धन्यवाद, लेकिन यह फ़ंक्शन नाम से दृश्य को पहचानता है, मैं कक्षा के नाम को पहचानना चाहता हूं, क्योंकि एक पृष्ठ में कई विचार हैं जिनका समान वर्ग नाम है। उदाहरण के लिए 2 विचारों में 'गैलरी-इमेज' वर्ग का नाम है और 3 विचारों में 'लाइट-बॉक्स' श्रेणी का नाम है। मैं उदाहरण के लिए js जोड़ना चाहता हूं यदि पृष्ठ में 'light-box' css वर्ग नाम वाला दृश्य उपलब्ध है।
मेहरदाद २०

क्या आप केवल प्रदर्शन की जांच नहीं कर सकते? if($view->name == 'your-view-name' && $view->display_id == 'your-display-id')
साइक्लोनोस्कोप

नहीं, क्योंकि यह स्पष्ट नहीं है कि पृष्ठ में कितने दृश्य उपलब्ध हैं। हो सकता है कि 10 बार देखा गया हो कि उन सभी का नाम समान श्रेणी का है।
मेहरदाद २०

मैंने इस हुक को लागू किया और सभी कैश को फ्लश कर दिया - लेकिन इसे कॉल नहीं किया गया। यकीन नहीं है कि क्यों। हां मैंने नाम को डबल-चेक किया।
jdhildeb

यह बहुत अजीब लगता है? आपने अपने वास्तविक विषय के नाम से उन्हें बदल दिया है? जब तक आप इसे सही तरीके से लागू करते हैं, तब तक यह ठीक काम करना चाहिए।
साइक्लोनोस्कोप

8

पृष्ठ पर कौन सा दृश्य परोसा जा रहा है, यह जानने के लिए आप view_get_page_view फ़ंक्शन का उपयोग कर सकते हैं। यह विचार वस्तु लौटाता है। ध्यान दें कि नीचे दिए गए कोड स्निपेट में आपको विचारों की मशीन पठनीय नाम से तुलना करनी चाहिए, लेकिन निश्चित रूप से आप view_get_page_view द्वारा दिए गए दृश्य ऑब्जेक्ट पर अपनी तुलनात्मक आधार लिख सकते हैं

function YOURTHEMENAME_preprocess_page(&$variables) {
    $view = views_get_page_view();
    if($view->name == 'YOURVIEW') {
    //Do what ever you want 
    }

6

बस इस मामले में किसी और के लिए उपयोगी है, इस सवाल को ठोकर मारता है, जैसे कि मैंने जावास्क्रिप्ट को एक ड्रुपल व्यू में संलग्न करने के लिए किया था । D7 और दृश्य 3.7 के संदर्भ में, निम्नलिखित ने मेरे लिए सबसे अच्छा काम किया:

function HOOK_views_pre_render ( &$view ) { 
  /// check to make sure the view has a classname
  if ( $view->display_handler && !empty($view->display_handler->options['css_class']) ) {
    $cln = $view->display_handler->options['css_class'];
    $cls = 'CLASS GOES HERE';
    /// test that the classname contains our class
    if ( preg_match('/(^|\s+)' . preg_quote($cls) . '(\s+|$)/i', $cln) ) {
      /// build the path to the js, which is local to my module, js/view.js
      $sep = DIRECTORY_SEPARATOR;
      $dir = rtrim(drupal_get_path('module', 'HOOK'), $sep);
      $pth = "{$dir}{$sep}js{$sep}view.js";
      drupal_add_js($pth);
    }
  }
}

यह फायदेमंद था क्योंकि मैं थीम के बजाय अपने मॉड्यूल के भीतर कोड रखना चाहता था - क्योंकि जावास्क्रिप्ट द्वारा लाई गई एन्हांसमेंट का दृश्य उपस्थिति से कोई लेना-देना नहीं था।

नोट: स्पष्ट रूप HOOKसे आपके मॉड्यूल नाम के साथ दोनों स्थानों पर CLASS GOES HEREप्रतिस्थापित किया जाना चाहिए , और उस वर्ग के साथ भी प्रतिस्थापित किया जाना चाहिए जिसे आप खोज रहे हैं।


स्पष्टता के लिए, pre_render pre_process से बेहतर क्यों था?
निक

@ निक ~ ~ HOOK_views_pre_process( api.drupal.org/api/views/views.api.php/7 ) ऐसा नहीं है जब तक कि आप इस कारण का उपयोग करने का कारण नहीं बता रहे हैं THEME_preprocess_views_view- किस मामले में यह केवल वरीयता के बाहर है आप अपना कोड संशोधन जोड़ना चाहते हैं। HOOK_views_pre_renderएक मॉड्यूल से आदी हो सकता है, जबकि THEME_preprocess_views_viewआपकी थीम / टेम्प्लेट फ़ाइल में जाना चाहिए। आप HOOK_views_post_renderचाहें तो उपयोग भी कर सकते हैं।
पेब्बल

क्षमा करें, मेरा मतलब था THEME_preprocess_views_view, हां ... मुझे यकीन है कि मैंने hook_preprocess_views_viewपहले भी मॉड्यूल में किया है।
निक

4

यदि आप ड्रुपल 6 या 7 पर हैं, तो आप मॉड्यूल संदर्भ जोड़ परिसंपत्तियों के साथ जावास्क्रिप्ट संपत्ति भी शामिल कर सकते हैं। जिसे संदर्भ की आवश्यकता होती है, लेकिन आप विश्वास दिलाते हैं कि यह हमेशा शामिल किया जाएगा जब दृश्य प्रदान किया जा रहा है।

https://drupal.org/project/context_addassets

मॉड्यूल के परियोजना पृष्ठ से:

क्या आपने कभी जावास्क्रिप्ट या सीएसएस को शामिल करना चाहा है जब किसी विशेष दृश्य या ब्लॉक का प्रतिपादन किया जा रहा है? या क्या आपने कभी कोड लिखने के बिना केवल फ्रंट पेज के लिए जावास्क्रिप्ट या सीएसएस को शामिल करना चाहा है?

प्रसंग जोड़ने वाली संपत्ति आपको ऐसा करने की अनुमति देती है। यह यूआई का उपयोग करने के लिए एक आसान है कि आप किसी भी कोड को लिखे बिना यह सब करने की अनुमति दें। क्योंकि यह ctools का उपयोग करता है यह सब भी निर्यात योग्य है।


2

जावास्क्रिप्ट कोड लिखें, जो jQuery के hasClass () का उपयोग करके दृश्य में विशिष्ट वर्ग की खोज करता है , और शर्त पूरी होने पर अपनी जावास्क्रिप्ट फ़ाइल को शामिल करता है।

दूसरा तरीका यह है कि आप अपने विचार के लिए एक टेम्प्लेट डाल सकते हैं, और drupal_add_js () का उपयोग करके उस कोड के माध्यम से जावास्क्रिप्ट कोड जोड़ सकते हैं ।


क्या आप मुझे बता सकते हैं, मैं यह कैसे कर सकता हूं। वास्तव में जावा स्क्रिप्ट में सशर्त अभिव्यक्ति के बाद सीएसएस और जेएस फाइलें कैसे शामिल हो सकती हैं यह सच है ??!
मेहरदाद २०

Drupal 8 के लिए, यह उत्तर बताता है कि ऐसा करने के लिए व्यू आउटपुट के लिए एक कस्टम व्यू टेम्प्लेट कैसे बनाया जाए: stackoverflow.com/a/43131240/227926
therobyouknow
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.