दृश्य 3 उजागर फ़िल्टर को प्रोग्रामेटिक रूप से हटा दें


9

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

उदाहरण के लिए, हमें दो श्रेणियां मिली हैं: cues और बिलियर्ड बॉल्स।

Cues में मूल्य, मूल्य से और लकड़ी के प्रकार के फिल्टर हैं। लेकिन गेंदों में कोई लकड़ी का प्रकार नहीं होता है।

इसलिए मुझे लकड़ी के प्रकार के फिल्टर को हटाने की जरूरत है अगर टैक्सोनॉमी_टर्म ने बिलियर्ड गेंदों की शब्दावली का उल्लेख किया है।

इस प्रकार, मुझे कई उजागर फिल्टर को प्रोग्रामेटिक रूप से हटाने की आवश्यकता है।

function modulename_views_pre_view(&$view, &$display_id, &$args) {
  // Some custom logic wich field_info_instances checking ...
  $filter_field = 'filter_id';
  // Removes from everywhere where i can find filter or filters properties
  unset($view->display[$view->current_display]->display_options['filters'][$filter_field]);
  unset($view->display[$view->current_display]->handler->options['filters'][$filter_field]);
  unset($view->display_handler->display->display_options['filters'][$filter_field]);
  unset($view->display_handler->options['filters'][$filter_field]);
}

फ़िल्टर फ़ील्ड सफलतापूर्वक निकालता है, लेकिन मुझे php नोटिस मिला है:

  Notice: Undefined index: field_wood_reference_tid in function views_handler_filter_term_node_tid->exposed_validate()

इसके अलावा मैं hook_pre_execute () में फ़ील्ड निकालने की कोशिश करता हूं, लेकिन उसी परिणाम के साथ:

function modulename_views_pre_execute(&$view) {
  $filter_field = 'filter_id';
  unset($view->display_handler->handlers['filter'][$filter_field]);
  unset($view->filter[$filter_field]);
}

ओवरराइड_ओपेशन () विधि की तरह यहां भी प्रयास करें - http://groups.drupal.org/node/82219 , लेकिन इसका कोई परिणाम नहीं है।

कोई सुझाव? Pls मदद =)


