/** * Returns a snippet of an sql WHERE clause to filter users whose (visible) * names match the terms in a given query string. */ function name_search_sql($query_string, $usralias = 'u', $usrprefalias = 'h') { safe_require('artefact', 'internal'); // Get the list of searchable profile fields from the internal artefact $required = array_keys(ArtefactTypeProfile::get_always_searchable_fields()); $optional = array_diff(array_keys(ArtefactTypeProfile::get_searchable_fields()), $required); $required[] = 'username'; // Not a profile field, but used in the search query. // Get a list of match expressions to use in the WHERE clause $matches = new StdClass(); foreach (array_merge($required, $optional) as $f) { $matches->{$f} = self::match_user_field_expression($f, $usralias); } $querydata = self::split_query_string(strtolower(trim($query_string))); $hidenameallowed = get_config('userscanhiderealnames') ? 'TRUE' : 'FALSE'; $searchusernamesallowed = get_config('searchusernames') ? 'TRUE' : 'FALSE'; $termsql = "{$matches->preferredname}\n OR (\n ({$usralias}.preferredname IS NULL OR {$usralias}.preferredname = '' OR NOT {$hidenameallowed} OR {$usrprefalias}.value != '1' OR {$usrprefalias}.value IS NULL)\n AND ({$matches->firstname} OR {$matches->lastname})\n )\n OR ({$searchusernamesallowed} AND {$matches->username})"; if ($optional) { foreach ($optional as $f) { $termsql .= "\n OR {$matches->{$f}}"; } } $where = ''; $values = array(); foreach ($querydata as $term) { $where .= ' AND ( ' . $termsql . ' )'; $values = array_pad($values, count($values) + 4 + count($optional), $term); } return array($where, $values); }