Lượt xem 3 loại bỏ bộ lọc tiếp xúc theo chương trình


9

Tôi đã có một số loại nút, mỗi loại được tham chiếu đến từ vựng thuật ngữ phân loại khác nhau. Đối với thể loại hiển thị tôi sử dụng mô-đun taxonomy_display.

Ví dụ: chúng tôi có hai loại: tín hiệu và bóng bi-a.

Cues có giá từ, giá đến và bộ lọc loại gỗ. Nhưng bóng không có bộ lọc loại gỗ.

Vì vậy, tôi cần phải loại bỏ bộ lọc loại gỗ nếu taxonomy_term tid tham chiếu từ vựng bi-a bi-a.

Vì vậy, tôi cần phải loại bỏ một trong nhiều bộ lọc tiếp xúc theo chương trình.

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

Trường bộ lọc loại bỏ thành công, nhưng tôi đã nhận được thông báo php:

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

Ngoài ra, tôi cố gắng loại bỏ trường trong hook_pre_execute (), nhưng với kết quả tương tự:

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

Cũng thử với phương thức override_option () như ở đây - http://groups.drupal.org/node/82219 , nhưng không có kết quả nào cả.

Bất kỳ đề xuất? Xin giúp đỡ =)


Cảm ơn mọi người đã trả lời nhưng tôi vẫn chưa có câu trả lời. Có lẽ một cái gì đó không rõ ràng? = (


Bạn đã thử hook_view_pre numnder () chưa? Bạn cũng có thể hiển thị / ẩn các bộ lọc có liên quan tùy thuộc vào lựa chọn với jQuery.
enzodes

Xin chào, tôi hiểu rằng giải pháp của bạn hoạt động tốt, nhưng không có cách nào đúng . Vì vậy, tôi có thể ẩn nó bằng cách sử dụng các điều kiện CSS ... Cố gắng giải thích. Mỗi loại mã nên đặt nơi cần được. Đối với vấn đề này nếu tôi ẩn bộ lọc tiếp xúc trước hoặc sau khi kết xuất, chế độ xem vẫn xử lý nó. Và nếu tôi thử thêm chuỗi truy vấn, smt like ?filter_id=val, lượt xem trả về hiển thị trống hoặc lỗi lựa chọn bất hợp pháp ...
Oleg Sherbakov

Bạn đã thử câu trả lời của tôi chưa?
Mathankumar

Tôi không cần phải thay đổi hình thức (tôi biết rằng biến thể của bạn hoạt động), tôi muốn sửa đổi đối tượng khung nhìn giống với kết quả của bạn, nhưng sớm hơn so với xây dựng biểu mẫu.
Oleg Sherbakov

Câu trả lời:


5

Tôi sẽ sử dụng hook_form_alter bằng cách sử dụng unset trên đối tượng biểu mẫu như trong ví dụ của bạn cho phần tử mà bạn muốn xóa.


1

Dưới đây là đoạn mã được thử nghiệm sẽ cho phép bạn xóa các bộ lọc khỏi biểu mẫu hiển thị bằng cách sử dụng thay đổi biểu mẫu như được đề cập bởi Scott Thomas,

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

Ngoài việc xóa trường biểu mẫu, bạn cũng cần xóa thông tin cho bộ lọc cụ thể có sẵn trong $ form ['# thông tin'], do đó, nó cũng sẽ xóa nhãn. Nếu bạn chỉ xóa phần tử biểu mẫu thì nhãn bộ lọc sẽ được hiển thị ngay cả khi trường bị xóa, vì vậy hãy luôn đảm bảo rằng bạn cũng xóa thông tin này.

Sửa đổi điều này theo nhu cầu của bạn. Nếu bạn muốn thực hiện cái này cho chế độ xem cụ thể thì hãy thêm một điều kiện cho cái đó quá thích,

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

Ở đây $ form_state ['view'] sẽ cung cấp cho bạn đối tượng xem hiện tại đang được xử lý.

Hi vọng điêu nay co ich.


Đây là giải pháp duy nhất che giấu các nhãn cũng như các widget trường cho tôi và nó hoạt động ở dạng bộ lọc bị lộ trong một khối.
xenophyle

1

Làm theo các bước dưới đây

  1. Đầu tiên hãy viết hook_form_alter trong một mô-đun tùy chỉnh
  2. Tiếp theo hãy thử đoạn mã sau

    bỏ đặt ($ form ['# thông tin'] ['your_field_name']); $ form ['your_field_name'] ['# access'] = 'FALSE';

Mong rằng sẽ giúp.


1

Bạn cũng có thể loại bỏ bộ lọc tiếp xúc bằng tệp mẫu.

Sử dụng lệnh này:

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

Trong tệp mẫu tìm mã này:

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

Và loại bỏ nó. Bộ lọc tiếp xúc của bạn sẽ bị xóa khỏi màn hình, nhưng sẽ tiếp tục làm việc để bạn vượt qua các đối số thích hợp trong URL.


Thx để trả lời, nhưng tôi đang chờ D8 sử dụng api dạng lõi để xây dựng các bộ lọc tiếp xúc :)
Oleg Sherbakov

