보기 3 프로그래밍 방식으로 노출 된 필터 제거


9

각기 다른 분류 용어 용어를 참조하는 여러 노드 유형이 있습니다. 카테고리를 표시하려면 taxonomy_display 모듈을 사용하십시오.

예를 들어 큐와 당구 공이라는 두 가지 범주가 있습니다.

큐는 가격, 가격 및 목재 필터를 갖추고 있습니다. 그러나 볼에는 목재 필터가 없습니다.

taxonomy_term tid가 당구 공 어휘를 참조하는 경우 목재 유형 필터를 제거해야합니다.

따라서 프로그래밍 방식으로 노출 된 많은 필터 중 하나를 제거해야합니다.

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

here- http : //groups.drupal.org/node/82219 와 같은 override_option () 메소드를 사용해보십시오 . 결과는 전혀 없습니다.

어떤 제안? Pls 도움 =)


답장을 보내 주셔서 감사합니다.하지만 아직 답이 없습니다. 어쩌면 뭔가 분명하지 않습니까? = (


hook_views_pre_render () 사용해 보셨습니까 ? jQuery를 사용한 선택에 따라 관련 필터를 표시하거나 숨길 수도 있습니다.
enzipher

안녕하세요, 귀하의 솔루션은 정상적으로 작동하지만 올바른 방법없다는 것을 이해합니다 . CSS 조건을 사용하여 숨길 수 있습니다 ... 설명하려고합니다. 각 종류의 코드는 원래 위치에 있어야합니다. 이 문제의 경우 렌더링 전후에 노출 된 필터를 숨기더라도 뷰는 여전히 필터를 처리합니다. 그리고 쿼리 문자열을 추가하려고하면 smt like ?filter_id=val뷰가 빈 디스플레이 또는 잘못된 선택 오류를 반환합니다 ...
Oleg Sherbakov

내 대답을 시도 했습니까?
Mathankumar

양식을 변경할 필요가 없습니다 (변형이 작동한다는 것을 알고 있습니다).보기 객체를 수정하여 결과와 비슷하지만 양식 빌드보다 빠릅니다.
Oleg Sherbakov

답변:



1

다음은 Scott Thomas가 언급 한 양식 alter를 사용하여 노출 된 양식에서 필터를 제거 할 수있는 테스트 된 스 니펫입니다.

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

양식 필드를 제거하는 것 외에도 $ form [ '# info']에서 사용 가능한 특정 필터에 대한 정보도 제거해야합니다. 그래야 레이블도 제거됩니다. 양식 요소 만 제거하면 필드가 제거 되더라도 필터 레이블이 표시되므로 항상이 정보도 제거해야합니다.

필요에 따라 수정하십시오. 특정보기에 대해이 작업을 수행하려면 다음과 같은 조건을 추가하십시오.

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

여기서 $ form_state [ 'view']는 처리중인 현재 뷰 객체를 제공합니다.

도움이 되었기를 바랍니다.


이것은 라벨과 필드 위젯을 숨기는 유일한 솔루션이었으며 노출 된 필터 형식으로 블록에 작동했습니다.
xenophyle

1

아래 단계를 따르십시오

  1. 먼저 커스텀 모듈에 hook_form_alter를 작성하십시오
  2. 다음 코드를 시도해보십시오

    unset ($ form [ '# info'] [ 'your_field_name']); $ form [ 'your_field_name'] [ '# access'] = '거짓';

희망이 도움이됩니다.


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이지만 노출 된 필터를 빌드하기 위해 핵심 양식 API를 사용하는 D8을 기다리고 있습니다. :
Oleg Sherbakov

0

귀하의 문제를 완전히 이해하지 못했기 때문에 내가 틀렸다면 바로 잡으십시오. 따라서 다른 노출 된 필터 값에 따라보기에서 노출 된 필터를 숨기고 싶습니까? 그렇다면 Views Dependent Filters 모듈을 사용해보십시오 . 나는 그것을 여러 번 사용했고 그것은 일을합니다.

이 모듈에 대한 Fiend Lullabot의 리뷰를 확인할 수 있습니다 .

코드에서 실제로 해야하는 경우 노출 된 옵션이 작동해야합니다. filter [$ filter_id]-> options [ 'exposed'] = FALSE;


현재 콘텐츠 유형에 this (filtered) 필드가 없으면 노출 된 필터를 숨기고 싶습니다. 당신의 발췌 문장을 시도하면 $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있습니다. 필터가 노출되지 않으면 기본값도 필요하기 때문에 올바른 동작이라고 생각합니다. 어떤 아이디어?
Oleg Sherbakov

pastebin.com/f1FKgUde 여기 내 코드가 있습니다. 어쩌면 내 영어보다 더 분명 할 것입니다.
Oleg Sherbakov

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

hook_views_query_alter ()를 사용합니다. 다음 예를 참조하십시오.

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

템플릿 파일에서 제거하고 있습니다. views-view.tpl.php를 재정의하고 다음 코드를 제거하십시오.

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

0

나는 op가 올바른 길을 가고 있다고 생각합니다. 노출 된 필터없이 비슷한 상황이 발생하여 hook_form_alter 메서드를 사용할 수 없습니다. 여기 다른 사람을위한 예제 코드가 있습니다 :

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

뷰 객체는없는 remove_item기능을하지만, 단순히 필터를 포함 항목을 제거하기 위해 null로 설정할 수있는 코드에서 상태 : 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.