/** * Напрямую установить номер сообщества при своей сортировке в звкладке "Я вступил". * * @param int $sCommId сообщество котоое перемещаем * @param int $nOldNum текущий номер сообщества * @param int $nNum номер который желаем присвоить * @param int $total общее количество сообществ * @param string $group_id код группы для перерисовки списка в случае успеха * @param string $sub_om код дополнительного условия сортировки или вкладки для перерисовки списка в случае успеха * @param int $page номер страницы для перерисовки списка в случае успеха * * @return object xajaxResponse */ function CommuneSetPosition($sCommId = '', $nOldNum = 0, $nNum = 0, $total = 0, $group_id = 0, $sub_om = '', $page = 1) { global $session; session_start(); $objResponse = new xajaxResponse(); $sUserId = get_uid(false); if ($sCommId && $sUserId && !intval($nNum)) { $objResponse->script("\$('commune_set_order_{$sCommId}').setStyle('display', 'none');"); $objResponse->assign('position_time_' . $sCommId, 'value', ''); return $objResponse; } if (commune::CommuneSetPosition($sCommId, $sUserId, $nOldNum, $nNum, $total)) { // была перенумерация: обновляем список $group_id = $group_id ? $group_id : null; return CommuneGetList($group_id, $sub_om, $page); } // перенумерации не было: просто закрываем попап $objResponse->script("\$('commune_set_order_{$sCommId}').setStyle('display', 'none');"); $objResponse->assign('position_time_' . $sCommId, 'value', ''); return $objResponse; }
/** * Напрямую установить номер сообщества при своей сортировке в звкладке "Я вступил" * * @param int $sCommId сообщество котоое перемещаем * @param int $sUserId текущий юзер * @param int $nCurrNum текущий номер сообщества * @param int $nNum номер который желаем присвоить * @param int $nTotal общее количество сообществ * @return bool true on sussess or false on failure */ function CommuneSetPosition($sCommId = '', $sUserId = '', $nCurrNum = 0, $nNum = 0, $nTotal = 0) { $nNum = intval($nNum); if (!$sCommId || !$sUserId || !$nCurrNum || !$nNum) { // ошибка ввода return false; } if ($nNum < 1) { // желаем присвоить номер 0 или еще меньше return false; } $nNum = $nNum > $nTotal ? $nTotal : $nNum; if ($nNum == $nCurrNum) { // мы желаем присвоить такой же номер как был - нечего менять return false; } global $DB; $nLimit = 2; $nOffset = $nCurrNum > $nNum ? $nNum - 1 : $nNum; $nOffset--; if ($nOffset < 0) { $nOffset = 0; $nLimit = 1; } $sQuery = "SELECT COALESCE(position_time, accepted_time) AS pos \n FROM commune_members WHERE user_id = ? AND is_accepted = true AND is_deleted = false AND is_banned = false \n ORDER BY pos DESC LIMIT {$nLimit} OFFSET {$nOffset}"; $aRows = $DB->rows($sQuery, $sUserId); if ($DB->error) { // ошибка return false; } $nCnt = count($aRows); if ($nCnt) { if ($nCnt > 1) { // получили 2 строки: вычисляем середину и присваем ее сообществу $nStart = strtotime($aRows[0]['pos']); $nEnd = strtotime($aRows[1]['pos']); $nMiddle = ceil(($nStart + $nEnd) / 2); $sDate = date('Y-m-d H:i:s', $nMiddle); if ($sDate == $aRows[0]['pos'] || $sDate == $aRows[1]['pos']) { // даты сомкнулись: требуется пересчет позиций if (commune::CommuneCalculatePositions($sUserId)) { return commune::CommuneSetPosition($sCommId, $sUserId, $nNum); } else { // не пересчитали return false; } } } else { // поместить в начало либо в конец списка $sDate = $nCurrNum > $nNum ? date('Y-m-d H:i:s') : date('Y-m-d H:i:s', strtotime($aRows[0]['pos'] . ' -1 week')); } $sQuery = 'UPDATE commune_members SET position_time = ? WHERE commune_id = ? AND user_id = ?'; $DB->query($sQuery, $sDate, $sCommId, $sUserId); if ($DB->error) { // ошибка return false; } } else { // ошибка return false; } return true; }