दृश्य में कस्टम क्वेरी?


24

कुछ बिंदु पर मुझे दृश्य द्वारा उत्पन्न SQL क्वेरी को संशोधित करने की आवश्यकता मिली, अंत में मैंने views_pre_executeउस विशिष्ट दृश्य के लिए क्वेरी को ओवररोड किया और बदल दिया।

यह मुझे एक बदसूरत हैक की तरह लगता है और मुझे आश्चर्य है कि अगर ऐसा करने के लिए एक और अधिक सुरुचिपूर्ण और बनाए रखने योग्य तरीका है। आदर्श एक ऐसा तरीका होगा जो मुझे व्यू यूआई से सीधे क्वेरी को संशोधित करने की अनुमति देगा।


1
यह इस बात पर निर्भर करता है कि आप उस क्वेरी को कैसे संशोधित करना चाहते हैं। क्या आप पूरा करने की कोशिश कर रहे थे?
जेसन स्मिथ

@ जेसन मैंने उस समय एसओ को प्रश्न पोस्ट किया था: stackoverflow.com/questions/3147916/… लेकिन अब यह समस्या हल हो गई है, मुझे बस किसी भी दृश्य क्वेरी को संशोधित करने के लिए एक सुरुचिपूर्ण तरीके की तलाश है अगर मुझे करना है।
मैड साइंटिस्ट

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

यदि नीचे दिए गए उत्तरों में से कोई भी आप के लिए देख रहे हैं, तो आपको एक को स्वीकार करना चाहिए (वोट गिनती के नीचे चेक मार्क पर क्लिक करें)
चुलकी

हुक_व्यूस_पेरिसएक्सएक्स्यूट सबसे सुरुचिपूर्ण नहीं हो सकता है, लेकिन इसमें जटिल क्वेरी ओवरराइड्स के लिए अपनी जगह है (देखें ड्रुपल 7 में कस्टम दृश्य 3 प्रश्न )
mrP

जवाबों:


25

hook_views_query_alter()चलने से पहले आप क्वेरी को बदलने के लिए भी उपयोग कर सकते हैं । मुझे लगता है कि यह समान है hook_views_pre_execute, लेकिन क्वेरी को संशोधित करना आसान बनाता है। आप मूल रूप से कुंजी वाले सरणी के माध्यम से क्वेरी के प्रत्येक भाग तक पहुंच प्राप्त करते हैं। मुझे बहुत अधिक आधिकारिक दस्तावेज नहीं मिले हैं, लेकिन https://www.appnovation.com/blog/use-hook-views-query-alter पर इसका एक बहुत अच्छा उदाहरण है । यह भी कैलेंडर मॉड्यूल में एक तारीख बग को ठीक करने के लिए मुझे उपयोग करने का दृष्टिकोण है।


क्या यह दृश्य -3 के साथ भी काम करेगा?
मार्कडॉरिसन 20

@markdorison मुझे ऐसा लगता है, लेकिन इस बात की पुष्टि नहीं हुई है कि
Chaulky

3
मैंने पुष्टि की है कि यह दृश्य -3 में काम करता है।
मार्कडॉरिसन

1
@ फैबियन आपको इस उत्तर को स्वीकार करना चाहिए अगर यह आपके लिए उपयोगी था, या टिप्पणी करें कि ऐसा क्यों नहीं था तो हम इसे बेहतर बना सकते हैं
चुलकी

एक सरल कस्टम मॉड्यूल का उपयोग करके Drupal 7 में कस्टम दृश्य 3 प्रश्नों के लिए एक और उदाहरण संदर्भ hook_views_pre_execute()
एमआरपी

4

सामान्य तौर पर यह आपके उपयोग के मामले पर निर्भर करता है।

यदि आप एक फ़ील्ड / फ़िल्टर / तर्क रखना चाहते हैं जिसे एक निश्चित तरीके से व्यवहार करना चाहिए, तो इसके लिए एक हैंडलर लिखने की सिफारिश की जाती है। अधिक जानकारी के लिए विचारों की उन्नत सहायता देखें।

यदि आप क्वेरी के कुछ हिस्सों को बदलना चाहते हैं तो आप हुक_ साक्षात्कार_क्वेरी_अल्टर () का भी उपयोग कर सकते हैं । इसके बारे hook_views_query_alter()में बुरी बात यह है कि आप वास्तव में कोड का पुन: उपयोग नहीं कर सकते।

यह प्रलेखन से दिखाया गया उदाहरण कोड है। यह एक उदाहरण देता है कि हुक क्या कर सकता है।

function mymodule_views_query_alter(&$view, &$query) {
  // (Example assuming a view with an exposed filter on node title.)
  // If the input for the title filter is a positive integer, filter against
  // node ID instead of node title.
  if ($view->name == 'my_view' && is_numeric($view->exposed_raw_input['title']) && $view->exposed_raw_input['title'] > 0) {
    // Traverse through the 'where' part of the query.
    foreach ($query->where as &$condition_group) {
      foreach ($condition_group['conditions'] as &$condition) {
        // If this is the part of the query filtering on title, chang the
        // condition to filter on node ID.
        if ($condition['field'] == 'node.title') {
          $condition = array(
            'field' => 'node.nid', 
            'value' => $view->exposed_raw_input['title'], 
            'operator' => '=',
          );
        }
      }
    }
  }
}

3

मैंने hook_views_query_alter()एक दृश्य mysql क्वेरी को बदलने के लिए उपयोग किया है । निम्न उदाहरण का Drupal 7 के तहत परीक्षण किया गया है 7.x-3.0, यह ORDER BYक्वेरी में एक कस्टम क्लॉज जोड़ता है :

 function MYTHEME_views_query_alter(&$view, &$query) {
   // check so it's the correct view
   if($view->name == 'product_view') {
     // set a custom 'ORDER BY' clause in the query
     $query->orderby[0] = array(
       'field' => 'SUBSTR(taxonomy_term_data_name,3,4)',
       'direction' => 'ASC'
     );
     $query->orderby[1] = array(
       'field' => 'SUBSTR(taxonomy_term_data_name,1,2)',
       'direction' => 'ASC'
     );
   }
 }

1

मुझे नहीं पता कि आप सीधे sql को बदल सकते हैं, लेकिन आप अपने स्वयं के फ़ील्ड हैंडलर को लिख सकते हैं और अपनी खुद की क्वेरी तैयार कर सकते हैं।

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