Hiển thị bộ lọc đơn kết hợp của hai trường trong dạng xem


24

Tôi có hai trường hồ sơ người dùng "Họ" và "Tên". Tôi cũng có một danh sách người dùng xem. Tôi muốn hiển thị "Tên" dưới dạng bộ lọc có thể tìm kiếm cả Họ và Tên. Làm cách nào tôi có thể thực hiện một bộ lọc kết hợp của hai trường đó? Tôi có thể tạo nó từ lượt xem UI không?

Một cách có thể là tạo một trường hồ sơ khác "Tên" sẽ được ẩn trong biểu mẫu. Khi lưu người dùng, tôi sẽ kết hợp hai giá trị trường vào trường "Tên" và sau đó hiển thị nó dưới dạng bộ lọc trong chế độ xem. Nhưng giải pháp này là mã hóa cứng và nó cần phải viết hook.


Hãy xem câu hỏi này drupal.stackexchange.com/questions/42366/ Đổi Có lẽ nó có thể giúp bạn. Và không, bạn phải làm một mô-đun. Oskar
Oskar Calvo


Tính năng này được xây dựng trong mô-đun lượt xem. Nó yêu cầu lập trình bằng không. Video youtube này cho thấy một ví dụ đầy đủ về cách sử dụng nó.
asiby

Câu trả lời:


21

Cuối cùng tôi đã có một giải pháp từ điều này . Tôi đã làm theo giải pháp chính thứ hai được cung cấp mặc dù cá nhân blogger đã sử dụng hook_views_query_alter().

  1. đã cài đặt mô-đun Chế độ xem bộ lọc .
  2. đã thêm hai bộ lọc "Tên" và "Họ" (cả hai không được hiển thị) và thêm chúng vào nhóm bộ lọc OR (Chế độ xem 3 hỗ trợ điều này). Tôi đã phải sử dụng toán tử "Chứa bất kỳ từ nào" cho cả hai trường, nếu không thì truy vấn không cho tôi kết quả mong muốn.
  3. đã tạo bộ lọc "Toàn cầu: bộ lọc dân cư", thêm hai trường vào đây và hiển thị nó.

Điều này đã cho tôi một giải pháp nhanh chóng mà không cần mã hóa cứng.
Đây là tài liệu tham khảo hữu ích khác.


Tôi không nghĩ bạn cần sử dụng bước 2 - Tôi đã cài đặt mô-đun và sử dụng "Toàn cầu: bộ lọc trường kết hợp" đã bị lộ. Tôi đã chọn hai trường trong cài đặt của trường kết hợp đó.
Laryn - CEDC.org

13

Trong cài đặt của tôi, D7 với Lượt xem 7.x-3.6, bạn có thể thêm bộ lọc là "Toàn cầu: Bộ lọc trường kết hợp" sẽ thực hiện chính xác những gì bạn cần, cho phép người dùng tìm kiếm trên nhiều trường bằng một bộ lọc.


1
Đây phải là câu trả lời được chấp nhận
frazras

5

Nó thực sự dễ dàng.

  1. Nhấp vào Thêm bộ lọc.
  2. chọn "Toàn cầu: Kết hợp bộ lọc trường"
  3. Làm theo chỉ dẫn.

Cảm ơn.


2

sáng tạo

Cách dễ nhất để sử dụng là sử dụng bộ lọc 'Điều khoản tìm kiếm'chức năng cốt lõi của Chế độ xem . Nó sẽ tìm kiếm thông qua tất cả các trường của thực thể và trả về kết quả, không cần thêm mô-đun nào!

  1. Đi đến xem của bạn
  2. Thêm bộ lọc mới để xem
  3. Chọn 'Tìm kiếm: Điều khoản tìm kiếm'

Đó là, không có gì khác để làm (bạn có thể muốn phơi bày nó)

Nó thực hiện rất tốt quá.


0

Bạn có thể sử dụng hook_view_pre_execute (& $ view) để mở rộng điều kiện duy nhất của bạn sang nhiều trường bạn muốn

/**
 * 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);
        }
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.