उत्तर के लिए सभी को धन्यवाद, लेकिन मेरे पास अभी भी कोई जवाब नहीं है। शायद कुछ स्पष्ट नहीं है? = (


क्या आपने hook_views_pre_render () की कोशिश की है ? आप jQuery के साथ चयन के आधार पर प्रासंगिक फ़िल्टर दिखा / छिपा सकते हैं।
एनिफर

नमस्ते, मैं समझता हूं कि आपका समाधान ठीक काम करता है, लेकिन सही तरीका नहीं है । तो मैं इसे सीएसएस-शर्तों का उपयोग करके भी छिपा सकता हूं ... समझाने की कोशिश कर रहा हूं। हर तरह का कोड होना चाहिए जहां यह होना चाहिए। इस समस्या के लिए अगर मैं उजागर फ़िल्टर पूर्व या रेंडर के बाद, विचार अभी भी इसे संसाधित करता है। और अगर मैं क्वेरी स्ट्रिंग जोड़ने की कोशिश करता हूं, तो जैसे ?filter_id=val, दृश्य खाली प्रदर्शन या अवैध पसंद त्रुटि देता है ...
ओलेग शेरबाकोव

क्या आपने मेरा जवाब आजमाया है?
मथानकुमार

मुझे फॉर्म को बदलने की आवश्यकता नहीं है (मुझे पता है कि आपका वेरिएंट काम करता है), मैं आपके परिणाम के समान ऑब्जेक्ट को संशोधित करना चाहता हूं, लेकिन फॉर्म के निर्माण से पहले।
ओलेग शेरबाकोव

जवाबों:



1

यहाँ परीक्षण किया गया स्निपेट है, जो आपको स्कॉट थॉमस द्वारा उल्लिखित फ़ॉर्म परिवर्तन का उपयोग करके एक्सपोज़ किए गए विचारों से फ़िल्टर हटाने की अनुमति देगा,

/**
 *Implements hook_form_FORM_ID_alter().
 */
function hook_form_views_exposed_form_alter(&$form, &$form_state) {
  $filter_field = 'filter_id';
  // Get the filters list for the current view. Here page_1 is the display ID.
  $filters = $form_state['view']->get_items('filter', 'page_1');
  if (isset($filters[$filter_field])) {
    $info_key = 'filter-' . $filter_field;
    unset($form[$filter_field], $form['#info'][$info_key]);
  }     
}

प्रपत्र फ़ील्ड को निकालने के अलावा आपको विशेष फ़िल्टर के लिए जानकारी को निकालने की भी आवश्यकता है जो $ फॉर्म ['# जानकारी'] में उपलब्ध है, ताकि यह लेबल को भी हटा दे। यदि आप अकेले फॉर्म एलिमेंट को हटाते हैं, तो फिल्ड लेबल को हटा दिया जाएगा भले ही फ़ील्ड हटा दिया जाए, इसलिए हमेशा सुनिश्चित करें कि आप इस जानकारी को भी हटा रहे हैं।

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

if ($form_state['view']->name == 'view_name') {
  // DO your operation.
}

यहां $ form_state ['view'] आपको वर्तमान दृश्य ऑब्जेक्ट देगा जो संसाधित किया जा रहा है।

उम्मीद है की यह मदद करेगा।


यह एकमात्र समाधान था जो लेबल के साथ-साथ मेरे लिए फ़ील्ड विजेट्स को छुपाता था, और यह एक ब्लॉक में एक उजागर फिल्टर रूप में काम करता था।
xenophyle

1

नीचे दिए गए चरणों का पालन करें

  1. सबसे पहले एक कस्टम मॉड्यूल में एक hook_form_alter लिखें
  2. अगला कोड के निम्नलिखित टुकड़े का प्रयास करें

    सेट नहीं ($ प्रपत्र [ '# की जानकारी'] [ 'your_field_name']); $ फॉर्म ['your_field_name'] ['# एक्सेस ’] =’ FALSE ’;

उम्मीद है की वो मदद करदे।


1

आप टेम्पलेट फ़ाइल के साथ-साथ एक्सपोज़र फ़िल्टर को भी हटा सकते हैं।

इस कमांड का उपयोग करें:

cp sites/all/modules/contrib/views/theme/views-view.tpl.php sites/all/themes/costa/templates/views/views-view--<machine_name>.tpl.php

टेम्पलेट फ़ाइल में यह कोड खोजें:

  <?php if ($exposed): ?>
    <div class="view-filters">
      <?php print $exposed; ?>
    </div>
  <?php endif; ?>

और इसे हटा दें। आपका उजागर फ़िल्टर प्रदर्शन से हटा दिया जाएगा, लेकिन आप URL में उचित तर्क पास करने का काम करते रहेंगे।


जवाब के लिए Thx, लेकिन मैं D8 का इंतजार कर रहा हूं जो उजागर फिल्टर के निर्माण के लिए कोर फॉर्म एपी का उपयोग करता है :)
ओलेग शेरबाकोव

0

अगर मैं गलत हूं तो मुझे सुधारें क्योंकि मुझे आपकी समस्या पूरी तरह से समझ में नहीं आ रही है। तो आप एक एक्सपोज़्ड फ़िल्टर को दूसरे एक्सपोज़्ड फ़िल्टर के मूल्य के आधार पर एक दृश्य में छिपाना चाहेंगे? यदि ऐसा है तो आप व्यू डिपेंडेंट फिल्टर मॉड्यूल आज़मा सकते हैं । मैंने कई बार इसका इस्तेमाल किया और यह काम करता है।

आप इस मॉड्यूल के बारे में हमारे पैराग्राफ लोलाबोट की समीक्षा देख सकते हैं ।

यदि आपको वास्तव में इसे कोड में करने की आवश्यकता है तो उजागर विकल्प काम करना चाहिए: फ़िल्टर [$ filter_id] -> विकल्प ['उजागर'] = FALSE;


यदि मौजूदा सामग्री प्रकार में यह (फ़िल्टर्ड) फ़ील्ड नहीं है, तो मैं उजागर फ़िल्टर को छिपाना चाहूंगा। अपने टुकड़ा कोशिश कर रहा है $view->display_handler->handlers['filter'][$filter_field]->options['exposed'] = FALSE;मैं गंभीर त्रुटि है - PHP Fatal error: Call to undefined method stdClass::access() in .../view.inc on line 766। मुझे लगता है कि इसका सही व्यवहार है क्योंकि यदि फ़िल्टर उजागर नहीं होता है, तो इसे डिफ़ॉल्ट मान भी आवश्यक है। कोई विचार?
ओलेग शेरबाकोव

pastebin.com/f1FKgUde यहां मेरा कोड है, शायद यह मेरे अंग्रेजी से अधिक स्पष्ट होगा
ओलेग शेरबाकोव

0

निम्नलिखित ने इसे मेरे अंदर hook_form_alter के लिए किया:

$info_key = 'filter-' . $fieldName;
unset($form[$fieldName], $form['#info'][$info_key], $form_state['view']->display_handler->options['filters'][$fieldName], $form_state['view']->display_handler->handlers['filter'][$fieldName], $form_state['view']->filter[$fieldName]);

0

विधि 1

हुक_ साक्षात्कार_क्वेरी_ल्टर () का उपयोग करके। निम्नलिखित उदाहरण देखें:

<?php
/**
 * Implements hook_views_query_alter().
 */
function foo_views_query_alter(&$view, &$query) {

  if ($view->name == 'foo_view') {

    // Allow any distance when the postcode it is not specified.
    if (empty($_GET['postcode']['postal_code']) || $_GET['postcode']['postal_code'] === 'All') { 
      // Scan through the query.
      foreach ($query->where as $condition_group_key => &$condition_group) {
        foreach ($condition_group['conditions'] as $condition_key => &$condition) {
          $search_name = '(COALESCE(ACOS(';
          if (is_string($condition['field']) && strstr($condition['field'], $search_name) !== FALSE) {
            // Remove filter from the query.
            unset($query->where[$condition_group_key]['conditions'][$condition_key]);
          }
        } // end: foreach
      } // end: foreach
    } // end: if


    /*
     * Change the field conditions.
     * Possible field values: 1, 2, 3
     * Logic: When 3 is selected, then display 1, 2 and 3.
     */
    switch (@$view->display_handler->handlers['filter']['field_123_value']->value[0]) {

      case 3:
        foreach ($query->where as $condition_group_key => &$condition_group) {
          foreach ($condition_group['conditions'] as $condition_key => &$condition) {
            if($condition['field'] == 'field_data_field_123.field_123_value') {
              unset($query->where[$condition_group_key]['conditions'][$condition_key]);
              $query->where[] = array(
                  'conditions' => array(
                      array(
                          'field' => 'field_data_field_123.field_123_value',
                          'value' => 1,
                          'operator' => "=",
                      ),
                      array(
                          'field' => 'field_data_field_123.field_123_value',
                          'value' => 2,
                          'operator' => "=",
                      ),
                      array(
                          'field' => 'field_data_field_123.field_123_value',
                          'value' => 3,
                          'operator' => "=",
                      ),
                  ),
                  'args' => array(),
                  'type' => 'OR',
              );
            }
          }
        } // end: foreach
        break;

    } // end: switch

  } // end: if
}

विधि 2

सही फ़ील्ड स्थिति खोजने और इसके संदर्भ को वापस करने का प्रयास करने वाले हुक_ साक्षात्कार_ व्याख्या_एक्स्यूट और कस्टम फ़ंक्शन का उपयोग करके उदाहरण देखें:

/**
 * Implements hook_views_pre_execute().
 */
function foo_views_pre_execute(&$view) {

  if ($view->name == 'foo_view') {


    foo_get_view_filter_recursively(
      $view,
      $view->build_info['query']->conditions(),
      'field_data_field_123.field_123_value',
      $filter
    );

    // We want our filter to work as a bit mask.
    $filter[0]['operator'] = '&';

    unset ($filter);

    // Example of finding Proximity filter condition
    $search_name = '(COALESCE(ACOS(';

    foo_get_view_filter_recursively(
      $view,
      $view->build_info['query']->conditions(),
      $search_name,
      $filter
    );

    if (empty($_GET['postcode']['postal_code']) || $_GET['postcode']['postal_code'] === 'All') {
      // Allowing any distance.
      $filter[0]['value'][':distance'] = 10000000;
    }
    else {
      $filter[0]['value'][':distance'] = 80000;
    }

    unset ($filter);


    // Fetching single record?

    foo_get_view_filter_recursively(
      $view,
      $view->build_info['query']->conditions(),
      'node.nid',
      $filter
    );

    if (!empty($_GET['nid'])) {
      $filter[0]['value'] = (int) $_GET['nid'];
    }
    else {
      $filter[0]['operator'] = '<>';
    }

    unset ($filter);                                                        

    // echo '<pre style="font-size:11px;font-family: Monaco">'; print_r($view->build_info['query']); exit;
  }
}

/**
 * Custom function to find the field condition within the view
 */
function foo_get_view_filter_recursively($view, &$conditions, $field_name, &$filter) {

  if (!empty($conditions)) {

    foreach ($conditions as &$condition) {
      if ($condition instanceof DatabaseCondition) {
        if (foo_get_view_filter_recursively($view, $condition->conditions(), $field_name, $filter)) {
          return TRUE;
        }
      } else if ($condition['field'] instanceof DatabaseCondition) {
        if (foo_get_view_filter_recursively($view, $condition['field']->conditions(), $field_name, $filter)) {
          return TRUE;
        }
      } elseif (is_string($condition['field']) && strstr($condition['field'], $field_name) !== FALSE) {
        @$filter = array(&$condition);
        return TRUE;
      }
    } // end: foreach

  } // end: if

  return FALSE;
}

0

मैं इसे टेम्प्लेट फ़ाइलों से हटा रहा हूं। विचारों को देखें- view.tpl.php और उसमें से निम्न कोड को हटा दें:

  <?php if ($exposed): ?>
    <div class="view-filters">
      <?php print $exposed; ?>
    </div>
  <?php endif; ?>

0

मुझे लगता है कि ऑप सही रास्ते पर था। मेरे पास बिना फ़िल्टर किए समान स्थिति थी इसलिए मैं hook_form_alter विधि का उपयोग नहीं कर सका। इस पार आने वाले किसी और व्यक्ति के लिए कुछ उदाहरण कोड यहां दिए गए हैं:

$view->set_item($view->current_display, 'filter', $filter_id, null);

व्यू ऑब्जेक्ट में एक remove_itemफ़ंक्शन नहीं होता है, लेकिन बस कोड में लिखा होता है कि आप फ़िल्टर सहित किसी आइटम को निकालने के लिए इसे शून्य पर सेट कर सकते हैं: views/includes/view.incलाइन पर 2526

यहाँ किसी के लिए एक पूर्ण उदाहरण है जो एक विशिष्ट दृश्य और प्रदर्शन को लक्षित करता है:

/**
 * Implements HOOK_views_pre_view().
 */
function HOOK_views_pre_view(&$view) {
  if($view->name == 'VIEW_MACHINE_NAME') {
    switch($view->current_display) {
      case 'VIEW_DISPLAY_MACHINE_NAME':
        $view_filters = $view->display_handler->get_option('filters');
        foreach ($view_filters as $filter_id => $filter) {
          if ($filter_id == 'my_filter') {
            $view->set_item($view->current_display, 'filter', $filter_id, null);
          }
        }
      break;
    }
  }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.