Paparkan filter tunggal kombinasi dua bidang dalam tampilan

24

Saya memiliki dua bidang profil pengguna "Nama Belakang" dan "Nama Depan". Saya juga memiliki pandangan daftar pengguna. Saya ingin mengekspos "Nama" sebagai filter yang dapat mencari Nama Belakang dan Nama Depan. Bagaimana saya bisa melakukan filter tunggal kombinasi kedua bidang itu? Bisakah saya membuatnya dari tampilan UI?

Salah satu cara yang mungkin adalah dengan membuat bidang profil lain "Nama" yang akan disembunyikan dalam formulir. Pada save pengguna, saya akan menggabungkan dua nilai bidang ke dalam bidang "Nama" dan kemudian memaparkannya sebagai filter dalam tampilan. Tetapi solusi ini adalah pengkodean yang sulit dan perlu menulis kait.

Sithu
sumber
Lihatlah pertanyaan ini drupal.stackexchange.com/questions/42366/... Mungkin bisa membantu Anda. Dan tidak, Anda harus membuat modul. Oskar
Oskar Calvo
Fitur ini dibangun di modul tampilan. Ini membutuhkan pemrograman nol. Video youtube ini menunjukkan contoh lengkap tentang cara menggunakannya.
asiby

Jawaban:

21

Saya akhirnya mendapat solusi dari ini . Saya mengikuti solusi utama kedua yang ditawarkan meskipun blogger digunakan secara pribadi hook_views_query_alter().

  1. menginstal modul Tampilan filter mengisi .
  2. menambahkan dua filter "Nama Depan" dan "Nama Belakang" (keduanya tidak boleh diekspos) dan menambahkannya ke grup filter ATAU (Tampilan 3 mendukung ini). Saya harus menggunakan operator "Berisi kata apa saja" untuk kedua bidang, jika tidak, kueri tidak memberi saya hasil yang diinginkan.
  3. membuat filter "Global: populate filter", menambahkan dua bidang ke dalamnya dan mengeksposnya.

Ini memberi saya solusi cepat tanpa hard coding.
Ini referensi bermanfaat lainnya.

Sithu
sumber
Saya tidak berpikir Anda perlu menggunakan langkah 2 - saya menginstal modul dan menggunakan "Global: menggabungkan bidang filter" yang terbuka. Saya memilih dua bidang dalam pengaturan bidang gabungan itu.
Laryn - CEDC.org
13

Pada instalasi saya, D7 dengan Tampilan 7.x-3.6, Anda dapat menambahkan filter yang "Global: Combine fields filter" yang akan melakukan apa yang Anda butuhkan, memungkinkan pengguna untuk mencari di banyak bidang dengan satu filter.

Mona
sumber
1
Ini harus menjadi jawaban yang diterima
frazras
5

Sangat mudah.

  1. Klik pada Tambahkan filter.
  2. pilih "Global: Combine fields filter"
  3. Ikuti petunjuk.

Terima kasih.

Shitanshu Mishra
sumber
2

Bekerja di luar kotak

Cara termudah untuk pergi adalah dengan menggunakan filter 'Istilah Pencarian' yang merupakan fungsionalitas inti Views . Ini akan mencari melalui semua bidang entitas dan mengembalikan hasilnya, tidak perlu modul tambahan!

  1. Buka Tampilan Anda
  2. Tambahkan filter baru untuk dilihat
  3. Pilih 'Cari: Istilah Pencarian'

Itu, tidak ada lagi yang harus dilakukan (Anda mungkin ingin mengeksposnya)

Berkinerja sangat baik juga.

Larzan
sumber
0

Anda dapat menggunakan hook_views_pre_execute (& $ view) untuk memperluas kondisi tunggal Anda ke beberapa bidang yang Anda inginkan

/**
 * Recursive looks for mentioning of $fname as field of in query QueryConditionInterface::conditions()
 * 
 * @param array $cond result of QueryConditionInterface::conditions to search in
 * @param string $fname a name oof field we are looking for
 * @param array $res result array containing a references of conditions having $fname
 * @param integer $rec_lvl level of recursion
 * 
 * @return array an array containing $fname mentioned in condition $res[]['field'] == $fname
 */
function dolynskyi_help_func_find_field_condition(&$cond, $fname, &$res = array(), &$rec_lvl = 0) {
    $numeric_keys = array_filter(array_keys($cond), function($k) {return is_int($k) || (substr($k, 0, 1) !== '#');});
    $rec_lvl++;
    foreach($numeric_keys as $numkey) {
        $t = gettype($cond[$numkey]['field']);
        if($t == 'string') {
            if($cond[$numkey]['field'] == $fname) {
                $res[] = &$cond[$numkey];
            }
        } elseif($t == 'object') {
            dolynskyi_help_func_find_field_condition($cond[$numkey]['field']->conditions(), $fname, $res, $rec_lvl);
        }
    }
    $rec_lvl--;
    return $res;
}

function dolynskyi_help_func_views_pre_execute(&$view) {
    if($view->name == 'appraisals_special_global_access') { // view name we wanna extend
        $fname = 'field_data_field_ap2_employee.field_ap2_employee_target_id'; // field we look for to use as source of extending
        $search = &dolynskyi_help_func_find_field_condition($view->build_info['query']->conditions(), $fname);
        foreach($search as &$v) { // looping found field references
            $or = db_or(); 
            $or->condition($v['field'], $v['value'], $v['operator']); //repeating existing field condition
            $or->condition('field_data_field_ap2_employee.field_ap2_employee_target_id', array('711'), 'IN'); //adding any extra condition
            $v = array('value'=>null, 'operator'=>'IS NULL', 'field'=>$or); // wrapping up simple condition for $fname to multiple with $fname + our extra field via OR logic
            unset($v);
        }
    }
}
Mykola Mykolayovich Dolynskyi
sumber