0

Sửa lỗi cho tôi nếu tôi sai vì tôi không chắc chắn hiểu đầy đủ vấn đề của bạn. Vì vậy, bạn muốn ẩn bộ lọc được hiển thị trong chế độ xem tùy thuộc vào giá trị của bộ lọc được hiển thị khác? Nếu vậy, bạn có thể thử mô-đun Bộ lọc phụ thuộc Lượt xem . Tôi đã sử dụng nó nhiều lần và nó thực hiện công việc.

Bạn có thể kiểm tra đánh giá của kẻ thù Lullabot của chúng tôi về mô-đun này.

Nếu bạn thực sự cần phải làm điều đó trong mã, tùy chọn được hiển thị sẽ hoạt động: filter [$ filter_id] -> tùy chọn ['lộ'] = FALSE;


Tôi muốn ẩn bộ lọc tiếp xúc nếu loại nội dung hiện tại không có trường (được lọc) này. Thử đoạn trích của bạn $view->display_handler->handlers['filter'][$filter_field]->options['exposed'] = FALSE;tôi có lỗi nghiêm trọng - PHP Fatal error: Call to undefined method stdClass::access() in .../view.inc on line 766. Tôi nghĩ rằng hành vi chính xác của nó bởi vì nếu bộ lọc không được tiếp xúc, nó cũng yêu cầu giá trị mặc định. Có ý kiến ​​gì không?
Oleg Sherbakov

pastebin.com/f1FKgUde đây là mã của tôi, có lẽ nó sẽ rõ ràng hơn tiếng Anh của tôi
Oleg Sherbakov

0

Sau đây đã làm điều đó cho tôi bên trong 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

Phương pháp 1

Bằng cách sử dụng hook_view_query_alter (). Xem ví dụ sau:

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

Cách 2

Xem ví dụ bằng cách sử dụng hàm hook_view_pre_execute và tùy chỉnh cố gắng tìm điều kiện trường phù hợp và trả về tham chiếu cho nó:

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

Tôi đang xóa nó khỏi tập tin mẫu. Ghi đè view-view.tpl.php và xóa đoạn mã sau khỏi nó:

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

0

Tôi nghĩ rằng op đã đi đúng hướng. Tôi đã có một tình huống tương tự mà không có bộ lọc tiếp xúc vì vậy tôi không thể sử dụng phương thức hook_form_alter. Dưới đây là một số mã ví dụ cho bất kỳ ai khác đi qua đây:

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

Đối tượng xem không có remove_itemchức năng mà chỉ nêu trong mã mà bạn có thể đặt thành null để xóa một mục bao gồm các bộ lọc: views/includes/view.inctrực tuyến 2526.

Dưới đây là một ví dụ đầy đủ cho bất kỳ ai nhắm mục tiêu và hiển thị cụ thể:

/**
 * 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;
    }
  }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.