Tampilan 3 menghapus filter yang terbuka secara program

9

Saya punya beberapa tipe simpul yang masing-masing direferensikan ke perbendaharaan istilah taksonomi yang berbeda. Untuk kategori yang ditampilkan, saya menggunakan modul taxonomy_display.

Sebagai contoh, kami memiliki dua kategori: isyarat dan bola bilyar.

Isyarat memiliki harga dari, harga hingga dan jenis filter kayu. Tetapi bola tidak memiliki filter jenis kayu.

Jadi saya perlu menghapus jenis kayu filter jika taxonomy_term tid direferensikan ke kosa kata bola bilyar.

Jadi, saya perlu menghapus salah satu dari banyak filter yang terpapar secara terprogram.

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

Bidang filter berhasil dihapus, tetapi saya mendapat pemberitahuan php:

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

Saya juga mencoba untuk menghapus bidang di hook_pre_execute (), tetapi dengan hasil yang sama:

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

Coba juga dengan metode override_option () seperti di sini - http://groups.drupal.org/node/82219 , tetapi tidak ada hasil sama sekali.

Ada saran? Tolong bantu =)


Terima kasih untuk semua orang atas balasannya tetapi saya masih belum memiliki jawaban. Mungkin ada sesuatu yang tidak jelas? = (

Oleg Sherbakov
sumber
Sudahkah Anda mencoba hook_views_pre_render () ? Anda juga dapat menampilkan / menyembunyikan filter yang relevan tergantung pada pilihan dengan jQuery.
Enkripsi
Hai, saya mengerti bahwa solusi Anda berfungsi dengan baik, tetapi tidak ada cara yang benar . Jadi saya bisa menyembunyikannya bahkan menggunakan kondisi-CSS ... Mencoba menjelaskan. Setiap jenis kode harus diletakkan di tempat yang seharusnya. Untuk masalah ini jika saya menyembunyikan filter yang terbuka sebelum atau setelah render, tampilan masih memprosesnya. Dan jika saya mencoba menambahkan string kueri, seperti ?filter_id=val, tampilan mengembalikan tampilan kosong atau kesalahan pilihan ilegal ...
Oleg Sherbakov
Sudahkah Anda mencoba jawaban saya?
Mathankumar
Saya tidak perlu mengubah bentuk (saya tahu bahwa varian Anda berfungsi), saya ingin memodifikasi objek tampilan agar mirip dengan hasil Anda, tetapi lebih awal daripada bentuk yang dibuat.
Oleg Sherbakov

Jawaban:

5

Saya akan menggunakan hook_form_alter menggunakan unset pada objek form karena Anda berada dalam contoh Anda untuk elemen yang ingin Anda hapus.

Scott Thomas
sumber
1

Berikut ini cuplikan yang diuji yang akan memungkinkan Anda untuk menghapus filter dari tampilan yang dilihat menggunakan form alter seperti yang disebutkan oleh 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]);
  }     
}

Selain menghapus bidang formulir Anda juga perlu menghapus informasi untuk filter tertentu yang tersedia dalam $ form ['# info'], sehingga itu akan menghapus label juga. Jika Anda menghapus elemen formulir saja maka label filter akan ditampilkan meskipun bidang dihapus, Jadi selalu pastikan bahwa Anda juga menghapus informasi ini.

Ubah ini sesuai dengan kebutuhan Anda. Jika Anda ingin melakukan ini untuk tampilan tertentu maka tambahkan kondisi untuk itu juga seperti,

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

Di sini $ form_state ['view'] akan memberi Anda objek tampilan saat ini yang sedang diproses.

Semoga ini membantu.

Mathankumar
sumber
Ini adalah satu-satunya solusi yang menyembunyikan label serta widget bidang untuk saya, dan itu berfungsi dalam bentuk filter terbuka di blok.
xenophyle
1

Ikuti langkah-langkah di bawah ini

  1. Pertama-tama tulis hook_form_alter dalam modul khusus
  2. Selanjutnya coba bagian kode berikut

    tidak disetel ($ form ['# info'] ['your_field_name']); $ form ['your_field_name'] ['# access'] = 'FALSE';

Semoga itu bisa membantu.

Rons
sumber
1

Anda dapat menghapus filter terbuka menggunakan file template juga.

Gunakan perintah ini:

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

Dalam file template temukan kode ini:

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

Dan hapus. Filter Anda yang terbuka akan dihapus dari tampilan, tetapi akan tetap berfungsi jika Anda meneruskan argumen yang tepat di URL.

subhojit777
sumber
Terima kasih, tapi saya menunggu D8 yang menggunakan api bentuk inti untuk membangun filter yang terbuka :)
Oleg Sherbakov
0

Perbaiki saya jika saya salah karena saya tidak yakin untuk sepenuhnya memahami masalah Anda. Jadi, Anda ingin menyembunyikan filter terbuka di tampilan tergantung pada nilai filter terbuka lainnya? Jika demikian, Anda dapat mencoba modul Filter Tampilan Dependen . Saya menggunakannya beberapa kali dan berhasil.

Anda dapat memeriksa kami iblis Lullabot ini ulasan tentang modul ini.

Jika Anda benar-benar perlu melakukannya dalam kode, opsi yang terbuka harus bekerja: filter [$ filter_id] -> options ['exposed'] = FALSE;

Hervé Donner
sumber
Saya ingin menyembunyikan filter terbuka jika jenis konten saat ini tidak memiliki bidang ini (difilter). Mencoba cuplikan Anda, $view->display_handler->handlers['filter'][$filter_field]->options['exposed'] = FALSE;saya memiliki kesalahan fatal - PHP Fatal error: Call to undefined method stdClass::access() in .../view.inc on line 766. Saya pikir perilakunya benar karena jika filter tidak diekspos, itu juga memerlukan nilai default. Ada ide?
Oleg Sherbakov
pastebin.com/f1FKgUde di sini adalah kode saya, mungkin itu akan lebih jelas daripada bahasa Inggris saya
Oleg Sherbakov
0

Yang berikut ini melakukannya untuk saya di dalam 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]);
Jerome benezech
sumber
0

Metode 1

Dengan menggunakan hook_views_query_alter (). Lihat contoh berikut:

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

Metode 2

Lihat contoh dengan menggunakan hook_views_pre_execute dan fungsi kustom yang mencoba menemukan kondisi bidang yang tepat dan mengembalikan referensi ke sana:

/**
 * 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;
}
kenorb
sumber
0

Saya menghapusnya dari file template. Timpa views-view.tpl.php dan hapus kode berikut dari dalamnya:

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

Saya pikir opnya ada di jalur yang benar. Saya memiliki situasi yang sama tanpa filter terbuka sehingga saya tidak bisa menggunakan metode hook_form_alter. Berikut adalah beberapa contoh kode untuk orang lain yang menemukan ini:

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

Objek tampilan tidak memiliki remove_itemfungsi tetapi hanya menyatakan dalam kode yang Anda dapat mengaturnya menjadi nol untuk menghapus item termasuk filter: views/includes/view.incon line 2526.

Ini adalah contoh lengkap untuk siapa saja yang menargetkan tampilan dan tampilan tertentu:

/**
 * 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;
    }
  }
}
Pengembang Web JNP
sumber