뷰에서 두 필드 조합의 단일 필터 노출


24

"성"과 "이름"이라는 두 가지 사용자 프로필 필드가 있습니다. 또한 사용자 목록보기가 있습니다. 성 및 이름을 모두 검색 할 수있는 필터로 "이름"을 표시하고 싶습니다. 이 두 필드를 조합하여 단일 필터를 사용하려면 어떻게해야합니까? 뷰 UI에서 만들 수 있습니까?

한 가지 가능한 방법은 양식에 숨겨 질 다른 프로파일 필드 "이름"을 만드는 것입니다. 사용자 저장시 두 필드 값을 "이름"필드에 결합한 다음 뷰에서 필터로 표시합니다. 그러나이 솔루션은 하드 코딩이므로 후크를 작성해야합니다.


이 질문 drupal.stackexchange.com/questions/42366 / ...을 살펴보십시오. 아마도 도움이 될 것입니다. 그리고 아니요, 모듈을 만들어야합니다. Oskar
Oskar Calvo


이 기능은 views 모듈에 내장되어 있습니다. 프로그래밍이 필요 없습니다. 이 youtube 비디오 는 사용 방법에 대한 완전한 예를 보여줍니다.
asiby

답변:


21

나는 결국 이것 으로부터 해결책을 얻었다 . 블로거가 개인적으로 사용했지만 제공 한 두 번째 기본 솔루션을 따랐습니다 hook_views_query_alter().

  1. 모듈 보기 필터 채우기 설치 .
  2. 두 개의 필터 "이름"과 "성"(둘 다 노출되지 않아야 함)을 추가하고 OR 필터 그룹에 추가했습니다 (보기 3에서 지원). 두 필드에 대해 "단어 포함"연산자를 사용해야했습니다. 그렇지 않으면 쿼리에서 원하는 결과를 얻지 못했습니다.
  3. "전역 : 필터 채우기"필터를 작성하고 여기에 두 필드를 추가하고 노출했습니다.

이것은 하드 코딩없이 빠른 솔루션을 제공했습니다. 다른 유용한 참고 자료는
다음과 같습니다 .


2 단계를 사용할 필요가 없다고 생각합니다. 모듈을 설치하고 노출 된 "전역 : 필드 결합 필터"를 사용했습니다. 해당 결합 된 필드의 설정 내에서 두 개의 필드를 선택했습니다.
Laryn-CEDC.org

13

내 설치에서 Views 7.x-3.6이 포함 된 D7에서 "전역 : 필드 결합 필터"필터를 추가하면 필요한 것을 정확하게 수행 할 수 있으므로 사용자는 단일 필터로 여러 필드를 검색 할 수 있습니다.


1
이것은 정답
frazras

5

정말 쉽습니다.

  1. 필터 추가를 클릭하십시오.
  2. "글로벌 : 필드 결합 필터"를 선택하십시오.
  3. 지시를 따르다.

감사.


2

즉시 사용 가능

가장 쉬운 방법 은 Views 핵심 기능인 '검색어' 필터를 사용하는 것입니다 . 엔티티의 모든 필드를 검색하여 추가 모듈이 필요하지 않은 결과를 반환합니다!

  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.