बिना टेबल के कस्टम व्यू हैंडलर


22

यह पहली बार आसान लग रहा था, लेकिन मैं इस पर अपने बाल खो रहा हूं।

मैं बस एक कस्टम दृश्य हैंडलर जोड़ना चाहता हूं जो बिना तालिका का उपयोग करता है।

मैंने php प्रस्तावित, $ data ['views'] ['mycustomfield'] को hook_views_data में देखने के रूप में करने की कोशिश की, लेकिन फिर भी, "mycustomfield colum not found"।

कोई मदद ? धन्यवाद !

जवाबों:


26

वास्तव में यह आसान है। बस कार्यान्वयन दृश्य ग्लोबल हैंडलर देखें, जो view.views.inc में उपलब्ध है ।

नीचे एक उदाहरण दिया गया है कि आप टेबल के बिना फील्ड हैंडलर को कैसे जोड़ सकते हैं,

  1. नीचे दिए गए हुक की तरह अपने कस्टम हैंडलर को निर्दिष्ट करें ।

    /**
     * Implements hook_views_data().
     */
     function my_module_views_data() {
       $data['custom']['table']['group'] = t('Custom');
       $data['custom']['table']['join'] = array(
         // #global is a special flag which let's a table appear all the time.
         '#global' => array(),
       );
    
       $data['custom']['custom_handler'] = array(
         'title' => t('Custom Handler'),
         'help' => t('Custom Handler.'),
         'field' => array(
           'handler' => 'views_handler_custom_handler',
         ),
       );
    
       return $data;
    }
  2. अपने हैंडलर के लिए एक इंक फ़ाइल बनाएँ, अपना तर्क वहाँ रखें। नीचे कुछ इस तरह है कि फ़ाइल का नाम view_handler_custom_handler.inc होगा

    /**
     * A handler to provide a field that is completely custom by the administrator.
     *
     * @ingroup views_field_handlers
     */
     class views_handler_custom_handler extends views_handler_field {
       function query() {
         // do nothing -- to override the parent query.
       }
    
       function option_definition() {
         $options = parent::option_definition();
    
         // Override the alter text option to always alter the text.
         $options['alter']['contains']['alter_text'] = array('default' => TRUE);
         return $options;
       }
    
       function options_form(&$form, &$form_state) {
         parent::options_form($form, $form_state);
    
         // Remove the checkbox
         unset($form['alter']['alter_text']);
         unset($form['alter']['text']['#dependency']);
         unset($form['alter']['text']['#process']);
       }
    
       function render($values) {
         // Render your content.
         return 'Sample';
       }
    }
  3. अपने मॉड्यूल की जानकारी फ़ाइल में इस नए हैंडलर फ़ाइल को निर्दिष्ट करें

  4. कैश साफ़ करें

अब नए फील्ड हैंडलर फील्ड लिस्ट में होंगे।


1
धन्यवाद ! वास्तव में मुझे जिन 2 चीजों की आवश्यकता थी: क्वेरी को खाली बताकर ओवरराइड करें, और '#global' में शामिल हों।
ग्रेगरी कपुस्टिन

क्या इन परिणामों पर फ़िल्टर करने का कोई तरीका है? उदाहरण के लिए, मैंने एक इकाई के लिए उपयोगकर्ता के संबंधों के आधार पर एक विशेष "स्थिति" की गणना के लिए एक कस्टम फील्ड हैंडलर बनाया है। मैं उस स्थिति के माध्यम से फ़िल्टर करने में सक्षम होना चाहता हूं। कोई विचार?
टिग्रट्रससेल

धन्यवाद, यही मुझे चाहिए था! लेकिन ऐसा लगता है कि मैं इस तरह एक क्षेत्र हैंडलर के लिए विचारों को सक्षम नहीं कर सकता। drupal.stackexchange.com/questions/166734/… कोई विचार?
18-22 को

1

पूर्ण होने के लिए: आपको हुक_व्यू__ भी जोड़ना होगा

function my_module_views_api() {
  return array(
    'api' => 3,
    'path' => drupal_get_path('module', 'my_module'),
  );
}

1
पूर्ण होने के लिए: आपको .info फ़ाइल फ़ाइलों में हैंडलर शामिल करना होगा [] = views_handler_custom_handler.inc
फाववाड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.