Ejemplo n.º 1
0
 /**
  * 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);
 }