コード例 #1
0
 /**
  * Получение списка пользователей.
  *
  * @todo кеш и js
  * 
  * @param string $s        - поисковая строка
  * @param string $limit    - сколько записей запрашивать
  * @param int    $userType - фильтр результатов поиска:  0 - искать и фриленсеров и работодателей,   
  *                         1 - искать только фриленсеров,
  *                         2 - искать только работодателей,
  * @param int    $scope    - определяет, где искать:  0 - в СБР/контактах и общем списке пользователей,
  *                         1 - в СБР/контактах,
  *                         2 - в общем списке пользователей
  *
  * @return string - список пользователей в формате JSON
  */
 public function getUsersList($s, $limit = 'ALL', $userType = 0, $scope = 0)
 {
     session_start();
     $uid = get_uid(false);
     $result = array();
     $contacts = array();
     $more = array();
     // подготовка строки для поиска в shpinx
     if ($s != '') {
         $s = iconv('UTF-8', 'WINDOWS-1251//IGNORE', $s);
         $s = substr(trim($s), 0, 60);
         $r = preg_split("/\\s+/", $s);
         $s = '';
         // если введено два слова, то пологаем что это имя и фамилия и обрабатываем вариант такого поиска особо
         // если одно из слов состоит только из /^[-_a-z0-9]+$/i также полагаем что это может быть часть логина
         if (count($r) == 2) {
             $s = "(@uname {$r[0]} & (@usurname *{$r[1]}* | @usurname {$r[1]})) | (@usurname {$r[0]} & (@uname *{$r[1]}* | @uname {$r[1]}))";
             if (preg_match('/^[-_a-z0-9]+$/i', $r[0])) {
                 $s .= " | (@login *{$r[0]}* & (@uname *{$r[1]}* | @usurname *{$r[1]}*)) | @login *{$r[0]}*";
             }
             if (preg_match('/^[-_a-z0-9]+$/i', $r[1])) {
                 $s .= " | (@login *{$r[1]}* & (@uname {$r[0]} | @usurname {$r[0]})) | @login *{$r[1]}*";
             }
             // во всех остальных случаях полагаем что все слова кроме последнего введены полностью и просто ищем совпадения
         } else {
             for ($i = 0; $i < count($r) - 1; ++$i) {
                 $s .= "{$r[$i]} | ";
             }
             $s .= "*{$r[$i]}* | {$r[$i]}";
         }
     }
     // если нужны контакты в сбр и личке, то получаем их id
     if ($scope == 0 || $scope == 1) {
         // контакты в сбр
         $memBuff = new memBuff();
         $contacts = $memBuff->get("bComboUsers{$uid}");
         if ($contacts === false) {
             if (is_emp()) {
                 $sbr = new sbr_emp($uid);
             } else {
                 $sbr = new sbr_frl($uid);
             }
             $contacts = $sbr->getPartersId();
             // контакты в личке
             $mess = new messages();
             $rows = $mess->GetContacts($uid);
             for ($i = 0; $i < count($rows); ++$i) {
                 if (!in_array($rows[$i]['uid'], $contacts)) {
                     $contacts[] = $rows[$i]['uid'];
                 }
             }
             $memBuff->set("bComboUsers{$uid}", $contacts, 600);
         }
     }
     // $i = 0-контакты, 1-остальные пользователи
     for ($i = 0; $i <= 1; ++$i) {
         if (!$i && !$contacts) {
             continue;
         }
         $rows = array();
         // если поиск не требуется
         if ($s == '') {
             if (!$i) {
                 if ($userType) {
                     $table = $userType == 2 ? 'employer' : 'freelancer';
                 } else {
                     $table = 'users';
                 }
                 $rows = users::GetUsersInfoByIds($limit == 'ALL' ? $contacts : array_slice($contacts, 0, $limit), $table);
             }
             // если требуется
         } else {
             $filter = array();
             if ($contacts) {
                 if (!$i) {
                     $filter['uids'] = $contacts;
                 } else {
                     $filter['nouids'] = $contacts;
                 }
             }
             if ($userType) {
                 $filter['utype'] = $userType - 1;
             }
             $search = new search(get_uid(false));
             $search->addElement('users_simple', true);
             $search->search($s, 0, $filter, $limit == 'ALL' ? 1000 : $limit);
             $res = $search->getElements();
             $rows = $res['users_simple']->getRecords();
             $more[$i] = $res['users_simple']->total - count($rows);
         }
         // готовим вывод
         foreach ($rows as $k => $v) {
             if ($v['uid'] == null) {
                 $v['uid'] = $v['id'];
             }
             $v['uname'] = iconv('WINDOWS-1251', 'UTF-8//IGNORE', $v['uname']);
             $v['usurname'] = iconv('WINDOWS-1251', 'UTF-8//IGNORE', $v['usurname']);
             if ($v['photo']) {
                 $v['path'] = 'users/' . substr($v['login'], 0, 2) . '/' . $v['login'] . '/foto';
                 $v['photo'] = get_unanimated_gif($v['login'], $v['photo']);
             } else {
                 $v['photo'] = '/images/temp/small-pic.gif';
             }
             $v['isContacts'] = (int) (!(bool) $i);
             $result[] = $v;
         }
     }
     //return $result;
     // выводим
     $data = array('list' => $result, 'counters' => array('moreContacts' => $more[0], 'moreUsers' => $more[1]), 'dav' => WDCPREFIX);
     return json_encode($data);
 }