/** * Сохранение данных фильтра для последующего его создания или обновления. * * @param integer $user_id id пользователя * @param array $categories массив с категориями/профессиями * @param bool ;only_my_offs только мои предложения * * @return string */ public function Save($user_id, $categories, $only_my_offs) { $uid = get_uid(false); list($cost_from, $cost_to) = projects_filters::preCosts($cost_from, $cost_to); $currency = intval($currency); $country = intval($country); $city = intval($city); $wo_cost = $wo_cost ? 't' : 'f'; $my_specs = $my_specs ? 't' : 'f'; if (!$force && $uid != $user_id) { $rerror += 1; } //if (!preg_match( "/^[-^!#$%&'*+\/=?`{|}~.\w]+@[-a-zA-Z0-9]+(\.[-a-zA-Z0-9]+)+$/", $email )) { $rerror += 2; } //if (!in_array($currency, array(0, 1, 2))) { $rerror += 4; } if (!$error && !$rerror) { global $DB; $sql = 'SELECT id FROM offers_filter WHERE user_id=? LIMIT 1'; $filter_id = $DB->val($sql, $user_id); if (!$filter_id) { $error = $this->Add($user_id, $categories, $only_my_offs); } else { $error = $this->Update($filter_id, $categories, $only_my_offs); } } }
/** * Скрывает или отображает платные проекты. * * @see projects_filter::ShowClosedProjects() * @see projects_filter::initClosedProjects() * * @param string $id id определенного или all для всех * @param string $type скрыть (hide) или показать (unhide) * @param int $kind тип текущей закладки главной страницы (см. new_projects::getProjects()) * @param int $page номер текущей страницы. * @param bool $filter включен ли фильтр у юзера. * * @return object xajaxResponse */ function HideProject($id, $type, $kind, $page, $filter) { session_start(); $objResponse = new xajaxResponse(); $all = $id == 'all'; $id = (int) $id; $uid = $_SESSION['uid']; if ($type == 'hide') { if ($all) { if ($tops = new_projects::getTopProjects()) { foreach ($tops as $t) { $_SESSION['ph'][$t['id']] = base64_encode($t['name']); $objResponse->assign("project-item{$t['id']}", 'outerHTML', ''); } } $nDH = $nH * count($_SESSION['ph']); unset($_SESSION['top_payed']); } else { $nDH = $nH; $_SESSION['ph'][$id] = base64_encode(projects::GetField($id, 'name')); $_SESSION['top_payed']--; $objResponse->assign("project-item{$id}", 'outerHTML', ''); } } else { if ($all && $_SESSION['ph']) { $nDH = -1 * $nH * count($_SESSION['ph']); unset($_SESSION['ph']); } else { $nDH = -1 * $nH; unset($_SESSION['ph'][$id]); if (!$_SESSION['ph']) { unset($_SESSION['ph']); } } if ($filter) { $prj_filter = new projects_filters(); $uf = $prj_filter->GetFilter($uid, $error); } $prj = new new_projects(); $content = $prj->SearchDB((int) $kind, (int) $page, 0, $uf, true); $objResponse->assign("projects-list", "innerHTML", $content); } if ($_SESSION['ph']) { $ccph = array_keys($_SESSION['ph']); } setcookie("ph[{$uid}]", $ccph ? implode(',', $ccph) : '', time() + 60 * 60 * 24 * 30, '/'); $content = projects_filters::ShowClosedProjects((int) $kind, (int) $page, (int) $filter); $objResponse->assign("flt-hide-content", "innerHTML", $content); $objResponse->assign("flt-hide-cnt", "innerHTML", sizeof($_SESSION['ph']) ? "(" . sizeof($_SESSION['ph']) . ")" : ""); // компенсируем изменение высоты блока скрытых проектов $objResponse->script("height=\$('flt-hide-content').getStyle('height').toInt()+'px';\$('flt-hide-content').getParent().setStyle('height', height);\n fbox=\$('flt-ph');fslider=new Fx.Slide(fbox.getElement('.flt-cnt'),{duration:400});\n fbox.f_isShw=fbox.hasClass('flt-show');fbox.getElement('.flt-cnt').setStyle('display','block');\n if(fbox.f_isShw){fslider.show();}else{fslider.hide();}"); return $objResponse; }
/** * Сохранение данных фильтра для последующего его создания или обновления * * @param integer $filter_id id пользователя * @param integer $cost_from бюджет ОТ * @param integer $cost_to бюджет ДО * @param integer $currency id валюты поиска (0 - все) * @param boolean $wo_cost поиск по проектам с неуказанным бюджетом * @param array $categories массив с категориями/профессиями * @param integer $country id страны * @param integer $city id города * @param integer $keywords поисковые слова * @param boolean $my_specs использовать поиск только по специализациям пользователя * @param integer $page id страницы фильтра * @param boolean $nogeo обновлять или нет текущие город и страну в фильтре * * @param string $konkursEndDaysFrom конкурс заканчивается через столько дней - нижняя граница * @param string $konkursEndDaysTo конкурс заканчивается через столько дней - верхняя граница * * @param bool $use_main_filter опционально. Для page равно 2 "API мобильного приложения". Если true использвать фильтр page равно 0 "Главная страница" * @return string */ function Save($user_id, $cost_from, $cost_to, $currency, $wo_cost, $categories, $country, $city, $keywords, $my_specs, &$rerror, &$error, $force = 0, $page = 0, $nogeo = false, $only_sbr = false, $pro_only = false, $verify_only = false, $less_offers = false, $konkursEndDaysFrom = null, $konkursEndDaysTo = null, $use_main_filter = false, $priceby = 4, $urgent_only = false, $block_only = false, $hide_exec = false) { $uid = get_uid(false); list($cost_from, $cost_to) = projects_filters::preCosts($cost_from, $cost_to); $currency = intval($currency); $priceby = intval($priceby); $country = intval($country); $city = intval($city); $wo_cost = $wo_cost ? 't' : 'f'; $my_specs = $my_specs ? 't' : 'f'; $only_sbr = $only_sbr ? 't' : 'f'; $pro_only = $pro_only ? 't' : 'f'; $urgent_only = $urgent_only ? 't' : 'f'; $block_only = $block_only ? 't' : 'f'; $verify_only = $verify_only ? 't' : 'f'; $less_offers = $less_offers ? 't' : 'f'; $use_main_filter = $use_main_filter ? 't' : 'f'; $konkursEndDaysFrom = $konkursEndDaysFrom || $konkursEndDaysFrom === '0' ? intval($konkursEndDaysFrom) >= 0 ? intval($konkursEndDaysFrom) : 0 : null; $konkursEndDaysTo = $konkursEndDaysTo || $konkursEndDaysTo === '0' ? intval($konkursEndDaysTo) >= 0 ? intval($konkursEndDaysTo) : 0 : null; // если первая дата больше второй, то меняем их местами if ($konkursEndDaysFrom !== null && $konkursEndDaysTo !== null && $konkursEndDaysFrom > $konkursEndDaysTo) { list($konkursEndDaysFrom, $konkursEndDaysTo) = array($konkursEndDaysTo, $konkursEndDaysFrom); } $hide_exec = $hide_exec ? 't' : 'f'; if (!$force && $uid != $user_id) { $rerror += 1; } if (!$error && !$rerror) { if (get_uid(false)) { global $DB; $sql = "SELECT id FROM projects_filters WHERE user_id=? AND page=? LIMIT 1"; $filter_id = $DB->val($sql, $user_id, $page); if (!$filter_id) { $error = $this->Add($user_id, $cost_from, $cost_to, $currency, $wo_cost, $categories, $country, $city, $keywords, $my_specs, $page, $only_sbr, $pro_only, $verify_only, $less_offers, $konkursEndDaysFrom, $konkursEndDaysTo, $use_main_filter, $priceby, $urgent_only, $block_only, $hide_exec); } else { $error = $this->Update($filter_id, $cost_from, $cost_to, $currency, $wo_cost, $categories, $country, $city, $keywords, $my_specs, $page, $nogeo, $only_sbr, $pro_only, $verify_only, $less_offers, $konkursEndDaysFrom, $konkursEndDaysTo, $use_main_filter, $priceby, $urgent_only, $block_only, $hide_exec); } } else { $f_data = array(); $c_data = array(); $f_data['filter'] = compact('cost_from', 'cost_to', 'currency', 'wo_cost', 'country', 'city', 'keywords', 'my_specs', 'page', 'only_sbr', 'pro_only', 'verify_only', 'less_offers', 'konkurs_end_days_from', 'konkurs_end_days_to', 'use_main_filter', 'priceby', 'urgent_only', 'block_only', 'hide_exec'); if (is_array($categories[0]) && sizeof($categories[0])) { foreach ($categories[0] as $category => $type) { $category = intval($category); $c_data[] = array('filter_id' => $filter_id, 'group_id' => $category, 'group_level' => false); } } if (is_array($categories[1]) && sizeof($categories[1])) { foreach ($categories[1] as $category => $type) { $category = intval($category); $c_data[] = array('filter_id' => $filter_id, 'group_id' => $category, 'group_level' => true); } } if (count($c_data)) { $f_data['f_projects_groups'] = $c_data; } $_SESSION['f_project_filter'] = $f_data; $_SESSION['f_project_filter']['filter']['active'] = 't'; $_SESSION['f_project_filter']['filter']['tcats'] = $categories; } } }
/** * Возвращает список проектов. * * @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 $kind тип проектов (-1=5=Все проекты; 2=Конкурсы; 4=В офис; 6=Только для про) * @param array $filter массив с фильтром проектов (тот же, что для projects::getProjects(), но разделы в таком виде: [[1,2,3], [44,55,66]], где по индексу 0 -- разделы, по 1 -- подразделы) * @param int $page_size кол-во проектов на странице. * * @return array */ protected function x____getProjects($args) { list($kind, $filter, $page_size) = $args; require_once ABS_PATH . '/classes/projects.php'; require_once ABS_PATH . '/classes/projects_filter.php'; require_once ABS_PATH . '/classes/professions.php'; $result = null; $projects = new new_projects(); $kind = $kind ? (int) $kind : $this->_mCfg['default_kind']; $page_size = (int) $page_size; $limit = $page_size > $this->_mCfg['max_page_size'] ? $this->_mCfg['max_page_size'] : ($page_size < $this->_mCfg['min_page_size'] ? $this->_mCfg['page_size'] : $page_size); if ($filter) { $filter['active'] = $this->ex2pg(EXTERNAL_TRUE, EXTERNAL_DT_BOOL); $filter['wo_cost'] = $this->ex2pg($filter['wo_cost'], EXTERNAL_DT_BOOL); $filter['only_sbr'] = $this->ex2pg($filter['prefer_sbr'], EXTERNAL_DT_BOOL); if ($filter['my_specs']) { $filter['my_specs'] = $this->ex2pg($filter['my_specs'], EXTERNAL_DT_BOOL); $filter['user_specs'] = professions::GetProfessionsByUser($this->_sess->_uid, false, true); } if (isset($filter['categories']) && is_array($filter['categories'])) { $filter['categories'] = intarrPgSql($filter['categories']); $cats = $filter['categories']; $filter['categories'] = array(); foreach ($cats as $i => $arr) { if ($i > 1) { break; } if (is_array($arr) && !isNulArray($arr)) { if ($i == 1) { $arr = professions::GetMirroredProfs(implode(',', $arr)); } $filter['categories'][$i] = array_fill_keys($arr, $i); } } } list($filter['cost_from'], $filter['cost_to']) = projects_filters::preCosts($filter['cost_from'], $filter['cost_to']); } if ($prjs = $projects->getLastProjects($kind, $filter, $limit, true)) { foreach ($prjs as $key => $p) { $row = $this->pg2exRow($this->_mCfg['fields'], $p); if ($row['logo']) { $row['logo'] = WDCPREFIX . '/' . $row['logo']; } if ($attach = $projects->getAllAttach($p['id'])) { $row['attach'] = array(); foreach ($attach as $a) { $att = $this->pg2exRow($this->_mCfg['attach-fields'], $a); $att['link'] = WDCPREFIX . '/' . $a['path'] . $a['name']; $row['attach'][] = $att; } } $result[$key] = $row; } } return $result; }
/** * Залогинивает юзера. Возвращает UID юзера. Выставляет куки "автологина". * ВНИМАНИЕ! возвращает UID юзера, если находит его. Либо возвращает * 0 - не найден * -1 - аккаунт забанен * -2 - аккаунт неактивирован * -3 - IP не входит в список IP разрешенных пользователем * -4 - требуется 2ой этап авторизации * * @param string $login логин юзера * @param string $pwd пароль * @param integer $autologin флаг "автологина" * @return integer UID юзера */ function login($login, $pwd, $autologin = 0, $annoy_check = true) { require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/annoy.php"; $annoy = new annoy(); $user = new users(); if ($annoy_check) { if (intval($_SESSION['login_wait_time']) > time()) { $redirect_checkpass = true; } else { // Проверить сколько раз воодился пароль if (isset($_SESSION['login_wait_time'])) { $annoy->Clear(getRemoteIP()); } $login_count = $annoy->Check(getRemoteIP()); if ($login_count >= $GLOBALS['max_login_tries']) { $_SESSION['login_wait_time'] = time() + $GLOBALS['login_wait_time'] * 60; $redirect_checkpass = true; } } if ($redirect_checkpass == true) { header("Location: /checkpass.php"); exit; } } //Получаем логин и проверяем счетчик $_uid = $user->getUidByLoginEmailPhone($login); if ($_uid > 0 && !$annoy->allowRepeatPass($_uid)) { header("Location: /banned.php"); exit; } //@todo: нет проверок наличия ключей $t_filter_prj = $_SESSION['f_project_filter']; $t_filter_frl = $_SESSION['f_freelancers_filter']; $t_ref_uri2 = $_SESSION['ref_uri2']; $adCatalog = $_SESSION['toppayed_catalog']; $adMain = $_SESSION['toppayed_main']; $adHead = $_SESSION['toppayed_head']; $adText = $_SESSION['toppayed_text']; $masssending = $_SESSION['masssending']; $newPrjName = $_SESSION['new_project_name']; $newPrjCost = $_SESSION['new_project_cost']; //Сохраняем значение типа 2хэпапной авторизации перед очисткой сессии $_2fa_provider = isset($_SESSION['2fa_provider']) ? $_SESSION['2fa_provider'] : null; $_2fa_redirect = isset($_SESSION['2fa_redirect']) ? $_SESSION['2fa_redirect'] : null; //Переносим хеши ссылок на уже зафиксированные местки для юзера при выходе/входе $_ga_stat_url_hash = isset($_SESSION['ga_stat_url_hash']) ? $_SESSION['ga_stat_url_hash'] : null; //Последняя посещенная страница $_ref_uri = isset($_SESSION['ref_uri']) ? $_SESSION['ref_uri'] : null; $_pda = isset($_SESSION['pda']) ? $_SESSION['pda'] : null; $_customer_wizard = isset($_SESSION['customer_wizard']) ? $_SESSION['customer_wizard'] : null; session_unset(); if ($_customer_wizard) { $_SESSION['customer_wizard'] = $_customer_wizard; } if ($_pda) { $_SESSION['pda'] = $_pda; } if ($_ref_uri) { $_SESSION['ref_uri'] = $_ref_uri; } //Воссанавливаем значение хешей ссылок if ($_ga_stat_url_hash) { $_SESSION['ga_stat_url_hash'] = $_ga_stat_url_hash; } //Востанавливаем значение 2хэпапной авторизации после очистки сессии if ($_2fa_provider !== null) { $_SESSION['2fa_provider'] = $_2fa_provider; } if ($_2fa_redirect !== null) { $_SESSION['2fa_redirect'] = $_2fa_redirect; } //Выключаем проверку 2ого этапа авторизации //если это вход из куки или еще откуда (но неявно от пользователя) //где мы уже уверены что 2этапа пройдены ранее юзером $is_2fa_off = $annoy_check === false; //Авторизация $id = $user->Auth($login, $pwd, $_SESSION, $is_2fa_off); //Считаем и блокируем по количеству неудачных авторизаций if (!$id && $_uid > 0) { $annoy->wrongRepeatPass($_uid); } //Успешная авторизация if ($id > 0) { $annoy->clearRepeatPass($id); require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/payed.php"; $pro_last = payed::ProLast($_SESSION['login']); //Покупал ли пользователь ПРО 1 мес и более или тестовый if (!is_emp()) { $_SESSION['is_was_pro'] = $pro_last ? true : payed::isWasPro($_SESSION['uid']); } $_SESSION['pro_last'] = $pro_last['is_freezed'] ? false : $pro_last['cnt']; if ($_SESSION['pro_last'] && $_SESSION['is_pro_new'] != 't') { payed::checkNewPro($id); } if ($pro_last['freeze_to']) { $_SESSION['freeze_from'] = $pro_last['freeze_from']; $_SESSION['freeze_to'] = $pro_last['freeze_to']; $_SESSION['is_freezed'] = $pro_last['is_freezed']; $_SESSION['payed_to'] = $pro_last['cnt']; } if ($_SESSION['anti_login']) { $pro_last = payed::ProLast($_SESSION['anti_login']); $_SESSION['anti_pro_last'] = $pro_last['freeze_to'] ? false : $pro_last['cnt']; } require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/memBuff.php"; $memBuff = new memBuff(); $memBuff->delete("msgsCnt{$id}"); //Получение спецализаций фрилансера if (!is_emp()) { require_once ABS_PATH . "/classes/freelancer.php"; $specData = freelancer::getAllSpecAndGroup($id, is_pro()); $_SESSION['specs'] = $specData['specs']; //Список специализаций $_SESSION['groups'] = $specData['groups']; //Список групп //@todo: пока не используется //$_SESSION['specs_tree'] = $specData['specs_tree']; //Ввиде древа группа > специализации } require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/drafts.php"; $iDraftsCount = drafts::getCount($id); $_SESSION['drafts_count'] = $iDraftsCount; if ($autologin == 1) { setcookie('id', $id, time() + 60 * 60 * 24 * 30, '/', $GLOBALS['domain4cookie'], COOKIE_SECURE, true); setcookie('name', $login, time() + 60 * 60 * 24 * 30, '/', $GLOBALS['domain4cookie'], COOKIE_SECURE); setcookie('pwd', users::cookieHashPasswd($id), time() + 60 * 60 * 24 * 30, '/', $GLOBALS['domain4cookie'], COOKIE_SECURE, true); } $_SESSION['f_project_filter'] = $t_filter_prj; $_SESSION['f_freelancers_filter'] = $t_filter_frl; $_SESSION['ref_uri2'] = $t_ref_uri2; $_SESSION['toppayed_catalog'] = $adCatalog; $_SESSION['toppayed_main'] = $adMain; $_SESSION['toppayed_head'] = $adHead; $_SESSION['toppayed_text'] = $adText; if ($masssending) { $_SESSION['masssending'] = $masssending; } $_SESSION['new_project_name'] = $newPrjName; $_SESSION['new_project_cost'] = $newPrjCost; if ($t_filter_prj) { require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/projects_filter.php"; $prj_filter = new projects_filters(); $prj_filter->SaveFromAnon(); } if ($t_filter_frl) { require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/freelancers_filter.php"; $frl_filter = new freelancers_filters(); $frl_filter->SaveFromAnon(); } //var_dump($_SESSION['customer_wizard']); //var_dump($_SESSION['customer_wizard_filled']); //exit; //Если заказчик пытается опубликовать проект через мастер то публикуем после авторизации if (is_emp() && isset($_SESSION['customer_wizard']['filled'])) { require_once ABS_PATH . '/guest/models/GuestActivationModel.php'; $_SESSION['ref_uri'] = GuestActivationModel::model()->published($id, $_SESSION['email']); } } // случайное число, используемое в get/post запросах для защиты. if (!$_SESSION['rand']) { $_SESSION['rand'] = csrf_token(); } return $id; }
require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/freelancer.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/professions.php'; // страницу могут смотреть только зарегистрированые фрилансеры $uid = get_uid(false); if (!$uid || is_emp()) { include $_SERVER['DOCUMENT_ROOT'] . '/403.php'; exit; } $profession_id = __paramInit('int', null, 'profession', null); if ($profession_id !== null) { $redirect_to = '/projects/'; if ($profession_id > 0) { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/projects_filter.php'; //Создаем фильтр для проектов $f_category[1][$profession_id] = 1; $prj_filter = new projects_filters(); $prj_filter->Save($uid, '', '', 2, true, $f_category, '', '', '', false, $rerror, $error, 0, 0, false, false, false, false, false, false, false, false, 4, false, false); setcookie('new_pf0', 1, time() + 60 * 60 * 24 * 30, '/'); //Сохраняем как основную специализацию $or_spec = professions::GetProfessionOrigin($profession_id); $frl = new freelancer(); $frl->spec = $profession_id; $frl->spec_orig = $or_spec; professions::setLastModifiedSpec($uid, $profession_id); $frl->Update($uid, $error); $_SESSION['specs'] = $frl->GetAllSpecs($uid); } //Если есть редирект то он приоритетней if ($_SESSION['ref_uri']) { $redirect_to = urldecode($_SESSION['ref_uri']); }
get_uid(false); if ($_SESSION['p_ref']) { unset($_SESSION['p_ref']); } $prfs = new professions(); $profs = $prfs->GetAllProfessions("", 0, 1); $uid = get_uid(!$action); $page = intval($_GET['page']); if ($page < 1) { $page = 1; $bPageDefault = true; } // фильтр, этот фильтр не подключаем в ПДА if (!$PDA) { if ($kind != 8) { $prj_filter = new projects_filters(); $filter = $prj_filter->GetFilter($uid, $error, $filter_page); GaJsHelper::getInstance()->setProjectsFilterCategory($filter['categories']); adriver::getInstance()->setProjectsFilterCategory($filter['categories']); $filter['state'] = 0; $filter_apply = $filter['active'] == "t"; // проекты $prj = new new_projects(); $prj_content = $prj->SearchDB($kind, $page, $filter || is_emp() || hasPermissions('projects') ? 0 : 1, $filter, false, true); //echo $prj_content;die; $prj_pos = strpos($prj_content, '<!--data_found-->'); } else { $filter_page = $kind * 10; $filter_params = array('kind' => isset($_GET['kind']) ? intval($_GET['kind']) : intval($_POST['kind'])); // Развернутость / свернутость фильтра. if (isset($_COOKIE['new_pf' . $filter_page])) {
/** * Получение списока проектов * * @param array $aParams массив входящих данных * @return array $aResult ответ */ protected function x____projects_list($aParams = array()) { $this->_validDevice($aParams); require_once ABS_PATH . '/classes/projects_filter.php'; require_once ABS_PATH . '/classes/projects.php'; $nUid = get_uid(false); $nPage = self::$_aPlatform[$this->_sPlatform]['filter_page']; // какой фильтр получать $prj_filter = new projects_filters(); $filter = $prj_filter->GetFilter($nUid, $error, $nPage); if (is_array($filter) && $filter && $filter['active'] == 't' && $filter['use_main_filter'] == 't') { $filter = $prj_filter->GetFilter($nUid, $error, 0); } $nKind = intvalPgSql($aParams['kind']); $nKind = !empty($nKind) ? $nKind : $this->_mCfg['default_kind']; $nPage = intvalPgSql($aParams['page']); $nPage = !empty($nPage) ? $nPage : 1; $oPrj = new new_projects(); $oPrj->page_size = $this->_mCfg['items_per_page']; if (is_emp()) { $aProjects = $oPrj->GetCurPrjs($nUid, '', true, false, $nKind); $nPrgCnt = count($aProjects); } else { $aProjects = $oPrj->getProjects($nPrgCnt, $nKind, $nPage, true, $filter, true, false, NULL, false, NULL, true); } $aResult = array('projects_list' => array()); if (is_array($aProjects) && $aProjects) { $aItems = array(); $aIds = array(); $nCnt = 0; foreach ($aProjects as $aOne) { $aResult['projects_list'][$nCnt] = $this->_getProjectData($aOne); $aItems[$aOne['id']] =& $aResult['projects_list'][$nCnt]; $aIds[] = $aOne['id']; $nCnt++; } $aSpecs = new_projects::getSpecs($aIds); if (is_array($aSpecs) && $aSpecs) { foreach ($aSpecs as $aOne) { $aItems[$aOne['project_id']]['category_id'] = $aOne['category_id']; $aItems[$aOne['project_id']]['subcategory_id'] = $aOne['subcategory_id']; } } $aResult['projects_total'] = intval($nPrgCnt); } return $aResult; }
<div class="flt-out <?php echo $filter2_show ? "flt-show" : "flt-hide"; ?> " id="flt-ph" page="10"> <b class="b1"></b> <b class="b2"></b> <div class="flt-bar"> <a href="javascript: void(0);" class="flt-tgl-lnk"><?php echo $filter2_show ? "Свернуть" : "Развернуть"; ?> </a> <h3>Скрытые платные проекты <span id="flt-hide-cnt"><?php echo sizeof($_SESSION['ph']) && $_SESSION['uid'] ? " (" . sizeof($_SESSION['ph']) . ")" : ""; ?> </span></h3> </div> <div class="flt-cnt" id="flt-hide-content" <?php echo $filter2_show ? "style='display:block;'" : ""; ?> > <?php echo projects_filters::ShowClosedProjects($kind, $page, (int) ($filter['active'] == 't')); ?> </div> <b class="b2"></b> <b class="b1"></b> </div> <?php }