Görünümler 3 maruz kalan filtreyi programlı olarak kaldırma


9

Her biri farklı sınıflandırma terimiyle ilgili birkaç düğüm tipine sahibim. İ gösteren kategori için taxonomy_display modülünü kullanın.

Örneğin, iki kategorimiz var: işaretler ve bilardo topları.

Cues fiyat, fiyat ve ahşap tipi filtrelere sahiptir. Ancak topların ahşap tipi filtresi yoktur.

Yani bilardo topları kelime referans taksonomy_term tid ahşap türü filtre kaldırmak gerekir.

Bu nedenle, maruz kalan birçok filtreden birini programsal olarak kaldırmam gerekiyor.

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

Filtre alanı başarıyla kaldırıldı, ancak php bildirimi aldım:

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

Ayrıca hook_pre_execute (), ancak aynı sonucu alan kaldırmaya çalışın:

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

Ayrıca burada olduğu gibi override_option () yöntemini deneyin - http://groups.drupal.org/node/82219 , ancak sonuç yok.

Herhangi bir öneri? Pls yardım =)


Herkese cevap için teşekkürler ama hala cevabım yok. Belki bir şey net değil mi? = (


Hook_views_pre_render () denediniz mi? JQuery ile yapılan seçime bağlı olarak ilgili filtreleri de gösterebilir / gizleyebilirsiniz.
enzipher

Merhaba, çözümünüzün iyi çalıştığını anlıyorum, ancak doğru yol yok . Böylece CSS koşullarını bile kullanarak gizleyebilirim ... Açıklamaya çalışıyorum. Her tür kod olması gereken yere yerleştirilmelidir. Bu sorun için ben maruz filtre öncesi veya sonra gizlemek, görünümleri yine de işler. Ve ben sorgu dizesi, smt gibi eklemeyi denerseniz ?filter_id=val, görünümler boş ekran veya yasadışı seçim hatası döndürür ...
Oleg Sherbakov

Cevabımı denedin mi?
Mathankumar

Formu değiştirmeye gerek yok (varyantınızın çalıştığını biliyorum), sizinkine benzer sonuçlara sahip görünüm nesnesini değiştirmek istiyorum, ancak form derlemelerinden daha erken.
Oleg Sherbakov

Yanıtlar:



1

Scott Thomas tarafından belirtildiği gibi form değiştiriciyi kullanarak, maruz kalan formdaki filtrelerden kaldırmanıza izin verecek test edilmiş snippet,

/**
 *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 alanını kaldırmanın yanı sıra, $ form ['# info'] biçiminde bulunan belirli filtre bilgisini de kaldırmanız gerekir, böylece etiketi de kaldıracaktır. Form öğesini tek başına kaldırırsanız, alan kaldırılsa bile filtre etiketi görüntülenir, Bu nedenle her zaman bu bilgileri de kaldırdığınızdan emin olun.

Bunu ihtiyacınıza göre değiştirin. Bunu belirli bir görünüm için gerçekleştirmek istiyorsanız, bunun için de bir koşul ekleyin,

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

Burada $ form_state ['view'] size işlenmekte olan geçerli görüntüleme nesnesini verecektir.

Bu yardımcı olur umarım.


Etiketleri ve alan widget'larını benim için saklayan tek çözüm buydu ve bir blokta açıkta kalan filtre formunda çalıştı.
xenophyle

1

Aşağıdaki adımları takip et

  1. Öncelikle özel bir modüle hook_form_alter yazın
  2. Sonra aşağıdaki kod parçasını deneyin

    unset ($ form [ '# bilgisi'] [ 'your_field_name']); $ form ['alanınız_adı'] ['# erişim'] = 'YANLIŞ';

Umarım yardımcı olur.


1

Maruz kalan filtreyi şablon dosyasını kullanarak da kaldırabilirsiniz.

Bu komutu kullanın:

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

Şablon dosyasında şu kodu bulun:

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

Ve kaldırın. Maruz kalan filtreniz ekrandan kaldırılacak, ancak URL'nizde uygun bağımsız değişkenleri iletmeye devam edeceksiniz.


Cevap için
teşekkürler

0

Yanlışsam beni düzeltin çünkü sorununuzu tam olarak anlayamadığımdan emin değilim. Diğer bir açıkta kalan filtrenin değerine bağlı olarak bir açıkta kalan filtreyi görünümde gizlemek mi istiyorsunuz? Öyleyse Views Dependent Filters modülünü deneyebilirsiniz . Birkaç kez kullandım ve işi yapıyor.

Fiend Lullabot'un bu modül hakkındaki incelemesini kontrol edebilirsiniz .

Gerçekten kodda yapmanız gerekiyorsa maruz kalan seçenek çalışması gerekir: filter [$ filter_id] -> options ['exposed'] = FALSE;


Geçerli içerik türü bu (filtrelenmiş) alan yoksa maruz kalan filtreyi gizlemek istiyorum. Snippet'inizi denerken $view->display_handler->handlers['filter'][$filter_field]->options['exposed'] = FALSE;ölümcül hata var - PHP Fatal error: Call to undefined method stdClass::access() in .../view.inc on line 766. Filtre doğru değilse, aynı zamanda varsayılan değer gerekli çünkü doğru davranış düşünüyorum. Herhangi bir fikir?
Oleg Sherbakov

pastebin.com/f1FKgUde burada benim kodum, belki de benim ingilizcemden daha açık olacak
Oleg Sherbakov

0

Aşağıdaki benim için hook_form_alter içinde yaptı:

$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

Yöntem 1

Hook_views_query_alter () kullanarak. Aşağıdaki örneğe bakın:

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

Yöntem 2

Doğru alan koşulunu bulmaya ve referansı ona döndürmeye çalışan hook_views_pre_execute ve özel işlevi kullanarak örneğe bakı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

Şablon dosyalarından kaldırıyorum. Views-view.tpl.php dosyasını geçersiz kılın ve aşağıdaki kodu ondan kaldırın:

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

0

Bence operasyon doğru yoldaydı. Ben hook_form_alter yöntemini kullanamadı bu yüzden açık filtreler olmadan benzer bir durum vardı. İşte bununla karşılaşan herkes için bazı örnek kod:

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

Görünüm nesnesinin bir remove_itemişlevi yoktur ancak kodda, filtreler: views/includes/view.incçevrimiçi olan bir öğeyi kaldırmak için boş olarak ayarlayabileceğinizi belirtir 2526.

Belirli bir görünümü ve görüntüyü hedefleyen herkes için tam bir örnek:

/**
 * 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;
    }
  }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.