दृश्य 3 और उपश्रेणियाँ?


12

मुझे एक ऐसा दृश्य मिला है जो एक ऐसी क्वेरी उत्पन्न करता है जो कई जोड़ देता है। यह एक कार्टेज़ियन जॉइन का उत्पादन करता है, और मुझे सबवेरीज़ में शामिल होने के लिए "कन्वर्ट" करने की आवश्यकता है।

मैंने दस्तावेज़ीकरण, Google खोज परिणामों और अन्य स्रोतों के माध्यम से देखा है, लेकिन मैं किसी भी सभ्य विवरण को खोजने में असमर्थ हूं कि मैं कैसे उप-विषयों को करने के लिए दृश्य कॉन्फ़िगर कर सकता हूं। मैंने रिश्तों को कॉन्फ़िगर करने के लिए hook_views_data () का उपयोग किया है (जो अब जुड़ाव के रूप में किए गए हैं)। क्या यह किसी तरह से उप-श्रेणियों को हुक_ब्यूस_डेटा () के माध्यम से परिभाषित करना संभव है, या क्या मुझे एक और दृष्टिकोण लेने की आवश्यकता है?

किसी भी सलाह की सराहना की!

जवाबों:


5

मैंने आगे देखा, लेकिन वास्तव में यह वर्णन करने वाला कोई भी दस्तावेज नहीं मिला।

मुझे जिन चीज़ों की ज़रूरत थी, वह उपयोगकर्ताओं के लिए डेटा रखने वाली दो अन्य तालिकाओं के साथ उपयोगकर्ताओं की तालिका में शामिल होने का एक तरीका था। हालांकि, दो अन्य तालिकाएं उपयोगकर्ता तालिका के साथ 'एक-से-कई' संबंध में हैं, जिसका अर्थ है कि मैं कार्टेशियन के साथ समाप्त हो जाऊंगा यदि मैं एक ही समय में इन दोनों तालिकाओं के साथ उपयोगकर्ता तालिका में शामिल होने का प्रयास करता हूं। । हालाँकि, चूंकि मुझे किसी भी उपयोगकर्ता के साथ जुड़े दो अन्य तालिकाओं में रिकॉर्ड की संख्या की गणना करने की आवश्यकता है, इसलिए एक सबक्वेरी को चाल करने में सक्षम होना चाहिए। हालाँकि, मैं दृश्य और उपश्रेणियों पर कोई दस्तावेज़ नहीं ढूँढ सका - इसलिए यहाँ मैंने क्या किया।

  1. दो डमी फ़ील्ड बनाए

मैंने हुक_व्यू_डेटा () के माध्यम से दो डमी फ़ील्ड (जिसे मैं 'डाउनलोड' और 'सुनता हूं') बनाया था। क्षेत्र की परिभाषा नीचे सूचीबद्ध है।

function hook_views_data() {

  $data['users'] = array(
    'downloads' => array(
      'title' => t('Downloads'),
      'field' => array(
        'handler' => 'views_handler_field_numeric',
        'click sortable' => TRUE,
      ),
      'filter' => array(
        'handler' => 'views_handler_filter_numeric',
      ),
      'sort' => array(
        'handler' => 'views_handler_sort',
      ),
    ),
    'listens' => array(
      'title' => t('Listens'),
      'field' => array(
        'handler' => 'views_handler_field_numeric',
        'click sortable' => TRUE,
      ),
      'filter' => array(
        'handler' => 'views_handler_filter_numeric',
      ),
      'sort' => array(
        'handler' => 'views_handler_sort',
      ),
    )
  ),
);

अब, जब आप उपयोगकर्ताओं के लिए एक दृश्य कॉन्फ़िगर करते हैं, तो फ़ील्ड 'डाउनलोड' और 'लिस्टेंस' दिखाई देंगे। हालाँकि, अब एक क्वेरी चलाने का प्रयास करने के परिणामस्वरूप सभी डमी फ़ील्ड के बाद डमी फ़ील्ड के रूप में एक त्रुटि होगी। वे मौजूद नहीं हैं। इन क्षेत्रों का एकमात्र उद्देश्य हुक_ साक्षात्कार_क्लेरी_ल्टर () के हमारे कार्यान्वयन के लिए संकेत देना है कि इसे कुछ प्रतिस्थापन करने की आवश्यकता है।

  1. हुक_ साक्षात्कार_क्लेरी_ल्टर लागू करें ()

यहाँ दिए गए प्रश्न को हटाने के लिए ट्रिक में 'डाउनलोड' या 'लिस्टेंस' फ़ील्ड शामिल हैं। यदि ऐसा होता है, तो हम फ़ील्ड को क्वेरी से हटा देंगे और उन्हें सबक्वेरीज़ से बदल देंगे। इस फ़ंक्शन का कार्यान्वयन नीचे के रूप में होता है।

function mta_views_query_alter(&$view, &$query) {

  foreach ($query->fields as $field_key => &$field_values) {
    if ($field_values['table'] == 'users') {

      switch ($field_values['field']) {
        case 'downloads':
          unset($query->fields[$field_key]);
          $query->add_field(null, "(SELECT COUNT(*) FROM {fileusage} fu WHERE fu.externaluser = {users}.uid AND fu.action = 0)", $field_key);
          break;
        case 'listens':
          unset($query->fields[$field_key]);
          $query->add_field(null, "(SELECT COUNT(*) FROM {fileusage} fu WHERE fu.externaluser = {users}.uid AND fu.action = 1)", $field_key);
          break;
      }
    }
  }
}

ध्यान दें कि हम उप-क्षेत्र के लिए हटाए गए फ़ील्ड के उपनाम का पुनः उपयोग कर रहे हैं। इस तरह, व्यूज़ सोचेंगे कि वास्तव में सबक्वेरी से लौटाया गया मूल्य डमी क्षेत्र से आता है (जो सब मौजूद नहीं है)।

यानी कि। हम कार्टेसियन में शामिल नहीं हो रहे हैं और 'डाउनलोड' और 'सुने' दोनों को सही ढंग से गिना जाता है।


4

जब तक मुझे सबक्विरी इनहेरिट फिल्टर वैल्यूज़ की आवश्यकता होती है, तब तक मैंने स्राबटला के घोल का उपयोग किया। अब मैं एक अलग दृश्य एम्बेड करने के लिए view_field_view मॉड्यूल का उपयोग करता हूं जो गिनती क्वेरी करता है। मैं view_filterfield मॉड्यूल (जो मैंने लिखा था) के माध्यम से उस फ़िल्टर किए गए दृश्य को संदर्भ फ़िल्टर मान पास कर सकता हूं जो फ़िल्टर मान को फ़ील्ड (और इस प्रकार टोकन) के रूप में उपलब्ध कराता है।

गणना क्वेरी अब काम करती है और मुख्य क्वेरी पर उजागर फ़िल्टर विरासत में मिलती है।

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