3 টি দৃশ্যত ফিল্টার প্রোগ্রামগতভাবে মুছে ফেলুন


9

আমি বেশ কয়েকটি নোড টাইপ পেয়েছি যার মধ্যে প্রতিটি পৃথক শ্রমশক্তি শব্দটির বিভিন্ন শব্দভাণ্ডারের সাথে সম্পর্কিত। বিভাগ দেখানোর জন্য আমি ট্যাক্সনমি_ডিসপ্লে মডিউল ব্যবহার করি।

উদাহরণস্বরূপ, আমরা দুটি বিভাগ পেয়েছি: সংকেত এবং বিলিয়ার্ড বল।

কিউসের মূল্য থেকে মূল্য এবং কাঠের ধরণের ফিল্টার রয়েছে। তবে বলগুলিতে কোনও কাঠের ফিল্টার নেই।

সুতরাং বিলিয়ার্ড বলের ভোকাবুলারির জন্য যদি ট্যাক্সনমি_মিটার জোয়ার উল্লেখ করা হয় তবে আমার কাঠের টাইপ ফিল্টারটি সরিয়ে ফেলতে হবে।

সুতরাং, আমি প্রোগ্রামগতভাবে অনেক উন্মুক্ত ফিল্টারগুলির একটি অপসারণ করতে হবে।

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]);
}

ফিল্টার ক্ষেত্রটি সাফল্যের সাথে মুছে ফেলা হয়েছে, কিন্তু আমি পিএইচপি বিজ্ঞপ্তি পেয়েছি:

  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 সহায়তা =)


প্রত্যুত্তরের জন্য প্রত্যেককে ধন্যবাদ তবে আমার কাছে এখনও কোন উত্তর নেই। কিছু পরিষ্কার হতে পারে না? = (


আপনি কি হুক_দর্শন_প্রিয়_রেন্ডার () চেষ্টা করেছেন ? আপনি 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 ['দেখুন'] আপনাকে বর্তমান ভিউ অবজেক্টটি দেবে যা প্রক্রিয়া করা হচ্ছে।

আশাকরি এটা সাহায্য করবে.


এটি কেবলমাত্র আমার জন্য লেবেলগুলি এবং ফিল্ড উইজেটগুলি লুকিয়েছিল এবং এটি একটি ব্লকের একটি উদ্ভাসিত ফিল্টার আকারে কাজ করেছিল।
জেনোফাইল

1

নীচের পদক্ষেপগুলি অনুসরণ করুন

  1. প্রথমে একটি কাস্টম মডিউলে একটি হুক_ফর্ম_ল্টার লিখুন
  2. এরপরে নীচের কোডটির টুকরো চেষ্টা করুন

    সেট না ($ ফর্ম [ '# তথ্য'] [ 'your_field_name']); $ form ['your_field_name'] ['# অ্যাক্সেস'] = 'মিথ্যা';

আশা করি এইটি কাজ করবে.


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; ?>

এবং এটি সরান। আপনার উন্মুক্ত ফিল্টার প্রদর্শন থেকে সরানো হবে, তবে ইউআরএলে আপনার যথাযথ যুক্তি দিয়ে কাজ চালিয়ে যাবে।


উত্তরের জন্য থেক্স, তবে আমি ডি 8 এর অপেক্ষায় রয়েছি যা এক্সপোজড ফিল্টার তৈরির জন্য মূল ফর্ম এপিআই ব্যবহার করে :)
ওলেগ শেরবাকভ

0

আমি ভুল হলে আমাকে সংশোধন করুন কারণ আমি আপনার সমস্যাটি পুরোপুরি বুঝতে নিশ্চিত নই। সুতরাং আপনি অন্য উন্মুক্ত ফিল্টারের মানের উপর নির্ভর করে কোনও দৃশ্যে একটি এক্সপোজড ফিল্টার আড়াল করতে চান? যদি তাই হয় তবে আপনি ভিউ নির্ভরশীল ফিল্টার মডিউল চেষ্টা করতে পারেন । আমি এটি বেশ কয়েকবার ব্যবহার করেছি এবং এটি কাজটি করে।

আপনি এই মডিউল সম্পর্কে আমাদের লন্ডন লুলাবোট এর পর্যালোচনা পরীক্ষা করতে পারেন ।

আপনার যদি সত্যই কোডটিতে এটি করতে হয় তবে উন্মুক্ত বিকল্পটি কাজ করা উচিত: ফিল্টার [$ ফিল্টার_আইডি] -> বিকল্পসমূহ ['এক্সপোজড'] = মিথ্যা;


আমি যদি বর্তমান সামগ্রীর ধরণের কোনও (ফিল্টারযুক্ত) ক্ষেত্র না থাকে তবে আমি এক্সপোজড ফিল্টারটি আড়াল করতে চাই। আপনার স্নিপেট চেষ্টা করে $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। আমি মনে করি এর সঠিক আচরণ কারণ যদি ফিল্টারটি প্রকাশ না করা হয় তবে এটির জন্য ডিফল্ট মানও প্রয়োজন। কোন ধারনা?
ওলেগ শেরবাকভ


0

নীচে এটি আমার জন্য হুক_ফর্ম_ল্টারের ভিতরে করেছে:

$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

Hook_views_pre_execute এবং কাস্টম ফাংশন ব্যবহার করে উদাহরণটি দেখুন যা সঠিক ক্ষেত্রের শর্তটি সন্ধান করার চেষ্টা করে এবং এতে উল্লেখটি ফিরিয়ে দেয়:

/**
 * 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

আমি এটি টেম্পলেট ফাইলগুলি থেকে সরিয়ে দিচ্ছি। ভিউ-ভিউ.tpl.php ওভাররাইড করুন এবং এটি থেকে নিম্নলিখিত কোডটি সরান:

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

0

আমি মনে করি অপশনটি সঠিক পথে ছিল। উন্মুক্ত ফিল্টার ছাড়াই আমার একইরকম পরিস্থিতি ছিল তাই আমি হুক_ফর্ম_ল্টার পদ্ধতিটি ব্যবহার করতে পারি না। এটি জুড়ে আসা যে কোনও ব্যক্তির জন্য এখানে কয়েকটি উদাহরণ কোড দেওয়া হয়েছে:

$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;
    }
  }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.