web-dev-qa-db-ja.com

ビューで2つのフィールドの組み合わせの単一のフィルターを公開する

「姓」と「名」の2つのユーザープロファイルフィールドがあります。ユーザーリストビューもあります。姓と名の両方を検索できるフィルターとして「名前」を公開したい。これらの2つのフィールドの組み合わせの単一のフィルターを実行するにはどうすればよいですか?ビューUIから作成できますか?

1つの可能な方法は、フォームで非表示になる別のプロファイルフィールド「名前」を作成することです。ユーザーの保存時に、2つのフィールド値を「名前」フィールドに結合し、ビューでフィルターとして公開します。しかし、このソリューションはハードコーディングであり、フックを記述する必要があります。

24
Sithu

私は最終的に this から解決策を得ました。ブロガーは個人的にhook_views_query_alter()を使用しましたが、私は提供された2番目の主要なソリューションに従いました。

  1. インストールされたモジュール ビューフィルターが読み込まれます
  2. 「First Name」と「Last Name」の2つのフィルターを追加し(どちらも公開しないでください)、これらをORフィルターグループに追加しました(ビュー3はこれをサポートしています)。オペレーターを使用する必要がありました "両方のフィールドに「任意の単語が含まれています」が含まれていない場合、クエリで希望する結果が得られませんでした。
  3. フィルター「グローバル:フィルターの設定」を作成し、これに2つのフィールドを追加して公開しました。

これにより、ハードコーディングなしで迅速な解決策が得られました。
ここ は他の参考資料です。

21
Sithu

私のインストールであるD7とViews 7.x-3.6では、「グローバル:フィールドの結合フィルター」であるフィルターを追加できます。これは、ユーザーが必要なことを正確に実行し、ユーザーが単一のフィルターで複数のフィールドを検索できるようにします。

13
Mona

とても簡単です。

  1. [フィルターの追加]をクリックします。
  2. 「グローバル:フィールド結合フィルター」を選択します
  3. 指示に従ってください。

ありがとう。

5

すぐに使える

最も簡単な方法は、ビューである 'Search Terms' フィルターを使用することですコア機能。エンティティのすべてのフィールドを検索して結果を返します。追加のモジュールは必要ありません。

  1. ビューに移動
  2. 表示する新しいフィルターを追加
  3. 「検索:検索語句」を選択します

それだけです。他に何もする必要はありません(ただし、公開したい場合もあります)。

それも非常によく機能します。

2
Larzan

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