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


24

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

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


この質問を見てくださいdrupal.stackexchange.com/questions/42366/…たぶんそれはあなたを助けることができます。いいえ、モジュールを作成する必要があります。オスカー
オスカーカルボ


この機能は、ビューモジュールに組み込まれています。プログラミングは不要です。このyoutubeビデオは、使用方法の完全な例を示しています。
asiby

回答:


21

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

  1. モジュールビューフィルターを実装します。
  2. 2つのフィルター「名」と「姓」を追加し(両方を公開しないでください)、ORフィルターグループに追加しました(ビュー3はこれをサポートします)。両方のフィールドに「任意の単語を含む」演算子を使用する必要がありました。そうしないと、クエリで希望する結果が得られませんでした。
  3. 「Global:populate filters」というフィルターを作成し、2つのフィールドを追加して公開しました。

これにより、ハードコーディングなしで迅速なソリューションが得られました。その他の参考資料を
次に示します。


手順2を使用する必要はないと思います-モジュールをインストールし、公開された "グローバル:フィールドの結合フィルター"を使用しました。その結合フィールドの設定内で2つのフィールドを選択しました。
ラリン-CEDC.org 15年

13

私のインストール、ビュー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.