/** * Изменяет текущий бан пользователя. * * @param int $uid UID пользователя. * @param int $ban_where_old какой бан был: 0 - на всем сайте, 1 - в блогах. * @param int $ban_where_new какой бан будет: 0 - на всем сайте, 1 - в блогах. * @param string $reason причина * @param int $reason_id ID причины, если она выбрана из списка (таблица admin_reasons) * @param string $date_to дата окончания действия бана, или пустая строка если навсегда * * @return bool true - успех, false - провал */ public function updateUserBan($uid, $ban_where_old, $ban_where_new, $reason, $reason_id, $date_to = '') { $GLOBALS['DB']->start(); $date_to = $date_to ? $date_to : NULL; $sWhere = $ban_where_old ? 'b.where = 1 AND u.ban_where = 1' : '(b.where = 0 OR b.where IS NULL) AND u.is_banned = B\'1\''; $sQuery = 'UPDATE users_ban SET "to" = ?, reason = ?i, comment = ?, admin = ?i, "where" = ?i WHERE id = ( SELECT MAX(b.id) AS id FROM users_ban b INNER JOIN users u ON b.uid = u.uid WHERE b.uid = ?i AND ' . $sWhere . ' GROUP BY b.uid ) RETURNING id'; $sId = $GLOBALS['DB']->val($sQuery, $date_to, $reason_id, $reason, $_SESSION['uid'], $ban_where_new, $uid); if ($sId && !$GLOBALS['DB']->error && $ban_where_old != $ban_where_new) { // если вид бана изменился require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/smail.php'; $mail = new smail(); if ($ban_where_new) { // меняем на бан в блогах $GLOBALS['DB']->query('UPDATE users SET is_banned=B\'0\', ban_where = ?i WHERE uid=?i', $ban_where_new, $uid); if (!$GLOBALS['DB']->error) { $mail->SendBlogsBan2($uid, $reason); } } else { // меняем на бан на всем сайте $sSubscr = str_repeat('0', $GLOBALS['subscrsize']); $GLOBALS['DB']->query('UPDATE users SET is_banned=B\'1\', ban_where = 0, subscr=B\'' . $sSubscr . '\' WHERE uid=?i; UPDATE freelancer SET mailer=0 WHERE uid=?i;', $uid, $uid); if (!$GLOBALS['DB']->error) { $mail->SendBan2($uid, $reason); $this->_afterUserBan($uid); } } } if ($sId && !$GLOBALS['DB']->error) { $GLOBALS['DB']->commit(); return true; } else { $GLOBALS['DB']->rollback(); return false; } }