「姓」と「名」の2つのユーザープロファイルフィールドがあります。ユーザーリストビューもあります。姓と名の両方を検索できるフィルターとして「名前」を公開したい。これらの2つのフィールドの組み合わせの単一のフィルターを実行するにはどうすればよいですか?ビューUIから作成できますか?
1つの可能な方法は、フォームで非表示になる別のプロファイルフィールド「名前」を作成することです。ユーザーの保存時に、2つのフィールド値を「名前」フィールドに結合し、ビューでフィルターとして公開します。しかし、このソリューションはハードコーディングであり、フックを記述する必要があります。
私は最終的に this から解決策を得ました。ブロガーは個人的にhook_views_query_alter()
を使用しましたが、私は提供された2番目の主要なソリューションに従いました。
これにより、ハードコーディングなしで迅速な解決策が得られました。
ここ は他の参考資料です。
私のインストールであるD7とViews 7.x-3.6では、「グローバル:フィールドの結合フィルター」であるフィルターを追加できます。これは、ユーザーが必要なことを正確に実行し、ユーザーが単一のフィルターで複数のフィールドを検索できるようにします。
とても簡単です。
ありがとう。
最も簡単な方法は、ビューである 'Search Terms' フィルターを使用することですコア機能。エンティティのすべてのフィールドを検索して結果を返します。追加のモジュールは必要ありません。
それだけです。他に何もする必要はありません(ただし、公開したい場合もあります)。
それも非常によく機能します。
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);
}
}
}