$prof_link = htmlspecialchars($_GET['prof']); $prof_id = professions::GetProfId($_GET['prof']); $prof_group_parent_id = professions::GetProfGroupParentId($_GET['prof']); if (!$prof_id) { $prof_group_id = professions::GetProfGroupId($_GET['prof']); } } if (!$prof_id && !$prof_group_id) { $prof_link = ''; $_GET['region_filter_city'] = $_GET['region_filter_country']; $_GET['region_filter_country'] = $_GET['prof']; } } else { if (isset($_POST['prof'])) { if (preg_match("/^[0-9]+\$/", $_GET['prof'])) { $prof_id = intvalPgSql(trim($_POST['prof'])); } else { $prof_link = $_POST['prof']; $prof_id = professions::GetProfId($_POST['prof']); } } } //------------------------------------------------------------------------------ if (isset($_GET['profession_db_id']) && !($prof_id > 0 && $prof_id == $_GET['profession_db_id'] || $prof_group_id > 0 && $prof_group_id == $_GET['profession_db_id'])) { $link = null; if ($_GET['profession_db_id'] > 0) { if ($_GET['profession_column_id'] > 0) { $link = professions::GetProfLink($_GET['profession_db_id']); } else { $link = professions::GetGroupLink($_GET['profession_db_id']); }
<?php $rpath = '../'; $header = '../header.php'; $footer = '../footer.html'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/users.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/projects.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/projects_offers.php'; session_start(); $uid = get_uid(); $pid = intvalPgSql((int) trim($_GET['pid'])); $wid = intvalPgSql((int) trim($_GET['wid'])); $name = trim($_GET['user']); $user_obj = new users(); $user_obj->GetUser($name); $uid = $user_obj->GetUid($error, $name); $proj = array(); $proj = (array) $user_obj; // Проект. $obj_project = new projects(); $project = $obj_project->GetPrjCust($pid); if (!$project || !$user_obj->uid) { $fpath = '../'; include '../404.php'; exit; } else { // Предложения по данному проекту. $obj_offer = new projects_offers(); $offer = $obj_offer->GetPrjOffer($pid, $user_obj->uid); $width = $height = 0; if (!$offer) {
/** * Возвращает список проектов. * * @param integer $num_prjs возвращает кол-во проектов * @param integer|array $kind тип проектов (-1=5=Все проекты; 2=Конкурсы; 4=В офис; 6=Только для про) * если массив, то: array(тип, tops_only), где * tops_only: true, если нужно получить только закрепленные проекты. * @param integer $page страница проектов (кол-во проектов на странице PAGE_SIZE) * @param boolean $comments возвращать ли комментарии к проектам (проекты без Кандидат-Исполнитель) * @param array $filter массив с фильтром проектов * @param integer $prj_id ID проекта, если не NULL то берется тинформация только об одном проекте * @param integer $is_closed Конкурс или проект закрыт или нет * @param integer $to_date Брать проекты только до этой даты. * @param boolean $withouttop возвращать ли проекты не учитывая их закрепление * @return array массив с информацией о проектах */ function getProjects(&$num_prjs, $kind = -1, $page = 1, $comments = false, $filter = NULL, $is_blocked = true, $is_ajax = false, $prj_id = NULL, $is_closed = false, $to_date = NULL, $withouttop = false) { global $DB; list($kind, $tops_only) = (array) $kind; $is_emp = is_emp(); $is_moder = hasPermissions('projects'); $uid = $_SESSION['uid']; if ($uid && !$_SESSION['ph'] && !$is_ajax) { projects_filters::initClosedProjects(); } $phidd = $_SESSION['ph']; $filterSql = new_projects::createFilterSql($filter, $kind); $ret = NULL; $limit = $this->page_size; if ((int) $page < 1) { $page = 1; } $offset = $to_date ? 0 : ($page - 1) * $limit; $slimit = $limit + (int) (!!$filterSql); // для проверки, есть ли след. страница. $addit = ''; if ($filterSql) { if ($tops_only) { $addit = "(p.edit_date IS NOT NULL AND p.edit_date > NOW() - interval '2 month') AND "; } else { $addit = "(p.post_date > NOW() - interval '2 month') AND "; } } $addit .= (get_uid(false) ? '' : 'COALESCE(p.hide, false) = false AND ') . 'p.closed = false AND p.user_id <> 0 AND p.kind <> 9'; if ($is_closed) { $addit .= ' AND ( p.end_date > NOW() OR p.end_date IS NULL )'; } if ($kind == 6) { $addit .= ' AND p.pro_only = true'; } else { if ($kind == 2) { $addit .= " AND (p.kind = 2 OR p.kind = 7)"; } else { if ($kind != -1 && $kind != 5) { $addit .= " AND p.kind = '{$kind}'"; } } } if ($phidd && is_array($phidd)) { $hidden_projects = array(); foreach ($phidd as $pkey => $pvalue) { $hidden_projects[] = $pkey; } $addit .= ' AND p.id NOT IN (' . implode(',', $hidden_projects) . ')'; } if ($comments) { $comm = ' LEFT JOIN blogs_themes_old bt ON bt.id_gr = p.id AND bt.base = ' . ($kind == 2 ? 5 : 3); $sel = ', bt.thread_id, bt.messages_cnt - 1 as comm_count'; if ($uid) { $comm .= " LEFT JOIN projects_watch pw ON pw.user_id = {$uid} AND pw.prj_id = p.id "; $sel .= ', pw.status AS prj_status'; } } //выборка предложения по проекту пользователя if ($uid && !$is_emp) { $sel_offer = ", po.id as offer_id, po.refused, po.selected"; $join_offer = " LEFT JOIN projects_offers po ON po.project_id = p.id AND po.user_id = '{$uid}' "; } // исключаем заблокированные проекты $sel_blocked = ", pb.reason as blocked_reason, pb.blocked_time, pb.project_id::boolean as is_blocked"; $join_blocked = "LEFT JOIN projects_blocked pb ON p.id = pb.project_id "; if ($is_moder) { $sel_blocked .= ", admins.login as admin_login, admins.uname as admin_uname, admins.usurname as admin_usurname"; $join_blocked .= "LEFT JOIN users as admins ON pb.admin = admins.uid "; } else { $join_c_blocked = $join_blocked; $wb = "(" . ($is_emp ? "p.user_id = {$uid} OR " : "") . " pb.project_id IS NULL) "; $where_blocked = "WHERE {$wb}"; if ($filterSql) { $where_blocked = ""; } $where_c_blocked = "AND {$wb}"; if (!$is_blocked) { $join_is_blocked = $join_blocked; $where_is_blocked = "WHERE {$wb}"; $where_is_c_blocked = "AND {$wb}"; } } $offset = intvalPgSql((string) $offset); // условие, при котором проект в данный момент закреплен наверху ленты. $top_cond = ' ( (top_from IS NOT NULL AND now() BETWEEN top_from AND top_to) OR strong_top = 1 ) '; $top_payed_col = 'top_from'; if (!$tops_only) { // Закрепленные получаем отдельным запросом. if ($withouttop) { $top_cond = "NOT(1=0)"; $top_payed_col = "'epoch'"; $order = 'p.post_date DESC'; $tops = array(); $tops_cnt = 0; } else { $top_cond = "NOT({$top_cond})"; $top_payed_col = "'epoch'"; $order = 'p.strong_top DESC, p.post_date DESC'; $tops = $to_date ? array() : $this->getProjects($x, array($kind, true), 1, $comments, $filter, $is_blocked, $is_ajax, $prj_id); $tops_cnt = count($tops); } if ($offset >= $tops_cnt) { // Случай, когда топы не попадают на заданную страницу, но надо сдвинуть оффсет для // получения обычных проектов. $x_offset = $offset - ($tops_cnt > $slimit ? $slimit : $tops_cnt); $x_limit = $slimit; $tops = array(); } else { // когда топ-проектов больше чем помещается на одну страницу // по-любому все топы должны быть на первой странице, обычных проектов уже не будет if ($page === 1) { if ($tops_cnt > $limit) { $limit = $tops_cnt; $x_limit = 0; // обычных проектов уже не надо } else { $x_limit = $slimit - $tops_cnt; } } else { $x_limit = $slimit - (($tops_cnt > $offset ? $offset : $tops_cnt) - $offset); } $x_offset = 0; //$tops = array_splice($tops, $offset, $slimit); // не зыбываем оставлять один проверочный в конце. if ($x_limit < 0) { // Т.е. на странице вместились только топы. $x_limit = 0; } if ($page !== 1) { $tops = array(); } } $limit_str = "LIMIT {$x_limit} OFFSET {$x_offset}"; if ($to_date) { $where_date = $DB->parse(' AND p.post_date < ? ', $to_date); } } else { $order = 'p.strong_top DESC, sort_date ASC, p.post_date ASC'; //$order = 'p.strong_top DESC, p.top_from DESC, p.post_date ASC'; //$order = 'p.post_date DESC'; } if ($prj_id) { $prjid_sql = " AND p.id = " . intval($prj_id); $limit_str = ''; } // Показываем для всех, кроме модераторов и владельцев, только проект со статусом "Опубликован" (projects.state = 0) /* if (!$is_moder) { //$addit .= ' AND (p.state = 0 OR p.user_id = '.intval($uid).')'; $addit .= " AND NOT(p.payed = 0 AND p.kind = ".self::KIND_VACANCY." AND p.state = ".self::STATE_MOVED_TO_VACANCY.")"; } */ $sql = "\n SELECT p.*, {$top_payed_col} as top_payed, f.fname as logo_name, f.path as logo_path, NULL as category_name, city.city_name, country.country_name, e.login,\n e.uid, e.uname, e.usurname, e.warn, e.role, e.is_pro, e.is_team, e.email, e.is_banned, e.self_deleted, e.is_verify, e.photo, e.reg_date, e.modified_time, e.photo_modified_time, fl.is_banned as exec_is_banned \n {$sel_offer} {$sel} {$sel_blocked}\n FROM (\n -- этот запрос оптимизирован под индекс 'ix projects/main'.\n SELECT p.*,\n -- особая сортировка: железные проекты по возрастанию даты публикации, остальные закрепленные по убыванию даты закрепления\n CASE WHEN p.strong_top = 1 THEN (p.post_date - NOW()) ELSE (NOW() - p.top_from) END as sort_date\n FROM projects p {$join_is_blocked}\n WHERE {$addit} {$where_is_c_blocked} {$where_date} {$filterSql} AND {$top_cond} {$prjid_sql}\n ORDER BY {$order} {$limit_str}\n ) as p\n INNER JOIN\n employer e\n ON e.uid = p.user_id\n LEFT JOIN\n freelancer fl\n ON fl.uid = p.exec_id\n LEFT JOIN\n file_projects f\n ON f.id = p.logo_id\n LEFT JOIN \n city \n ON city.id = p.city\n LEFT JOIN \n country\n ON country.id = p.country\n {$join_blocked}\n {$join_offer}\n {$comm}\n {$where_blocked}\n ORDER BY {$order}"; $ret = $DB->rows($sql); if (($ret || $tops) && !$tops_only) { if ($tops) { $ret = array_merge($tops, $ret ? $ret : array()); } $blocked_cnt = 0; $scnt = count($ret); if ($scnt > $limit) { array_pop($ret); // убиваем проверочный проект (см. $slimit). } if (!$is_moder) { foreach ($ret as $k => $v) { if ($v['is_blocked'] && !($is_emp && $v['user_id'] == $uid) || $v['is_banned'] == 1) { unset($ret[$k]); $blocked_cnt++; } } } if ($num_prjs != 'nenado') { if (!$filterSql) { $num_prjs = (int) new_projects::getProjectsCount($kind, $page, $is_emp ? $uid : null, $is_moder); } else { $cnt = $scnt; //+ $blocked_cnt; $num_prjs = $offset + $cnt; // + (int)($cnt > $limit) * $limit; // 0012679 } } } setlocale(LC_ALL, 'en_US.UTF-8'); return $ret; }
/** * Получает диалог в личных сообщениях между двумя пользователями для модераторов * Сюда не входят сообщения которые не когда не будут проверенны модераторами. * * @param int $to_id id пользователя-получателя * @param string $from_login логин пользователя-отправителя * @param int $num_msgs_from вывод, начиная с какого-то сообщения * @param int $msg_offset количество получаемых сообщений (($msg_offset-1) * $GLOBALS['msgspp']) * * @return mixed массив диалога в случае успеха или текст ошибки */ public function GetMessagesForModers($to_id, $from_login, $offset = 1, $limit = null) { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/users.php'; $limit = $limit ? $limit : $GLOBALS['msgspp']; $offset = (($offset < 1 ? 1 : $offset) - 1) * $limit; $user = new users(); $user->login = $from_login; $from_id = $user->GetUid($error); $num_msgs_from = 0; if ($from_id) { $DB = new DB(); $offset = intvalPgSql((string) $offset); $rows = $DB->rows('SELECT m.*, array_length(m.files, 1) AS fcount FROM messages_dialog(?i, ?i) m WHERE moderator_status IS NOT NULL LIMIT ?i OFFSET ?i', $to_id, $from_id, $limit, $offset); self::getMessagesAttaches($rows); return $rows; } }
/** * Новая СБР * Проверяет пользовательский запрос на создание/редактирование СБР. Инициализирует данные в соответствии с переданными значениями. * * @param array $request данные запроса (гет, пост). * @param array $files массив $_FILES с вложениями к каждому этапу. * @param sbr $old старый экземпляр сделки. Передается при редактировании. * * @return bool нет ошибок? */ public function _new_initFromRequest($request, $files = null, $old = null) { $is_now_draft = $this->data['is_draft']; $this->data['is_draft'] = $request['draft'] ? 't' : 'f'; if (!isset($request['frl_db_id'])) { $request['frl_db_id'] = ''; } $request['frl_db_id'] = intval($request['frl_db_id']); if (isset($request['tuid'], $request['tuhash'])) { if ($request['tuhash'] === $this->tserviceHash($request['tuid'])) { $service = $this->checkTService($request['tuid'], $request['frl_db_id']); if ($service) { $this->data['tservice_id'] = $service['id']; $this->data['tservice_hash'] = $this->tserviceHash($service['id']); } } } elseif ($request['project_id']) { $this->checkProject($request['project_id']); } // если сделка создается из конкурса, то исполнителем может быть только победитель конкурса if ($request['project_id'] && isset($request['frl_db_id']) && $this->project['kind'] == 7 && $this->project['exec_id'] != $request['frl_db_id']) { $request['frl_db_id'] = $this->project['exec_id']; $this->error['frl'] = 'Исполнителем этой сделки может быть только победитель конкурса'; } if (!isset($request['scheme_type'])) { $request['scheme_type'] = ''; } if ($old) { if (!$request['cost_sys']) { $request['cost_sys'] = $old->cost_sys; } if (!$request['scheme_type']) { $request['scheme_type'] = $old->scheme_type; } } foreach ($request as $field => $value) { if (is_scalar($value)) { $value = trim(stripslashes($value)); } switch ($field) { case 'stages': foreach ($value as $pos => $stage) { $nowStage = $this->getStageByIdForData($stage['id']); $value[$pos]['descr'] = htmlspecialchars($stage['descr']); if (($request['scheme_type'] == sbr::SCHEME_PDRD || $request['scheme_type'] == sbr::SCHEME_PDRD2) && $stage['cost'] < sbr_stages::MIN_COST_RUR_PDRD) { $this->error['cost'][$nowStage->data['num']] = 'Поле заполненно некоректно'; } if ($request['scheme_type'] == sbr::SCHEME_LC && $is_now_draft != 't' && $stage['cost'] < sbr_stages::MIN_COST_RUR && $stage['cost'] != $nowStage->data['cost']) { $this->error['cost'][$nowStage->data['num']] = 'Поле заполненно некоректно'; } if ($request['scheme_type'] == sbr::SCHEME_LC && $is_now_draft == 't' && $stage['cost'] < sbr_stages::MIN_COST_RUR) { $this->error['cost'][$nowStage->data['num']] = 'Поле заполненно некоректно'; } if ($this->data['reserved_id'] && (int) $stage['work_time_add'] == 0) { $value[$pos]['work_time'] = $nowStage->data['work_time']; $request[$field][$pos]['work_time'] = $nowStage->data['work_time']; } elseif ($this->data['reserved_id'] && (int) $stage['work_time_add'] > 0) { $start_time = $nowStage->data['start_time'] ? $nowStage->data['start_time'] : $nowStage->data['first_time']; $endDate = strtotime($start_time . ' + ' . $nowStage->data['int_work_time'] . 'days'); $nextDate = $endDate < time() ? strtotime("+{$stage['work_time_add']} days") : strtotime(date('d.m.Y H:i', $endDate) . "+{$stage['work_time_add']} days"); $workTime = ceil(($nextDate - strtotime($start_time)) / 86400); $value[$pos]['work_time'] = $workTime; $request[$field][$pos]['work_time'] = $workTime; } } break; case 'name': if (is_empty_html($value)) { $this->error[$field] = 'Пожалуйста, заполните это поле'; } $value = substr($value, 0, self::NAME_LENGTH); break; case 'frl_db_id': if (!$this->isDraft()) { if (!$value || $value == 'логин') { $this->error['frl_db_id'] = 'Необходимо добавить исполнителя'; } } if (!$this->error['frl_db_id'] && $value != '') { $frl = new freelancer(); $frl->GetUserByUID($value); if ($frl->is_banned == 1) { $this->error['frl_db_id'] = 'Данный пользователь заблокирован'; $this->error['frl_ban'] = 'Данный пользователь заблокирован'; } $this->data['frl_id'] = $frl->uid; } break; // специальность // специальность case 'profession0_db_id': if (!$value) { $this->error['profession0_db_id'] = 'Необходимо выбрать специальность'; } break; case 'cost_sys': $reqvs = $this->getUserReqvs(); if (!in_array($value, array(exrates::YM, exrates::WMR, exrates::BANK))) { $this->error['cost_sys_err'] = 'Недопустимая валюта резервирования'; $value = exrates::BANK; } if (($value == exrates::YM || $value == exrates::WMR) && $reqvs['form_type'] == sbr::FT_JURI) { $this->error['cost_sys_err'] = 'Резервирование через Яндекс.Деньги или WebMoney доступно только физическим лицам'; } break; case 'project_id': $value = $this->project['id']; break; case 'id': $value = intvalPgSql($value); break; case 'scheme_type': $value = intvalPgSql($value); if ($value && (!self::$scheme_types[$value] || $value == self::SCHEME_OLD && (!$old || $old->scheme_type != self::SCHEME_OLD))) { $this->error['scheme_type_err'] = 'Неверный тип договора'; } break; case 'version': $value = (int) $value > 32767 ? 32767 : (int) $value; break; case 'frl_refuse_reason': $value = substr($value, 0, self::SBR_REASONS_LENGTH); break; default: break; } $this->data[$field] = $value; } $this->data['professions'] = array(); if ($_POST['profession0']) { $this->data['professions'][] = array('category_id' => __paramInit('int', null, 'profession0_column_id', 0), 'subcategory_id' => __paramInit('int', null, 'profession0_db_id', 0), 'prof_name' => __paramInit('string', null, 'profession0', 0)); } if ($_POST['profession1']) { $this->data['professions'][] = array('category_id' => __paramInit('int', null, 'profession1_column_id', 0), 'subcategory_id' => __paramInit('int', null, 'profession1_db_id', 0), 'prof_name' => __paramInit('string', null, 'profession1', 0)); } if ($_POST['profession2']) { $this->data['professions'][] = array('category_id' => __paramInit('int', null, 'profession2_column_id', 0), 'subcategory_id' => __paramInit('int', null, 'profession2_db_id', 0), 'prof_name' => __paramInit('string', null, 'profession2', 0)); } if ($request['stages']) { foreach ($request['stages'] as $num => $stage) { if (isset($stage['attaches']) && is_array($stage['attaches'])) { foreach ($stage['attaches'] as $anum => $att_id) { if (!isset($files[$att_id])) { continue; } // $attached[$att_id]['id'] = md5($attached[$att_id]['id']); if ($files[$att_id]['status'] == 1) { $request['stages'][$num]['attached'][$anum] = $files[$att_id]; } } } } if ($GLOBALS['action'] === 'editstage') { foreach ($files as $key => $file) { if ($file['status'] == 4) { $this->stages[0]->data['_new_del_attach'][] = $file; } } } $this->_new_initStagesFromRequest($request['stages'], $files, $request['action'] == 'create' ? 0 : ($request['action'] == 'edit' ? 1 : 2)); $this->getUserReqvs(); $this->getFrlReqvs(); if ($this->user_reqvs['rez_type'] == sbr::RT_UABYKZ || $this->frl_reqvs['rez_type'] == sbr::RT_UABYKZ) { $cost = 0; foreach ($this->stages as $s) { $cost += $s->cost; } $cost_rur = $cost * $this->cost2rur(); if ($cost_rur > $this->maxNorezCost()) { foreach ($this->stages as $p => $s) { $this->error['cost'][$pos] = 'Поле заполненно некоректно'; } $this->error['cost_sys_err_tbl'] = 'Превышена максимальная сумма сделки — ' . sbr::MAX_COST_USD . ' USD (или ' . sbr_meta::view_cost($this->maxNoRezCost(), exrates::BANK) . ')'; } } } // var_dump($this->error); // die(); return !$this->error; }
} if ($i > 0 && $question === '') { $error_flag = 1; $alert[5] = 'Введите текст вопроса'; } else { if ($i > blogs::MAX_POLL_ANSWERS) { $error_flag = 1; $alert[5] = 'Вы можете указать максимум ' . blogs::MAX_POLL_ANSWERS . ' ответов'; } else { if ($i < 2 && $question !== '') { $error_flag = 1; $alert[5] = 'Нужно указать минимум 2 варианта ответа в голосовании'; } } } if (!($gr = intvalPgSql($gr)) && !($ord == 'my' || $PDA)) { include ABS_PATH . '/404.php'; exit; } if (is_empty_html($msg)) { $msg = ''; } if ($_POST['close_comments']) { $close_comments = 't'; } else { $close_comments = 'f'; } if ($_POST['is_private']) { $is_private = 't'; } else { $is_private = 'f';
/** * Устанавливает/изменяет валюту выплаты за завершенный этап. * Вычисляет все налоги/комиссии, плюс в случае арбитража -- все необходимые коэффициэнты. * * @param integer $credit_sys код валюты (см. класс exrates). * @param boolean $any_sys разрешает любые валюты для выплаты (для админов). * @return boolean успешно? */ function setPayoutSys($credit_sys, $any_sys = false, $role = null) { setlocale(LC_ALL, 'en_US.UTF-8'); $credit_sys = intvalPgSql($credit_sys); if (!$any_sys && !$this->checkPayoutSys($credit_sys)) { return false; } if (($cost = $this->getPayoutSum($role, $credit_sys, NULL, $credit_sys)) <= 0) { return false; } $is_arbitrage = 'false'; if ($this->arbitrage['id']) { if (isset($this->arbitrage['resolved']) && !$this->arbitrage['resolved']) { return false; } $is_arbitrage = 'true'; } $user_id = $this->sbr->uid; if ($role) { $user_id = $role == sbr::FRL ? $this->sbr->data['frl_id'] : $this->sbr->data['emp_id']; } $credit_sum = round($cost, 2); $sql = "\n UPDATE sbr_stages_payouts\n SET credit_sys = {$credit_sys}, credit_sum = {$credit_sum}, is_arbitrage = {$is_arbitrage}\n WHERE stage_id = {$this->id}\n AND user_id = {$user_id}\n AND completed IS NULL\n "; if ($res = pg_query(self::connect(false), $sql)) { if (!pg_affected_rows($res)) { $state = $this->sbr->data['scheme_type'] == sbr::SCHEME_LC ? NULL : ''; $sql = "INSERT INTO sbr_stages_payouts(stage_id, user_id, credit_sys, credit_sum, is_arbitrage, state) VALUES ({$this->id}, {$user_id}, {$credit_sys}, {$credit_sum}, {$is_arbitrage}, '{$state}');"; $res = pg_query(self::connect(false), $sql); } } return !!$res; }
if ((int) $cat < 1) { $cat = 0; } // возможно лучше доработать функцию __paramInit if ((int) $page < 1) { $page = extractInteger($_REQUEST['page'], 1); } $action = __paramInit('string', 'action', 'action'); $top_id = __paramInit('string', 'post', 'top_id'); $message_id = NULL; list($t, $c) = split('[.]', $top_id); if ($t) { $top_id = intvalPgSql($t); } if ($c) { $comment_id = intvalPgSql($c); } if ($_GET['post'] && $_GET['site'] == 'Topic' && !$_GET['newurl'] && $_SERVER['REQUEST_METHOD'] != 'POST') { $query_string = preg_replace('/post=' . preg_quote($_GET['post']) . '/', '', $_SERVER['QUERY_STRING']); $query_string = preg_replace('/site=Topic/', '', $query_string); //$query_string = preg_replace("/^&{1,}/", "", $query_string); $query_array = explode('&', $query_string); $query_string = ''; $first_param = true; foreach ($query_array as $key => $value) { if ($value) { if ($first_param === true) { // перед первым параметром не ставим & $first_param = false; } else { $query_string .= '&';
/** * Проверка пользовательского запроса перед созданием или редактированием документа. * Заполнение переменной ошибок и $this->post_doc (тот же запрос, без лишних слешей), а также загружает файл документа на сервер. * * @param array $request данные запроса (гет, пост). * @param array $files массив $_FILES */ function _docInitFromRequest($request, $files) { $this->post_doc = array(); foreach ($request as $field => $value) { if (is_scalar($value)) { $value = stripslashes($value); } switch ($field) { case 'status': case 'access_role': case 'owner_role': case 'id': case 'type': $value = intvalPgSql($value); break; } $this->post_doc[$field] = $value; } if ($files != null) { $this->post_doc['file_id'] = null; } if (!$this->isAdmin() && !$this->isAdminFinance()) { if (!isset($this->post_doc['status'])) { $this->post_doc['status'] = self::DOCS_STATUS_SENT; } if (!isset($this->post_doc['access_role'])) { $this->post_doc['access_role'] = $this->isEmp() ? self::DOCS_ACCESS_EMP : self::DOCS_ACCESS_FRL; } } if (!$this->post_doc['name']) { $cnum = $this->getContractNum(); $dn = sbr::$docs_types[$this->post_doc['type']][0]; switch ($this->post_doc['type']) { case sbr::DOCS_TYPE_STATEMENT: $this->post_doc['name'] = "{$dn} № {$cnum}"; break; case sbr::DOCS_TYPE_TZ_PDRD: $this->post_doc['name'] = "{$dn} № {$cnum}"; break; case sbr::DOCS_TYPE_ACT: case sbr::DOCS_TYPE_FACTURA: case sbr::DOCS_TYPE_REP: case sbr::DOCS_TYPE_COPY_ACT: case sbr::DOCS_TYPE_COPY_FACTURA: case sbr::DOCS_TYPE_AGENT_REP: case sbr::DOCS_TYPE_PSKB_ACT: $this->post_doc['name'] = "{$dn} по договору № {$cnum}"; break; case sbr::DOCS_TYPE_COPY_CONTRACT: case sbr::DOCS_TYPE_OFFER: if ($this->post_doc['subtype'] == 1) { // ВНИМАНИЕ!!! в названии документа обязательно должно присутствовать слово с корнем "договор" (договор, договора, договору ...) $this->post_doc['name'] = "{$dn} № {$cnum} на заключение Договора"; } else { if ($this->post_doc['subtype'] == 2) { $this->post_doc['name'] = "{$dn} № {$cnum} на заключение Соглашения"; } else { $this->post_doc['name'] = "{$dn} № {$cnum}"; } } break; case sbr::DOCS_TYPE_ARB_REP: case sbr::DOCS_TYPE_COPY_AGREEMENT: case sbr::DOCS_TYPE_FM_APPL: case sbr::DOCS_TYPE_WM_APPL: case sbr::DOCS_TYPE_YM_APPL: $this->post_doc['name'] = "{$dn}"; break; default: $this->error['docs']['name'] = 'Пожалуйста, заполните это поле'; break; } } if (!$this->error && $files['attach']['size']) { $this->getUploadDir(); $file = new CFile($files['attach']); if ($err = $this->uploadFile($file, self::DOCS_FILE_MAX_SIZE)) { $this->error['docs']['attach'] = $err; } else { $this->post_doc['file_id'] = $file->id; } } }
/** * Возвращает список тем в разделе * * ------------------------------------------------------------------------------------- * Внимание! Замечание к подзапросу на основные вкладки (новые, популярные, актуальные). * * Подзапрос настроен на работу индексов типа "ix blogs_themes/viewgroup*", поэтому любое * добавление условий или (тем более с привязкой дополнительных таблиц!) испортит его. * Суть заключается в том, что мы все условия копируем в таблицы blogs_themes из таблиц blogs_msgs и других, * для того, чтобы использовать индексы и не делать лишних джойнов, т.е. все проверки делаются в рамках * единственной * таблицы. Поэтому мы быстро выбираем все необходимые N тем и только потом связываем их с остальными таблицами. * Чтобы добавить условие, нужно по аналогии, например, с deleted, is_blocked и т.п.), добавить клон * необходимого * поля в blogs_themes и скорректировать индекс(ы) (протестировав предварительно). * ------------------------------------------------------------------------------------- * * * @param integer $gr_num идентификатор раздела * @param string $gr_name возвращает название раздела * @param integer $num_treads возвращает кол-во тем в данном разделе * @param integer $page номер страницы из списка тем, которую надо выводить [получает или возвращает, в зависимости от $having_message] * @param string $error возвращает сообщение об ошибке * @param integer $fid UID текущего юзера * @param integer $mod имеет ли текущий юзер права на просмотр данного раздела [1 - да, 0 - нет] * @param integer $having_message УСТАРЕЛО. id сообщения, страницу с которым необходимо отобразить (0 - показать страницу $page) * @param integer $read_only возвращает параметр - является ли данный раздел разделом "только для чтения" * @param string $ord параметр сортировки ("my", "relevant", "best", "new", "favs") * @param string $sort_order позволяет передать дополнительные условия сортировки * @return array [[информация о сообщении]] */ function GetGroup($gr_num, &$gr_name, &$num_treads, $page, &$error, $fid = 0, $mod = 1, $having_message = 0, &$read_only, $ord = "new", $is_ban = true, $sort_order = '') { global $DB; $cachedelay = 300; if (hasPermissions("blogs")) { $cachedelay = 0; } $memBuff = new memBuff(); $fid = (int) $fid; $gr_num = (int) $gr_num; $num_treads = 0; $year = date('Y'); $can_prevyear_ontops = date('n') <= 2; $limit = $GLOBALS['blogspp']; $group = $gr_num != 0 ? "id_gr = {$gr_num} " : ""; $offset = $limit * ($page - 1); $offset = intvalPgSql((string) $offset); $limit_str = "LIMIT {$limit} OFFSET {$offset}"; $order = "post_time DESC"; $ids = array(); $idx = array(); $get_ontops = $ord == 'ontop'; if (!$get_ontops) { if ($gr_num != 0) { $gr_name = $this->GetGroupName($gr_num, 0, $mod); if (!$gr_name) { $error = "У вас недостаточно прав для просмотра этого форума"; return 0; } } else { $gr_name = "Все вместе"; } } // смотрим баны if ($fid && $fid == $_SESSION['uid']) { $role = $_SESSION['role']; } else { if ($fid) { $users = new users(); $role = $users->GetField($fid, $error, 'role'); } else { $role = 0; } } $is_moder = hasPermissions('blogs', $fid); if ($is_moder) { $sel_blocked = ", moderators.login as moder_login, moderators.uname AS moder_name, moderators.usurname as moder_uname"; $join_blocked = " LEFT JOIN users AS moderators ON blogs_blocked.admin = moderators.uid "; } else { $where_blocked = '(t.is_blocked = false) '; $where_private = ' AND (' . ($fid ? "t.fromuser_id = {$fid} OR " : '') . 't.is_private = false)'; $where_deleted = ' AND (t.deleted IS NULL )'; $where_deleted_my = ' AND t.deleted IS NULL AND m.deleted IS NULL'; // контролим баны if (!$is_ban) { $where_is_blocked = $where_blocked; } } $_group = $group ? " {$group} AND " : ''; switch ($ord) { case "my_all": case "my_posts": case "my_comments": case 'favs_list': case 'favs_std': if ($ord != 'favs_list' && $ord != 'favs_std') { $sReplyTo = $ord != 'my_all' ? $ord == 'my_posts' ? ' AND m.reply_to IS NULL' : ' AND m.reply_to IS NOT NULL' : ''; $join_banned = $where_deleted ? 'INNER JOIN users mtu ON mtu.uid = t.fromuser_id AND mtu.is_banned = 0::bit(1)' : ''; $where = 'WHERE'; $and = ' AND '; /*if (!$where_blocked && !$_group && !$where_private && !$sReplyTo && !$where_deleted_my) { $and = $where = ''; }*/ if (!$where_blocked) { $and = ''; } $sSelectQuery = "SELECT\n ontop, users.warn, msgs.id, messages_cnt as num, post_time, msgtext, yt_link, msgs.title, close_comments, is_private, users.uid,\n base as t, msgs.id_gr, users.uname, modified, modified_id, fromuser_id, users.usurname, users.login, users.email, users.photo, users.is_team,\n users.is_pro as payed, users.is_pro_test as payed_test, users.role, users.is_banned, users.ban_where, msgs.thread_id, users.reg_date, users.is_chuck,\n blogs_blocked.thread_id as is_blocked, blogs_blocked.reason, blogs_blocked.blocked_time,\n blogs_poll.thread_id::boolean as has_poll, blogs_poll.question as poll_question, blogs_poll.closed as poll_closed, blogs_poll.multiple as poll_multiple,\n\t\t\t\t\t\tvotes._cnt as poll_votes, reply_to, msgs.deleted, msgs.deluser_id, msgs.deleted_reason, fav_cnt, w.status, moderator_status, sbr_meta.completed_cnt\n FROM (\n SELECT m.*, t.messages_cnt, t.base, t.id_gr, t.close_comments , t.is_private, t.fav_cnt \n FROM blogs_themes as t\n INNER JOIN blogs_msgs as m ON t.thread_id = m.thread_id\n {$join_deleted}\n {$join_banned}\n {$where} {$where_blocked} {$and} ({$_group} m.fromuser_id = '{$fid}' {$where_private} {$sReplyTo}) {$where_deleted_my}\n ORDER BY {$order} {$limit_str}\n ) as msgs\n LEFT JOIN users ON fromuser_id=uid\n LEFT JOIN sbr_meta ON sbr_meta.user_id=uid\n LEFT JOIN blogs_blocked ON msgs.thread_id = blogs_blocked.thread_id\n LEFT JOIN blogs_poll ON blogs_poll.thread_id = msgs.thread_id\n\t\t\t\t\tLEFT JOIN (SELECT thread_id, COUNT(answer_id) AS _cnt FROM blogs_poll_votes WHERE user_id = '{$fid}' GROUP BY thread_id) AS votes ON votes.thread_id = msgs.thread_id\n LEFT JOIN blogs_themes_watch w ON w.user_id = '{$fid}' AND w.theme_id = msgs.thread_id\n ORDER BY {$order}"; $sCountQuery = "\n SELECT COUNT(*) as num\n FROM blogs_msgs m \n LEFT JOIN blogs_themes t ON t.thread_id = m.thread_id\n {$join_deleted}\n \t{$join_banned}\n {$where} {$where_blocked} {$and} ({$_group} m.fromuser_id = ?i {$where_private} {$sReplyTo}) {$where_deleted_my}"; } else { if ($sort_order == "priority") { $order = " priority DESC"; // важности } elseif ($sort_order == "abc") { $order = " calc_title"; // алфавиту } else { $order = " add_time DESC NULLS LAST"; // дате } $where = 'WHERE'; $and = ' AND '; /*if (!$where_blocked && !$_group && !$where_private && !$where_deleted) { $and = $where = ''; }*/ if (!$where_blocked) { $and = ''; } $sSelectQuery = "SELECT \n ontop, users.warn, msgs.id, messages_cnt as num, post_time, msgtext, yt_link, msgs.calc_title, close_comments, \n is_private, users.uid, base as t, msgs.id_gr, users.uname, modified, modified_id, users.is_team,\n fromuser_id, users.usurname, users.login, users.email, users.photo, users.is_pro as payed, reply_to, \n users.is_pro_test as payed_test, users.role, users.is_banned, users.ban_where, msgs.thread_id, users.reg_date, \n users.is_chuck, blogs_blocked.thread_id as is_blocked, blogs_blocked.reason, blogs_blocked.blocked_time, \n blogs_poll.thread_id::boolean as has_poll, blogs_poll.question as poll_question, blogs_poll.closed as poll_closed, blogs_poll.multiple as poll_multiple,\n votes._cnt as poll_votes, msgs.priority, msgs.add_time, msgs.deleted, msgs.deluser_id, msgs.deleted_reason, fav_cnt, w.status, moderator_status, sbr_meta.completed_cnt\n FROM ( \n SELECT m.*, COALESCE(NULLIF(f.title,''), m.title) as calc_title, t.messages_cnt, t.base, t.id_gr, t.close_comments , t.is_private, f.priority, f.add_time, t.fav_cnt \n FROM blogs_fav f \n INNER JOIN blogs_themes as t ON f.thread_id = t.thread_id \n INNER JOIN blogs_msgs as m ON t.thread_id = m.thread_id \n {$where} {$where_blocked} {$and} ({$_group} m.reply_to IS NULL AND f.user_id = '{$fid}' {$where_private}) {$where_deleted} \n ORDER BY {$order} " . ($ord == 'favs_std' ? $limit_str : '') . " \n ) as msgs \n LEFT JOIN users ON fromuser_id=uid \n LEFT JOIN blogs_blocked ON msgs.thread_id = blogs_blocked.thread_id \n LEFT JOIN blogs_poll ON blogs_poll.thread_id = msgs.thread_id\n LEFT JOIN sbr_meta ON sbr_meta.user_id=users.uid\n\t\t\t\t\tLEFT JOIN (SELECT thread_id, COUNT(answer_id) AS _cnt FROM blogs_poll_votes WHERE user_id = '{$fid}' GROUP BY thread_id) AS votes ON votes.thread_id = msgs.thread_id\n\t\t\t\t\tLEFT JOIN blogs_themes_watch w ON w.user_id = '{$fid}' AND w.theme_id = msgs.thread_id\n ORDER BY {$order}"; $sCountQuery = "\n SELECT COUNT(*) as num \n FROM blogs_fav f \n INNER JOIN blogs_themes as t ON f.thread_id = t.thread_id \n INNER JOIN blogs_msgs as m ON t.thread_id = m.thread_id \n {$where} {$where_blocked} {$and} ({$_group} m.reply_to IS NULL AND f.user_id = ?i {$where_private}) {$where_deleted}"; } $ret = $DB->rows($sSelectQuery); $error = $DB->error; if ($error) { $error = parse_db_error($error); } else { for ($i = 0, $max = count($ret); $i < $max; $i++) { if ($ret[$i]['has_poll'] == 't') { $ids[] = $ret[$i]['thread_id']; $idx[$ret[$i]['thread_id']] =& $ret[$i]; } } $this->AddAttach($ret); $num_treads = $DB->val($sCountQuery, $fid); } if ($ids) { $res = $DB->rows("SELECT * FROM blogs_poll_answers WHERE thread_id IN (" . implode(',', $ids) . ") ORDER BY id"); if ($res) { foreach ($res as $row) { $idx[$row['thread_id']]['poll'][] = $row; } } } return $ret; break; case "new": case "relevant": case "best": case "ontop": default: $group = $group ? $group : "id_gr!=7 "; $_group = $group ? " AND {$group}" : ''; if ($ord == 'relevant') { $order = "last_activity DESC"; } else { if ($ord == 'best') { $order = "messages_cnt DESC," . $order; } else { if (!$get_ontops) { $y_start = $year; $ycnt = 0; $ylcnt = 0; if (!$fid) { for ($year, $ycnt = 0; $year >= 2008; $year--) { $ylcnt = blogs::getThemesCount($year, $gr_num); $ycnt += $ylcnt; if ($ycnt > $offset) { break; } } } $ontops = $this->GetGroup($gr_num, $gr_name, $num_treads, 1, $error, $fid, $mod, 0, $read_only, 'ontop', $is_ban, $sort_order); $ontops_cnt = $ontops ? count($ontops) : 0; if ($offset >= $ontops_cnt) { $offset -= $ontops_cnt; } $where_ontop_i = 'AND t.ontop = false'; if (!$group && !$where_is_blocked && !$where_private && !$where_deleted) { $where_ontop_i = ' t.ontop = false'; } if ($year >= 2008) { $y_offset = $offset - ($ycnt - $ylcnt); $y_offset = intvalPgSql((string) $y_offset); $limit_str = "LIMIT {$limit} OFFSET {$y_offset}"; } else { $sql = NULL; // прыгаем на общий запрос. break; } } else { // берем только закрепленные. $look_prev_year = $can_prevyear_ontops; $where_ontop_i = 'AND t.ontop = true'; if (!$group && !$where_is_blocked && !$where_private && !$where_deleted) { $where_ontop_i = ' t.ontop = true'; } } } } $where = 'WHERE'; if (!$where_blocked && !$group && !$where_private && !$where_deleted && !$where_ontop_i) { $where = ''; } if (!$where_is_blocked) { $_group = $group; } $sql = "\n SELECT ontop, users.warn, msgs.id, messages_cnt as num, last_activity, post_time, msgtext, yt_link, msgs.title, is_private, close_comments, users.uid,\n base as t, msgs.id_gr, users.uname, modified, modified_id, fromuser_id, users.usurname, users.login, users.email, users.photo, users.is_team,\n users.is_pro as payed, users.is_pro_test as payed_test, users.role, users.is_banned, users.ban_where, msgs.thread_id, users.reg_date, users.is_chuck,\n blogs_blocked.thread_id as is_blocked, blogs_blocked.reason, blogs_blocked.blocked_time, msgs.deleted_reason,\n\t\t\t\t\t\t blogs_poll.thread_id::boolean as has_poll, blogs_poll.question as poll_question, blogs_poll.closed as poll_closed, blogs_poll.multiple as poll_multiple,\n\t\t\t\t\t\t votes._cnt as poll_votes, msgs.deleted, msgs.deluser_id, fav_cnt, w.status, sbr_meta.completed_cnt, moderator_status {$sel_blocked}\n FROM (\n -- Внимание! Данный подзапрос заточен под индексы blogs_themes (см. замечание в описании функции).\n SELECT m.*, t.close_comments, t.is_private, t.messages_cnt, t.last_activity, t.base, t.id_gr, t.fav_cnt \n FROM (\n SELECT t.* FROM blogs_themes as t\n {$where} /*where_is_blocked*/{$where_is_blocked} /*group:*/{$_group} /*where_private*/{$where_private} /*where_deleted:*/{$where_deleted} /*where_ontop_i*/{$where_ontop_i}\n ORDER BY {$order} {$limit_str}\n ) as t\n INNER JOIN\n blogs_msgs" . (!$look_prev_year ? "_{$year}" : '') . " m\n ON t.thread_id = m.thread_id AND m.reply_to IS NULL\n ) as msgs\n\t\t\t\t\tLEFT JOIN users ON fromuser_id=users.uid\n\t\t\t\t\tLEFT JOIN sbr_meta ON sbr_meta.user_id=users.uid\n\t\t\t\t\tLEFT JOIN blogs_blocked ON msgs.thread_id = blogs_blocked.thread_id\n\t\t\t\t\tLEFT JOIN blogs_poll ON blogs_poll.thread_id = msgs.thread_id\n\t\t\t\t\tLEFT JOIN (SELECT thread_id, COUNT(answer_id) AS _cnt FROM blogs_poll_votes WHERE user_id = '{$fid}' GROUP BY thread_id) AS votes ON votes.thread_id = msgs.thread_id\n\t\t\t\t\tLEFT JOIN blogs_themes_watch" . (!$look_prev_year ? "_{$year}" : '') . " w ON w.user_id = '{$fid}' AND w.theme_id = msgs.thread_id\n {$join_blocked}\n ORDER BY {$order}\n\t\t\t\t"; $ret = $DB->rows($sql); $error = $DB->error; if ($error || (!$ret || count($ret) < $limit) && !$get_ontops) { $sql = ''; } break; } if (!$sql) { $offset = intvalPgSql((string) $offset); $where = 'WHERE'; if (!$where_blocked && !$group && !$where_private && !$where_deleted && !$where_ontop_i) { $where = ''; } $sql = "\n SELECT ontop, users.warn, msgs.id, messages_cnt as num, last_activity, post_time, msgtext, yt_link, msgs.title, is_private, close_comments, users.uid,\n base as t, msgs.id_gr, users.uname, modified, modified_id, fromuser_id, users.usurname, users.login, users.email, users.photo, users.is_team,\n users.is_pro as payed, users.is_pro_test as payed_test, users.role, users.is_banned, users.ban_where, msgs.thread_id, users.reg_date, users.is_chuck,\n blogs_blocked.thread_id as is_blocked, blogs_blocked.reason, blogs_blocked.blocked_time,\n\t\t\t\t\t blogs_poll.thread_id::boolean as has_poll, blogs_poll.question as poll_question, blogs_poll.closed as poll_closed, blogs_poll.multiple as poll_multiple,\n\t\t\t\t\t votes._cnt as poll_votes, msgs.deleted, msgs.deluser_id, msgs.deleted_reason, sbr_meta.completed_cnt, fav_cnt, w.status, moderator_status {$sel_blocked}\n FROM (\n SELECT m.*, t.close_comments, t.is_private, t.messages_cnt, t.last_activity, t.base, t.id_gr, t.fav_cnt \n FROM (\n -- Внимание! Данный подзапрос заточен под индексы blogs_themes (см. замечание в описании функции).\n SELECT t.* FROM blogs_themes as t\n {$where} {$where_is_blocked} {$_group} {$where_private} {$where_deleted} {$where_ontop_i}\n ORDER BY {$order}\n LIMIT {$limit} OFFSET {$offset}\n ) as t\n INNER JOIN blogs_msgs as m ON t.thread_id = m.thread_id AND m.reply_to IS NULL\n ) as msgs\n LEFT JOIN users ON fromuser_id=uid\n LEFT JOIN blogs_blocked ON msgs.thread_id = blogs_blocked.thread_id\n\t\t\t LEFT JOIN blogs_poll ON blogs_poll.thread_id = msgs.thread_id\n\t\t\t LEFT JOIN sbr_meta ON sbr_meta.user_id = users.uid\n\t \t LEFT JOIN (SELECT thread_id, COUNT(answer_id) AS _cnt FROM blogs_poll_votes WHERE user_id = '{$fid}' GROUP BY thread_id) AS votes ON votes.thread_id = msgs.thread_id\n LEFT JOIN blogs_themes_watch w ON w.user_id = '{$fid}' AND w.theme_id = msgs.thread_id\n {$join_blocked}\n ORDER BY {$order}\n "; $ret = $DB->rows($sql); $error = $DB->error; if ($error) { $error = parse_db_error($error); } } if (!$error && $ret && !$num_treads) { for ($i = 0, $max = count($ret); $i < $max; $i++) { if (!$is_moder && $ret[$i]['is_blocked'] && $fid && $ret[$i]['fromuser_id'] != $fid) { unset($ret[$i]); } if ($ret[$i]['has_poll'] == 't') { $ids[] = $ret[$i]['thread_id']; $idx[$ret[$i]['thread_id']] =& $ret[$i]; } } if ($ret) { $ret = array_values($ret); } else { $ret = array(); } $this->AddAttach($ret); if (!$get_ontops) { // Из $where_private специально убрана проверка по $fid! // Иначе оно слишком затратно, т.к. не дает кэшировать этот запрос для всех юзеров сразу // при его довольно малой значимости. // То же с $where_is_blocked (убираем проверку fromuser_id). // Если в связи с этим будут выписаны баги в мантисе и т.п., нужно обсудить, прежде чем втыкать его обратно. if ($where_private) { $where_private = ' AND t.is_private = false'; } if ($where_is_blocked) { $where_is_blocked = 't.is_blocked = false '; } $where_on_top = " AND t.ontop = false "; if (!$where_is_blocked && !$group && !$where_deleted && !$where_private) { $where_on_top = " t.ontop = false "; } $where = 'WHERE'; if (!$where_is_blocked && !$group && !$where_deleted && !$where_private && !$where_on_top) { $where = ''; } $sql = "SELECT COUNT(1) FROM blogs_themes t \n {$where} {$where_is_blocked} {$_group} {$where_deleted} {$where_private} {$where_on_top}"; $num_treads = $DB->cache(1800)->val($sql); } } if ($ids) { $res = $DB->rows("SELECT * FROM blogs_poll_answers WHERE thread_id IN (" . implode(',', $ids) . ") ORDER BY id"); if ($res) { foreach ($res as $row) { $idx[$row['thread_id']]['poll'][] = $row; } } } if ($ontops) { if ($page == 1) { foreach ($ontops as $ot) { array_unshift($ret, $ot); } } $c = count($ret); while ($c-- > $limit) { array_pop($ret); } } return $ret; }
$stage = $sbr->initFromStage($stage_id); if ($action == 'arb_resolve' && $sbr->isAdmin()) { $resolve = __paramInit('bool', NULL, 'sendform'); $cancel = __paramInit('bool', NULL, 'cancel'); if ($resolve) { if (!($iagree = __paramInit('bool', NULL, 'iagree'))) { $stage->error['arbitrage']['iagree'] = 'Необходимо подтверждение'; } else { if ($stage->arbResolve($_POST)) { $frl_percent = $stage->request['frl_percent'] / 100; $stage->getArbitrage(false, false); // Раз вынесли решение берем арбитраж, для корректного расчета процентов if ($frl_percent != 1 && $stage->sbr->scheme_type == sbr::SCHEME_LC) { $pskb = new pskb($stage->sbr); $lc = $pskb->getLC(); $credit_sys = intvalPgSql(pskb::$exrates_map[$lc['ps_emp']]); $stage->setPayoutSys($credit_sys, true, sbr::EMP); } header_location_exit("/norisk2/?site=Stage&id={$stage->id}"); } } } elseif ($cancel) { if ($stage->arbCancel()) { header_location_exit("/norisk2/?site=Stage&id={$stage->id}"); } } } $arbitrsList = $stage->getArbitrs(); break; case 'docs': $inner = $fpath . 'docs.php';
$action = __paramInit('string', 'action', 'action'); $folder = __paramInit('int', 'fld', 'fld', 0); if ($kind < 0 || $kind > 6) { $kind = 0; } $css_file = array('/css/block/b-free-share/b-free-share.css', '/css/block/b-note/b-note.css', '/css/block/b-button-multi/b-button-multi.css', '/css/block/b-prev/b-prev.css', 'projects.css', '/css/nav.css', '/css/projects3.css'); $header = '../header.php'; $footer = '../footer.html'; $content = 'content_list.php'; include '../template2.php'; exit; case 'comment': if ($PDA) { $cid = intval($_GET['cid']); $user_id = get_uid(false); $prj_id = intvalPgSql((int) trim(str_replace('O', '0', $_GET['pid']))); $po_id = intval($_GET['id']); // Проект. $action = trim($_REQUEST['action']); $obj_project = new projects(); $project = $obj_project->GetPrjCust($prj_id); $pod = new projects_offers_dialogue(); if (is_emp()) { if ($project['user_id'] != get_uid(false)) { $content = '404.php'; include '../template2.php'; exit; } } else { $po = new projects_offers(); if (!$project || !$po->GetPrjOffer($prj_id, $user_id) || $cid && $pod->GetLastDialogueMessage($user_id, $po_id) != $cid) {
/** * Получение списка пользователей * * @param array $aParams массив входящих данных * @return array $aResult ответ */ protected function x____users_get($aParams = array()) { $this->_validDevice($aParams); $nUid = get_uid(false); $nId = intvalPgSql($aParams['id']); $aResult = array('user' => array()); if (!empty($nId)) { require_once ABS_PATH . '/classes/users.php'; $oUser = new users(); $oUser->GetUserByUID($nId); if ($oUser->uid) { if (empty($oUser->is_banned)) { $aData = array(); $aClassVars = array_keys(get_class_vars('users')); foreach ($aClassVars as $sVar) { $aData[$sVar] = $oUser->{$sVar}; } if (!is_emp($aData['role'])) { require_once ABS_PATH . '/classes/freelancer.php'; $aTmp = freelancer::getFreelancerByLogin(array($aData['login'])); $aData['spec'] = $aTmp[0]['spec']; } $aResult['user'] = $this->_getUserData($aData, false, true); } else { $this->error(EXTERNAL_ERR_USER_BANNED); } } else { $this->error(EXTERNAL_ERR_USER_NOTFOUND); } } else { $this->error(EXTERNAL_ERR_EMPTY_USER_ID); } return $aResult; }
/** * Заполнение обязательных полей после регистрации через API мобильного приложения. * * @param array $aParams массив входящих данных * @return bool true - успех, false - провал */ public function actionSaveInfoMobile($aParams = array()) { $this->setFieldInfo('uname', __paramValue('string', iconv('utf-8', 'cp1251', $aParams['first_name']))); $this->setFieldInfo('usurname', __paramValue('string', iconv('utf-8', 'cp1251', $aParams['last_name']))); $this->setFieldInfo('birthday', __paramValue('string', $aParams['birthday'])); $this->setFieldInfo('country', __paramValue('int', $aParams['country_id'])); $this->setFieldInfo('city', __paramValue('int', $aParams['city_id'])); $this->setFieldInfo('info_for_reg', array('birthday' => 0, 'sex' => 0, 'country' => 0, 'city' => 0)); $gender = __paramValue('int', $aParams['gender']); $this->setFieldInfo('sex', $gender == 1 ? 't' : ($gender == 2 ? 'f' : NULL)); $this->checkedFields(); if (date('Y-m-d', strtotime($aParams['birthday'])) != $aParams['birthday']) { $this->error['birthday'] = 'Укажите некорректную дату дня рождения'; $this->errno['birthday'] = 2; } if (empty($this->error)) { if (!is_emp()) { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/freelancer.php'; $user = new freelancer(); } else { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/employer.php'; $user = new employer(); } $user->info_for_reg = serialize($this->info_for_reg); $user->uname = $this->uname; $user->usurname = $this->usurname; $user->sex = $this->sex; $user->birthday = $this->birthday; $user->country = $this->country; $user->city = $this->city; if (!is_emp()) { $spec = intvalPgSql($aParams['prof_id']); if ($spec) { require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/professions.php"; $or_spec = professions::GetProfessionOrigin($spec); $spec_mod = professions::getLastModifiedSpec($_SESSION['uid']); if (!is_pro() && $spec_mod['days'] > 0) { $this->error['spec'] = 'Не прошло 30 дней с момента последней смены специализации'; $this->errno['spec'] = 2; } else { $user->spec = $spec; $user->spec_orig = $or_spec; professions::setLastModifiedSpec($_SESSION['uid'], $spec); } } else { $this->error['spec'] = 'Не указан параметр ID профессии'; $this->errno['spec'] = 1; } } if (empty($this->error)) { if ($sError = $user->Update($_SESSION['uid'], $res)) { $this->error['save'] = $sError; } else { if (!is_emp()) { $_SESSION['specs'] = $user->GetAllSpecs($_SESSION['uid']); } } } if (empty($this->error['save'])) { $_SESSION['check_user_access'] = true; } } return empty($this->error); }
/** * Корректная инициализация переданных параметров GET и POST переданных пользователем * * @param string $type Тип переданных данных (int, float, string, link, html, bool, money) * @param string $get_name Название данных в GET * @param ustring $post_name Название данных в POST * @param mixed $empty_val Значение по умолчанию * @param integer $maxlen Максимальная длинна данных * @param string $strip_tags Для $type = 'html'. Если TRUE, то все теги и спецсимволы, сюда и будем пехать их * @param string $value При обработке входящих данных в функции XAJAX необходима обработка чисто переменных * переводятся в сущности. * @see change_q_x() * @return mixed */ function __paramInit($type = 'int', $get_name = NULL, $post_name = NULL, $empty_val = NULL, $maxlen = NULL, $strip_tags = FALSE, $value = FALSE) { //$value = FALSE; if ($get_name && isset($_GET[$get_name])) { if ($_GET[$get_name] !== '') { $value = $_GET[$get_name]; } } if ($value === FALSE) { if ($post_name && isset($_POST[$post_name])) { if ($_POST[$post_name] !== '') { $value = $_POST[$post_name]; } } } if ($value === FALSE) { return $empty_val; } if (intval($maxlen)) { $value = addslashes(substr(stripslashes($value), 0, intval($maxlen))); } switch ($type) { case 'striptrim': return stripslashes(trim($value)); case 'page': $value = intvalPgSql($value); return $value <= 0 ? 1 : $value; case 'uinteger': case 'uint': return abs(intvalPgSql($value)); case 'array_integer': case 'array_int': return array_map('intvalPgSql', $value); case 'integer': case 'int': return intvalPgSql($value); case 'String': //$value = stripslashes($value); //$value = stripslashes($value); case 'string': return change_q_x($value, TRUE); case 'string_no_slashes': return stripslashes(change_q_x($value, TRUE)); case 'link': return change_q_x(strip_http($value), TRUE); case 'html': return $strip_tags ? change_q_x($value, FALSE, TRUE, "", false, false) : change_q_x($value, FALSE, TRUE, null, false, false); case 'htmltext': return change_q_x($value, TRUE, FALSE); // аналогичен 'htmltext', но оставляет теги ul, li, b, p, i // аналогичен 'htmltext', но оставляет теги ul, li, b, p, i case 'html_save_ul_li_b_p_i': return change_q_x($value, false, false, 'b|i|p|ul|li'); case 'array': return $value; case 'bool': return !!$value; case 'float': setlocale(LC_ALL, 'en_US.UTF-8'); return floatval($value); case 'money': setlocale(LC_ALL, 'en_US.UTF-8'); return floatval(preg_replace('/\\s+/', '', str_replace(",", ".", $value))); case 'ckedit_nocut': $nocut = true; case 'ckeditor': case 'ckedit': //$value = stripslashes($value); $value = wysiwyg_video_replace($value, $wysiwyg_videos); if (hasPermissions('adm')) { $value = wysiwyg_image_replace($value, $wysiwyg_images); } $value = wysiwyg_code_replace($value, $wysiwyg_codes); $ph = md5(time()) . "_code"; list($value, $url) = str_replace_mask('#((<a[^>]*>)(.*?)(<\\/a>))#mix', $value); foreach ($url as &$u) { $u = stripslashes($u); $u = cleanHref($u); } $value = preg_replace(array("~<cut\\s*?\\/>~mix", "~<\\/cut>~"), array("<cut>", ""), $value); // Заменяем каты if ($nocut) { // Удаляем каты $value = str_replace("<cut>", "", $value); } $value = str_replace(array("<br />", "<br/>", "<br>"), "___BR___", $value); // Заменяем переносы для сохранения следующая функция их сжирает // Обрабатываем отступы в теге <pre> $value = str_replace("\n", "__N__", $value); $value = preg_replace_callback('~<pre>(.*?)<\\/pre>~mix', 'rn2br', $value); $value = str_replace("__N__", "\n", $value); $value = strip_tags($value, '<a>,<strike>,<cut>,<pre>,<b>,<strong>,<em>,<u>,<i>,<p>,<ul>,<ol>,<li>,<s>,<h1>,<h2>,<h3>,<h4>,<h5>,<h6>'); $value = change_q_x($value, FALSE, TRUE, 'strike|cut|pre|b|strong|em|u|i|p(\\s' . $ph . '_\\w*)?+|ul|ol|li|s|h[1-6]{1}', false, false); $value = str_replace("___BR___", "<br />", $value); // Возвращаем переносы $value = clearHTMLBeforeCutTags($value); $value = str_replace("<cut>", "<!-- -W-EDITOR-CUT- -->", $value); $value = hlcode($value); $tidy = new tidy(); $value = $tidy->repairString($value, array('fix-backslash' => false, 'show-body-only' => true, 'bare' => true, 'clean' => false, 'drop-empty-paras' => false, 'preserve-entities' => true, 'wrap' => '0'), 'raw'); $value = str_unreplace_mask($url, $value); $value = wysiwygLinkEncode($value); $value = wysiwygLinkDecode($value); $value = str_replace("<!-- -W-EDITOR-CUT- -->", "<cut>", $value); $value = str_replace("<p></p>", "<p> </p>", $value); $value = str_replace("\n", "", $value); /* * \h - горизонтальный пробельный символ. Для поддержки необходимо --PHP >= 5.2.4, PCRE >= 7.2 (на бете сейчас PCRE 6.6) */ //$value = preg_replace("/[\p{Zs}]/", " ", $value); $value = wysiwyg_code_restore($value, $wysiwyg_codes); if (hasPermissions('adm')) { $value = wysiwyg_image_restore($value, $wysiwyg_images); } $value = wysiwyg_video_restore($value, $wysiwyg_videos); return $value; break; case 'wysiwyg': case 'wysiwyg_tidy': case 'wysiwyg_message': $value = wysiwyg_video_replace($value, $wysiwyg_videos); $value = wysiwyg_image_replace($value, $wysiwyg_images); $value = wysiwyg_code_replace($value, $wysiwyg_codes); $value = str_replace(array("\n", "\r"), "", $value); $value = preg_replace("[\r\n]", "", $value); $ph = md5(time()) . "_code"; list($value, $url) = str_replace_mask('#((<a[^>]*>)(.*?)(<\\/a>))#mix', $value); foreach ($url as &$u) { $u = cleanHref($u); } //$value = preg_replace('/<p\sclass.*?code\s(\w*?).?"/si', "<p {$ph}_$1", $value); $value = change_q_x($value, FALSE, TRUE, 'a|strike|cut|b|strong|em|u|i|p(\\s' . $ph . '_\\w*)?+|ul|ol|li|s|h[1-6]{1}', false, false); $value = str_unreplace_mask($url, $value); $value = preg_replace("#<([^><]+?)([^a-z_\\-]on\\w*|xmlns)(\\s*=\\s*[^><]*)([><]*)#i", "<\\1\\4", $value); $value = preg_replace("/<br ?\\/?>/si", "\n", $value); $value = str_replace(array("<br />", "<br />", " "), array("\n", "\n", " "), $value); $value = clearHTMLBeforeCutTags($value); $value = wysiwygLinkEncode($value); $value = wysiwygLinkDecode($value); $value = preg_replace('/\\&/', '&', $value); //$value = preg_replace('/<p\s[a-z0-9]{32}_code_(.*?)>/', '<p class="code $1">', $value); $value = preg_replace("/(li|ol|ul)>[\n]+/iU", "\$1>", $value); //$value = str_replace(array(' '), array(' '), $value ); $value = str_replace("<cut>", "<!-- -W-EDITOR-CUT- -->", $value); $value = str_replace("<!-- -W-EDITOR-CUT- -->", "<!-- -W-EDITOR-CUT- -->", $value); // $value = preg_replace_callback("/<([^\s>]+)[^>](.*?)*>/si", // create_function('$matches', 'return str_replace(" ", " ", $matches[0]);'), // $value); if ($type == 'wysiwyg_message') { $value = preg_replace(array("/<p>/", "/<\\/p>/", "/\n+\\s*\$/"), array("", "\n\n", ""), $value); $value = str_replace("\n", "<br />", $value); } elseif ($type != 'wysiwyg_tidy') { $value = nl2br($value); } if ($type == 'wysiwyg_tidy') { //tidy $tidy = new tidy(); $value = $tidy->repairString($value, array('fix-backslash' => false, 'show-body-only' => true, 'bare' => true, 'drop-empty-paras' => false, 'preserve-entities' => true, 'wrap' => '0'), 'raw'); $value = str_replace("<p></p>", "<p> </p>", $value); $value = str_replace("\n", "", $value); $value = preg_replace("/\\p{Zs}/", " ", $value); //!tidy } $value = wysiwyg_code_restore($value, $wysiwyg_codes); $value = wysiwyg_image_restore($value, $wysiwyg_images); $value = wysiwyg_video_restore($value, $wysiwyg_videos); return $value; } return NULL; }
/** * Сохранение проектов и конкурсов * * @param object $objResponse xajaxResponse * @param string $rec_id идентификатор записи * @param string $rec_type тип записи * @param array $aForm массив данных * @param string $sDrawFunc имя функции для выполнения после сохранения */ function _admEditProjectsSaveForm(&$objResponse, $rec_id = '', $rec_type = '', $aForm = array(), $sDrawFunc = '') { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/projects.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/professions.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/user_content.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/attachedfiles.php'; $alert = array(); $tmpPrj = new tmp_project($aForm['temp_key']); $prj = $tmpPrj->init(2); $kind = isset($aForm['kind']) ? intvalPgSql($aForm['kind']) : $prj['kind']; $sLink = change_q_x($aForm['link'], false, true, null, false, false); if (!empty($sLink)) { if (!preg_match('/http:\\/\\//', $sLink)) { $sLink = 'http://' . $sLink; } } $tmpPrj->setProjectField('kind', $kind); $tmpPrj->setProjectField('descr', antispam(change_q_x($aForm['descr'], FALSE, TRUE, "", false, false))); $tmpPrj->setProjectField('name', substr(antispam(change_q_x($aForm['name'], TRUE)), 0, 512)); setlocale(LC_ALL, 'en_US.UTF-8'); $tmpPrj->setProjectField('cost', isset($aForm['cost']) ? floatval($aForm['cost']) : 0); $tmpPrj->setProjectField('currency', isset($aForm['currency']) ? intvalPgSql($aForm['currency']) : 0); $tmpPrj->setProjectField('folder_id', isset($aForm['folder_id']) ? intvalPgSql($aForm['folder_id']) : 0); $tmpPrj->setProjectField('budget_type', isset($aForm['budget_type']) ? intvalPgSql($aForm['budget_type']) : 0); $tmpPrj->setProjectField('priceby', isset($aForm['priceby']) ? intvalPgSql($aForm['priceby']) : 0); $tmpPrj->setProjectField('agreement', isset($aForm['agreement']) ? intvalPgSql($aForm['agreement']) : 0); $tmpPrj->setProjectField('country', isset($aForm['country']) ? intvalPgSql($aForm['country']) : 0); $tmpPrj->setProjectField('city', isset($aForm['pf_city']) ? intvalPgSql($aForm['pf_city']) : 0); $tmpPrj->setProjectField('pro_only', isset($aForm['pro_only']) ? 't' : 'f'); $tmpPrj->setProjectField('is_color', isset($aForm['is_color']) ? 't' : 'f'); $tmpPrj->setProjectField('is_bold', isset($aForm['is_bold']) ? 't' : 'f'); $tmpPrj->setProjectField('link', $sLink); if ($kind == 7) { $tmpPrj->setProjectField('end_date', change_q_x($aForm['end_date'], TRUE)); $tmpPrj->setProjectField('win_date', change_q_x($aForm['win_date'], TRUE)); } // разделы $c = $aForm['categories']; $sc = $aForm['subcategories']; if (empty($c) || sizeof($c) == 1 && $c[0] == 0) { $alert[3] = 'Не выбран раздел'; } else { $cats = array(); foreach ($c as $sKey => $value) { if ($value == 0) { continue; } $check[] = $value . "_" . $sc[$sKey]; } $uniq = array_unique($check); foreach ($uniq as $val) { list($cat, $subcat) = explode('_', $val); $check_array[$cat][] = $subcat; } foreach ($check_array as $k => $val) { if (count($val) > 1 && array_search(0, $val) !== false) { $cats[] = array('category_id' => $k, 'subcategory_id' => 0); unset($check_array[$k]); } else { foreach ($val as $m => $v) { $cats[] = array('category_id' => $k, 'subcategory_id' => $v); } } } $tmpPrj->setCategories($cats); } $prj = $tmpPrj->getProject(); $descr_limit = 5000; if ($prj['cost'] < 0) { $alert[7] = 'Введите положительную сумму'; } if ($prj['cost'] > 999999) { $alert[7] = 'Слишком большая сумма'; } if ($prj['cost'] > 0 && ($prj['currency'] < 0 || $prj['currency'] > 3)) { $alert[7] = 'Валюта не определена'; } if (is_empty_html($prj['name'])) { $alert[1] = 'Поле не заполнено'; } if (is_empty_html($prj['descr'])) { $alert[2] = 'Поле не заполнено'; } if (strlen_real($prj['descr']) > $descr_limit) { $alert[2] = "Исчерпан лимит символов ({$descr_limit})"; } if ($prj['kind'] == 7) { if (!preg_match("/^([0-9]{1,2})\\-([0-9]{1,2})\\-([0-9]{4})\$/", $prj['end_date'], $o1) || !checkdate($o1[2], $o1[1], $o1[3])) { $alert[5] = 'Неправильная дата'; } if (!preg_match("/^([0-9]{1,2})\\-([0-9]{1,2})\\-([0-9]{4})\$/", $prj['win_date'], $o2) || !checkdate($o2[2], $o2[1], $o2[3])) { $alert[6] = 'Неправильная дата'; } if (!$alert[5] && mktime(0, 0, 0, $o1[2], $o1[1], $o1[3]) <= mktime(0, 0, 0)) { $alert[5] = 'Дата окончания конкурса не может находиться в прошлом'; } if (!$alert[6] && mktime(0, 0, 0, $o2[2], $o2[1], $o2[3]) <= mktime(0, 0, 0, $o1[2], $o1[1], $o1[3])) { $alert[6] = 'Дата определения победителя должна быть больше даты окончания конкурса'; } } /*elseif ( $prj['kind'] == 4 && ($prj['country'] == 0 || $prj['city'] == 0) ) { $alert[4] = 'Укажите местонахождение'; }*/ if (isset($aForm['top_ok'])) { $nDays = intval($aForm['top_days']); if (ctype_digit($aForm['top_days']) && $nDays > 0) { $tmpPrj->setAddedTopDays($nDays); } else { $alert[8] = 'Укажите корректное количество дней нверху'; } } else { $tmpPrj->setAddedTopDays(0); } if (!isset($alert[8]) && isset($aForm['logo_ok'])) { if (empty($aForm['logo_id'])) { $alert[8] = 'Необходимо выбрать файл'; } } if (isset($aForm['del_logo'])) { $tmpPrj->delLogo(); } if (!$alert) { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/messages.php'; $attachedfiles = new attachedfiles($aForm['attachedfiles_session']); $attachedfiles_files = $attachedfiles->getFiles(array(1, 3, 4)); $tmpPrj->addAttachedFiles($attachedfiles_files); $attachedfiles->clear(); $sError = $tmpPrj->saveProject($prj['user_id'], $prj); if (!$sError) { if ($prj['agreement'] == 1 || $prj['cost'] == 0) { projects::updateBudget($rec_id, 0, 0, 0, true); } else { projects::updateBudget($rec_id, $prj['cost'], $prj['currency'], $prj['priceby'], false); } $sReason = _parseReason($aForm['user_id'], $aForm['adm_edit_text']); messages::projectsModifiedNotification($rec_id, $rec_type, $aForm['user_login'], $aForm['user_uname'], $aForm['user_usurname'], $sReason); $content_id = user_content::MODER_PROJECTS; _admEditAfterAll($objResponse, $content_id, $rec_id, $rec_type, $sDrawFunc, $aForm); } else { $objResponse->alert($sError); $sParent = $sDrawFunc == 'stream0' || $sDrawFunc == 'stream1' || $sDrawFunc == 'stream2' ? 'parent.' : ''; $objResponse->script("{$sParent}adm_edit_content.disabled = false; {$sParent}adm_edit_content.button();"); } } else { _setErrors($objResponse, $alert, array(1 => 'name', 2 => 'descr', 3 => 'categories', 4 => 'country', 5 => 'end_date', 6 => 'win_date', 7 => 'cost', 8 => 'paid'), $sDrawFunc); } }
$action = __paramInit('string', 'action', 'action'); $folder = __paramInit('int', 'fld', 'fld', 0); if ($kind < 0 || $kind > 6) { $kind = 0; } $css_file = array('/css/block/b-free-share/b-free-share.css', '/css/block/b-note/b-note.css', '/css/block/b-button-multi/b-button-multi.css', '/css/block/b-prev/b-prev.css', 'projects.css', '/css/nav.css', '/css/projects3.css'); $header = "../header.php"; $footer = "../footer.html"; $content = "content_list.php"; include "../template2.php"; exit; case "comment": if ($PDA) { $cid = intval($_GET['cid']); $user_id = get_uid(false); $prj_id = intvalPgSql((int) trim(str_replace("O", "0", $_GET['pid']))); $po_id = intval($_GET['id']); // Проект. $action = trim($_REQUEST['action']); $obj_project = new projects(); $project = $obj_project->GetPrjCust($prj_id); $pod = new projects_offers_dialogue(); if (is_emp()) { if ($project['user_id'] != get_uid(false)) { $content = "404.php"; include "../template2.php"; exit; } } else { $po = new projects_offers(); if (!$project || !$po->GetPrjOffer($prj_id, $user_id) || $cid && $pod->GetLastDialogueMessage($user_id, $po_id) != $cid) {