เปิดเผยตัวกรองเดียวของการรวมกันของสองฟิลด์ในมุมมอง


24

ฉันมีสองช่องโปรไฟล์ผู้ใช้ "นามสกุล" และ "ชื่อ" ฉันยังมีมุมมองรายการผู้ใช้ ฉันต้องการแสดง "ชื่อ" เป็นตัวกรองที่สามารถค้นหาทั้งนามสกุลและชื่อ ฉันจะกรองการรวมกันของสองฟิลด์เดียวได้อย่างไร ฉันสามารถสร้างมันได้จาก UI การดู?

วิธีหนึ่งที่เป็นไปได้คือการสร้างฟิลด์โปรไฟล์ "ชื่อ" ซึ่งจะซ่อนอยู่ในแบบฟอร์ม ในการบันทึกของผู้ใช้ฉันจะรวมค่าฟิลด์ทั้งสองเข้ากับฟิลด์ "ชื่อ" จากนั้นแสดงเป็นตัวกรองในมุมมอง แต่วิธีนี้เป็นการเข้ารหัสที่ยากและต้องเขียน hooks


ดูคำถามนี้drupal.stackexchange.com/questions/42366/…บางทีมันอาจช่วยคุณได้ และไม่คุณต้องสร้างโมดูล Oskar
Oskar Calvo


คุณลักษณะนี้สร้างขึ้นในโมดูลมุมมอง มันต้องมีการเขียนโปรแกรมเป็นศูนย์ วิดีโอ youtube นี้แสดงตัวอย่างที่สมบูรณ์เกี่ยวกับวิธีการใช้งาน
asiby

คำตอบ:


21

ในที่สุดผมมีวิธีการแก้ปัญหาจากนี้ hook_views_query_alter()ผมทำตามวิธีการแก้ปัญหาหลักที่สองที่นำเสนอแม้จะบล็อคใช้ส่วนตัว

  1. การติดตั้งโมดูลฟิลเตอร์ชมเติม
  2. เพิ่มตัวกรองสองตัว "ชื่อ" และ "นามสกุล" (ต้องไม่เปิดเผย) และเพิ่มลงในกลุ่มตัวกรอง OR (มุมมอง 3 รองรับสิ่งนี้) ฉันต้องใช้โอเปอเรเตอร์ "มีคำใด ๆ " สำหรับทั้งสองฟิลด์มิฉะนั้นข้อความค้นหาไม่ได้ผลลัพธ์ที่ต้องการ
  3. สร้างตัวกรอง "ทั่วโลก: เติมตัวกรอง" เพิ่มเขตข้อมูลสองแห่งลงในช่องนี้แล้วเปิดมัน

นี่เป็นวิธีแก้ปัญหาอย่างรวดเร็วโดยไม่ต้องเขียนโค้ดอย่างหนัก
นี่คือการอ้างอิงที่เป็นประโยชน์อื่น ๆ


ฉันไม่คิดว่าคุณต้องใช้ขั้นตอนที่ 2 - ฉันติดตั้งโมดูลและใช้ "Global: รวมตัวกรองเขตข้อมูล" ที่ถูกเปิดเผย ฉันเลือกสองฟิลด์ภายในการตั้งค่าของฟิลด์ที่รวมกันนั้น
Laryn - CEDC.org

13

ในการติดตั้งของฉัน D7 พร้อม Views 7.x-3.6 คุณสามารถเพิ่มตัวกรองที่เป็น "Global: รวมตัวกรองเขตข้อมูล" ซึ่งจะทำสิ่งที่คุณต้องการอย่างแน่นอนอนุญาตให้ผู้ใช้ค้นหาหลายเขตข้อมูลด้วยตัวกรองเดียว


1
นี่ควรเป็นคำตอบที่ได้รับการยอมรับ
frazras

5

มันง่ายมาก

  1. คลิกที่เพิ่มตัวกรอง
  2. เลือก "Global: รวมตัวกรองเขตข้อมูล"
  3. ปฏิบัติตามคำสั่ง.

ขอบคุณ


2

ทำงานนอกกรอบ

วิธีที่ง่ายที่สุดที่จะไปคือการใช้'เงื่อนไขการค้นหา'กรองซึ่งเป็นผู้ชมการทำงานหลัก มันจะค้นหาผ่านทุกสาขาของเอนทิตีและส่งคืนผลลัพธ์ไม่จำเป็นต้องมีโมดูลพิเศษ!

  1. ไปที่มุมมองของคุณ
  2. เพิ่มตัวกรองใหม่เพื่อดู
  3. เลือก 'ค้นหา: คำค้นหา'

ไม่เป็นไร (คุณอาจต้องการให้มันสัมผัส)

มันทำงานได้ดีมากเช่นกัน


0

คุณสามารถใช้ hook_views_pre_execute (& $ view) เพื่อขยายเงื่อนไขเดียวของคุณไปยังหลาย ๆ ฟิลด์ที่คุณต้องการ

/**
 * 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);
        }
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.