/** * Получение списка пользователей. * * @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); }
/** * Возвращает родстер (список контактов) пользователя. * * @param stdClass $attr - список параметров * string type : all - вернуть всех пользователей, active - вернуть только "активных". * Обязательные параметр. @see self::ACTIVE_CONTACT * integer online: 1 - возвращать только пользователей находящихся на сайте, 0 - всех * * @return array - массив с пользователями */ protected function _ceContacts($attr) { global $session; $messages = new messages(); if (is_emp($this->_uid)) { $sbr = new sbr_emp($this->_uid); } else { $sbr = new sbr_frl($this->_uid); } $rows = array_merge($messages->GetContacts($this->_uid), $sbr->getContacts()); $uids = array(); $res = array(); foreach ($rows as $row) { if (in_array($row['uid'], $uids) || $row['login'] == 'admin') { continue; } $uids[] = $row['uid']; if ($attr->type == 'active' && (isset($row['my_last_post']) || isset($row['his_last_post']))) { $last = max(strtotime($row['my_last_post']), strtotime($row['his_last_post'])); if ($last + self::ACTIVE_CONTACT < time()) { continue; } } $session->view_online_status($row['login']); $row['online'] = $session->is_active; if (!empty($attr->online) && !$row['online']) { continue; } $res[] = array('uid' => $row['uid'], 'name' => $row['uname'] ? iconv('CP1251', 'UTF-8', $row['uname'] . ' ' . $row['usurname']) : $row['login'], 'login' => $row['login'], 'online' => (int) $row['online'], 'avatar' => $row['photo'] ? WDCPREFIX . '/users/' . $row['login'] . '/foto/sm_' . $row['photo'] : '', 'emp' => (int) is_emp($row['role']), 'pro' => (int) ($row['is_pro'] == 't')); } return $res; }
/** * Изменение бана пользователя * * @param string $sUsers JSON строка с массивом UID пользователей * @param int $nActId * @param string $sReasonTxt причина * @param int $nReasonId ID причины, если она выбрана из списка (таблица admin_reasons) * @param int $nNoSend опционально. установить в 1 если не нужно оповещать юзера о том что он забанен. * @param string $sContext Контекст (для лога админских действий) * @param $sContext * @param bool $noticeSbrPartners уведомить партнеров по сделке о блокировке аккаунта * @return object xajaxResponse */ function updateUserBan($sUsers = '', $nActId, $sReasonTxt = '', $nReasonId = null, $sDateTo = '', $nNoSend = 0, $sContext = '', $noticeSbrPartners = false) { session_start(); $objResponse = new xajaxResponse(); if (hasPermissions('users')) { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/users.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/messages_spam.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/messages.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/sbr_emp.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/sbr_frl.php'; $objUser = new users(); $nReasonId = $nReasonId ? $nReasonId : null; $aContext = _jsonArray($sContext); $aContext = $aContext ? $aContext : array('uid' => '', 'code' => 0, 'link' => '', 'name' => ''); $aUsers = _jsonArray($sUsers); $bCheck = true; if ($aContext['uid'] == 'moder') { global $user_content; $bCheck = $user_content->checkContent($aContext['contentId'], $aContext['streamId'], $aContext['recId']); } if ($bCheck && $aUsers && hasPermissions('users')) { foreach ($aUsers as $sUid) { $objUser->GetUserByUID($sUid); if ($objUser->uid) { $sReason = str_replace('%USERNAME%', $objUser->uname . ' ' . $objUser->usurname, $sReasonTxt); $sReason = change_q($sReason, FALSE, 0, TRUE); $sUniqId = "userban_{$sUid}"; $sObjName = $objUser->uname . ' ' . $objUser->usurname . '[' . $objUser->login . ']'; $sObjLink = '/users/' . $objUser->login; if ($nActId == 1) { // разблокируем if ($objUser->is_banned || $objUser->ban_where) { if ($objUser->is_banned) { $objResponse->script("\$\$('.warnbutton-{$sUid}').setStyle('display','');"); $objResponse->script("\$\$('.warnlist-{$sUid}').set('html','');"); $objResponse->script("\$\$('span[id^=\"warn_{$user->uid}\"]').set('html', '0')"); $objResponse->script("\$\$('div[id^=\"warn_{$user->uid}\"]').set('html', '0')"); } //$objUser->ban_where = 0; $objUser->unsetUserBan($sUid, $objUser->ban_where); // пишем лог админских действий $nLogActId = $objUser->is_banned ? 4 : 6; if ($objUser->self_deleted == 't') { $nLogActId = admin_log::ACT_ID_RESTORE_ACC; } admin_log::addLog(admin_log::OBJ_CODE_USER, $nLogActId, $sUid, $sUid, $sObjName, $sObjLink, 0, '', $nReasonId, $sReason); } $objResponse->script("\$\$('.warnlink-{$sUid} a').set('html','Забанить!');"); $objResponse->script("\$\$('.comm-ban-{$sUid} a').set('html','Заблокировать');"); $objResponse->script("\$\$('.admin-block h4 em').setStyle('display','none');"); if ($objUser->uid == $aContext['uid']) { $objResponse->script("\$('banreasonblock-{$objUser->uid}').setStyle('display','none');"); } $warns = $objUser->GetWarns($sUid); $warncount = $warns ? count($warns) : 0; $objResponse->script("if(\$('warncount-{$sUid}')) { \$('warncount-{$sUid}').set('html', {$warncount}); }"); } else { if ($sDateTo) { $sError = ''; $aDate = explode('-', $sDateTo); if (!$aDate[1] || !$aDate[2] || !$aDate[0] || !checkdate($aDate[1], $aDate[2], $aDate[0])) { $sError = 'Укажите корректную конечную дату'; } elseif (($toRes = strtotime($sDateTo)) <= time()) { $sError = 'Укажите конечную дату в будущем'; } if ($sError) { $objResponse->alert($sError); $objResponse->script("\$('ban_btn').set( 'disabled', false );\$('ban_btn').set( 'value', 'Сохранить' );"); return $objResponse; } } if ($objUser->is_banned || $objUser->ban_where) { // редактируем текущую блокировку $nBanWhere = $nActId == 3 ? 0 : 1; $objUser->updateUserBan($sUid, $objUser->ban_where, $nBanWhere, $sReason, $nReasonId, $sDateTo); } else { $nBanWhere = $nActId == 3 ? 0 : 1; $sBanId = $objUser->setUserBan($sUid, $nBanWhere, $sReason, $nReasonId, $sDateTo, $nNoSend); // пишем лог админских действий admin_log::addLog(admin_log::OBJ_CODE_USER, $nActId, $sUid, $sUid, $sObjName, $sObjLink, $aContext['code'], $aContext['link'], $nReasonId, $sReason, $sBanId, $aContext['name']); // уведомляем партнеров по сбр if ($noticeSbrPartners) { if (is_emp($objUser->role)) { $sbr = new sbr_emp($sUid); } else { $sbr = new sbr_frl($sUid); } $sbrPartners = $sbr->_new_getOpenSbrPartners(); $messages = new messages(); $messages->yourSbrPartnerIsBanned($sbrPartners, $objUser->login); } $objResponse->script("\$\$('.warnlink-{$sUid} a').set('html','Разбанить');"); $objResponse->script("\$\$('.comm-ban-{$sUid} a').set('html','Разблокировать');"); if (!$nBanWhere) { $GLOBALS['session']->nullActivityByLogin($objUser->login); // статус присутсвия ------ $online_status = $GLOBALS['session']->view_online_status($objUser->login, false); $ago = $GLOBALS['session']->ago; if (!$GLOBALS['session']->is_active && $objUser->last_time) { $fmt = 'ynjGi'; if (time() - ($lt = strtotime($objUser->last_time)) > 24 * 3600) { $fmt = 'ynjG'; if (time() - $lt > 30 * 24 * 3600) { $fmt = 'ynj'; } } $ago = ago_pub($lt, $fmt); } if (!$ago) { $ago = "менее минуты"; } $online_status .= ' <span class="' . ($GLOBALS['session']->is_active ? 'u-act' : '') . '">' . ($GLOBALS['session']->is_active ? 'на сайте' : 'Был' . ($objUser->sex == 'f' ? 'а' : '') . ' на сайте: ' . $ago . ' назад') . '</span>'; //------------------------- $objResponse->script("\$\$('.colB .bBA').set('html','{$online_status}');"); } } $warns = $objUser->GetWarns($sUid); $warncount = $warns ? count($warns) : 0; $objResponse->script("if(\$('warncount-{$sUid}')) { \$('warncount-{$sUid}').set('html', {$warncount}); }"); $sDisplay = $nBanWhere = $nActId == 3 ? 'none' : ''; if ($sDisplay == '' && $warncount == 3) { $sDisplay = 'none'; } $objResponse->script("\$\$('.warnbutton-{$sUid}').setStyle('display','{$sDisplay}');"); if ($objUser->uid == $aContext['uid']) { $sDateToParts = preg_split("/-/", $sDateTo); $admin_info = $objUser->getName(get_uid(), $ee); $objResponse->assign('banreasonblock-text-' . $objUser->uid, 'innerHTML', 'Блокировка ' . ($nBanWhere ? 'везде' : 'в блогах') . ' ' . ($sDateTo ? 'до ' . $sDateToParts[2] . ' ' . monthtostr($sDateToParts[1], true) . ' ' . $sDateToParts[0] : 'навсегда')); $objResponse->assign('banreasonblock-comment-' . $objUser->uid, 'innerHTML', reformat($sReason, 50)); $objResponse->assign('banreasonblock-date-' . $objUser->uid, 'innerHTML', date("d.m.Y H:i")); $objResponse->assign('banreasonblock-admin-' . $objUser->uid, 'innerHTML', $admin_info['login']); $objResponse->assign('banreasonblock-admin-' . $objUser->uid, 'href', '/users/' . $admin_info['login']); $objResponse->script("\$('banreasonblock-{$objUser->uid}').setStyle('display','block');"); } // удаляем все жалобы на спам для юзера $oSpam = new messages_spam(); $oSpam->deleteSpamBySpamer($sUid, 3); } $objResponse->script("delete banned.buffer['userban_{$sUid}'];"); $str = "<b>Пользователь забанен</b>"; if ($objUser->is_banned) { $str = ""; } $objResponse->script("\n if (\$('user_banned_" . $objUser->uid . "')) { \n \t\$('user_banned_" . $objUser->uid . "').set('html', '{$str}');\n }else {\n \tvar p = \$('user_first_paragraph_" . $objUser->uid . "'); \t\n \tif (p) {\n \t\tvar span = new Element('span', {\"style\":\"color:#000\", \"id\":\"user_banned_" . $objUser->uid . "\"});\n \t\tspan.inject(p, 'bottom');\n\t\t\t\t\t\t\tspan.set('html', '{$str}'); \t\t\n \t}\n }\n "); } } } if ($aContext['uid'] == 'gray_ip') { $objResponse->script('if(window.opener){window.opener.window.location.reload(true);}'); } $objResponse->script("\$\$(\"div[id^='ov-notice']\").setStyle('display', 'none');"); $objResponse->script("\$('ov-notice22').toggleClass('b-shadow_hide');"); $objResponse->script("if(banned.reload==1){window.location.reload(true);}"); $objResponse->script("if(banned.zero){banned.zeroShow();}"); $objResponse->script("if(typeof(adminLogCheckUsers)!='undefined'){adminLogCheckUsers(false);};if(\$('chk_all')){\$('chk_all').checked=false;};"); if ($aContext['uid'] == 'admin_log_page' || $aContext['uid'] == 'admin_user_search') { $objResponse->script('window.location.reload(true)'); } if ($aContext['uid'] == 'moder') { // если бан делается из потока модерирования $objResponse->script('user_content.resolveContent(user_content.resolveSid, 2, user_content.resolveUid)'); $objResponse->script("parent.\$\$(\"div[id^='ov-notice']\").setStyle('display', 'none');"); $objResponse->script("parent.\$('ov-notice22').toggleClass('b-shadow_hide');"); } } return $objResponse; }