Перегляди 3 видаляють відкритий фільтр програмно


9

У мене є декілька типів вузлів, кожен з яких посилається на різну лексику терміна таксономії. Для показу категорії я використовую модуль таксономії_display.

Наприклад, у нас є дві категорії: киї та більярдні кулі.

Киї мають ціну від, ціна до та фільтри типу деревини. Але кульки не мають фільтра типу деревини.

Тому мені потрібно видалити фільтр типу деревини, якщо таксономія_терм посилається на лексику більярдних куль.

Таким чином, мені потрібно видалити один з багатьох відкритих фільтрів програмно.

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()

Також я намагаюсь видалити поле у ​​moll_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]);
}

Спробуйте також метод override_option (), як тут - http://groups.drupal.org/node/82219 , але результату немає.

Будь-які пропозиції? Pls help =)


Дякую всім за відповідь, але у мене ще немає відповіді. Може, щось незрозуміле? = (


Чи спробували ви викликом_ук_пре_рендер () ? Ви також можете показати / приховати відповідні фільтри залежно від вибору за допомогою jQuery.
енцифер

Привіт, я розумію, що ваше рішення працює нормально, але немає правильного шляху . Тож я можу приховати це, використовуючи навіть умови CSS ... Спроба пояснити. Кожен вид коду має бути там, де він повинен бути. Для цього питання, якщо я приховую відкритий фільтр до чи після візуалізації, представлення все ще обробляє його. І якщо я спробую додати рядок запиту, як smt ?filter_id=val, view повертає порожній показ або помилку вибору незаконного вибору ...
Олег Щербаков

Ви спробували мою відповідь?
Матханкумар

Мені не потрібно змінювати форму (я знаю, що ваш варіант працює), я хочу змінити об'єкт поглядів, щоб він був схожий на ваш результат, але раніше, ніж формує форму.
Олег Щербаков

Відповіді:



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

Крім видалення поля форми вам також потрібно видалити інформацію для конкретного фільтра, який доступний у $ form ['# info'], щоб він також видалив мітку. Якщо ви видалите елемент форми самостійно, тоді мітка фільтра відображатиметься, навіть якщо поле видалено. Тому завжди переконайтеся, що ви видаляєте і цю інформацію.

Змініть це відповідно до своїх потреб. Якщо ви хочете виконати цю для конкретного перегляду, тоді додайте умову для цього,

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

Тут $ form_state ['view'] надасть вам об'єкт поточного перегляду, який обробляється.

Сподіваюсь, це допомагає.


Це єдине рішення, яке приховувало мітки, а також польові віджети для мене, і воно працювало у відкритій формі фільтру в блоці.
Ксенофіл

1

Виконайте наведені нижче дії

  1. По-перше, напишіть гачку_форму_альтер у спеціальний модуль
  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 для відповіді, але я чекаю D8, який використовує основні форми api для створення відкритих фільтрів :)
Олег Щербаков

0

Виправте мене, якщо я помиляюся, бо не впевнений, що повністю зрозумів ваше питання. Отже, ви хочете сховати відкритий фільтр у поданні залежно від значення іншого фільтру? Якщо так, ви можете спробувати модуль перегляду залежних фільтрів Views . Я використовував його кілька разів, і це робить свою роботу.

Ви можете перевірити наш FIEND Lullabot в огляд цього модуля.

Якщо вам дійсно потрібно зробити це в коді, відкрита опція повинна спрацювати: filter [$ filter_id] -> options ['izloний'] = 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

Наступне зробив це для мене всередині moque_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

Я видаляю його з файлів шаблонів. Замініть команду views-view.tpl.php та видаліть із неї такий код:

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

0

Я думаю, що оп був на правильному шляху. У мене була подібна ситуація без оголених фільтрів, тому я не міг використовувати метод ho_form_alter. Ось приклад коду для всіх, хто стикається з цим:

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

Об'єкт перегляду не має remove_itemфункції, а просто вказує в коді, що ви можете встановити його на нуль, щоб видалити елемент, включаючи фільтри: views/includes/view.incon line 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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.