private function getOriginProf() { if (!$this->or_prof) { $this->or_prof = professions::GetProfessionOrigin($this->prof_id); } return $this->or_prof; }
/** * Инициализация. * * @param $link_id ID раздела псевдо-каталога */ public function fseoInit($link_id = null) { global $DB; $this->aGet = array(); $this->sSQLProfId = 0; $aLink = $DB->row('SELECT * FROM freelancer_seo WHERE id=?i', $link_id); if ($aLink) { $this->sLinkId = $aLink['id']; $this->sProfId = $aLink['prof_id']; $this->sTitle = $aLink['title']; $this->sCondition = $aLink['condition']; $this->nSide = $aLink['side']; $aParts = explode('&', $aLink['condition']); foreach ($aParts as $sOne) { list($sKey, $sVal) = explode('=', $sOne); if ($sKey == 'additional_prof' || $sKey == 'main_prof') { $this->aGet[$sKey] = professions::GetProfessionOrigin($sVal); } else { $this->aGet[$sKey] = explode(',', $sVal); } } if (!empty($this->aGet['main_prof']) || !empty($this->aGet['additional_prof'])) { $this->sSQLProfId = !empty($this->aGet['main_prof']) ? $this->aGet['main_prof'] : $this->aGet['additional_prof']; } } }
/** * Заполнение обязательных полей после регистрации через 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); }
} $kwords->moderUserKeys($uid, $prof_id, $aOldIds, $ids, $uid, $keys); } } require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/professions.php"; $obj_prof = new professions(); $error_prof .= $obj_prof->UpdateProfDesc($uid, $_POST['prof_id'], str_replace(" ", "", $_POST['prof_cost_from']), str_replace(" ", "", $_POST['prof_cost_to']), str_replace(" ", "", $_POST['prof_cost_hour']), str_replace(" ", "", $_POST['prof_cost_1000']), $_POST['prof_cost_type'], $_POST['prof_cost_type_hour'], $_POST['prof_time_type'], $_POST['prof_time_from'], $_POST['prof_time_to'], $_POST['prof_text'], $errorProfText); if (!$error_prof) { $info_prof = "Изменения внесены"; } $saved_prof_id = intval($_POST['prof_id']); break; case "spec_change": $spec = trim($_POST['spec']); require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/professions.php"; $or_spec = professions::GetProfessionOrigin($spec); $frl = new freelancer(); $frl->spec = $spec; $frl->spec_orig = $or_spec; professions::setLastModifiedSpec($uid, $spec); $error .= $frl->Update($uid, $res); $_SESSION['specs'] = $frl->GetAllSpecs($uid); break; case "save_spec_add": require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/professions.php"; if (professions::UpdateProfsAddSpec($uid, __paramInit('int', NULL, 'oldprof_id'), __paramInit('int', NULL, 'prof_id'), __paramInit('int', NULL, 'paid_id'))) { $_SESSION['specs'] = freelancer::GetAllSpecs($uid); header("Location: /users/{$login}/setup/specaddsetup/"); exit; } break;
/** * Обработка данных в шаге порфтоило * * @return string */ public function actionProcessingPortfolio() { $error = array(); $type = __paramInit('int', null, 'spec_column_id'); $spec = __paramInit('int', null, 'spec_db_id'); $spec_name = __paramInit('string', null, 'spec'); if ($type == 0) { $error['spec'] = 'Вы должны выбрать свою специализацию'; } else { $data['spec_orig'] = professions::GetProfessionOrigin($spec); } $data['spec'] = $spec; $data['exp'] = __paramInit('int', null, 'exp'); $data['cost_hour'] = __paramInit('float', null, 'cost_hour'); $data['cost_type_hour'] = __paramInit('int', null, 'currency_hour_db_id'); $curr_hour_name = __paramInit('string', null, 'currency_hour'); $data['cost_month'] = __paramInit('float', null, 'cost_month'); $data['cost_type_month'] = __paramInit('int', null, 'currency_month_db_id'); $curr_month_name = __paramInit('string', null, 'currency_month'); $data['resume'] = __paramInit('int', null, 'resume_id'); $data['info'] = stripslashes(__paramInit('string', null, 'info', '')); if (strlen($data['info']) > 4000) { $error['info'] = 'Исчерпан лимит символов для этого поля (4000 символов)'; } $data['in_office'] = $_POST['in_office'] == 1 ? 1 : 0; if ($data['resume'] > 0) { $resume = new CFile($data['resume']); } if ($data['exp'] < 0 || $data['exp'] > step_freelancer::MAX_YEAR_VALUE) { $error['exp'] = 'Недопустимое значение. Опыт работы должен быть в пределе от 0 до ' . step_freelancer::MAX_YEAR_VALUE . '.'; } if ($data['cost_hour'] < 0 || $data['cost_hour'] > $this->MAX_COST_HOUR[$data['cost_type_hour']]) { $error['cost_hour'] = 'Недопустимое значение. Стоимость часа работы должна быть в пределе ' . view_range_cost2(0, $this->MAX_COST_HOUR[$data['cost_type_hour']], '', '', false, $data['cost_type_hour'] . '.'); } if ($data['cost_month'] < 0 || $data['cost_month'] > $this->MAX_COST_MONTH[$data['cost_type_month']]) { $error['cost_month'] = 'Недопустимое значение. Стоимость месяца работы должна быть в пределе ' . view_range_cost2(0, $this->MAX_COST_MONTH[$data['cost_type_month']], '', '', false, $data['cost_type_month']) . '.'; } if (count($error) <= 0) { $insert['portfolio'] = serialize($data); $this->parent->saveFieldsInfo($insert); } // Обрабатываем порфтолио if (is_array($_POST['name'])) { foreach ($_POST['name'] as $k => $value) { $value = __paramValue('string', stripslashes($value)); $descr = __paramValue('string', stripslashes($_POST['descr'][$k])); $id = __paramValue('int', $_POST['id'][$k]); // id работы, если он есть $link = __paramValue('string', stripslashes($_POST['link'][$k])); $link = preg_replace("/^http:\\/\\//", "", trim($link)); if ($value == '' && $descr == '' && $link == '' && empty($_POST['pict_id'][$k])) { continue; } if (is_empty_html($value)) { $error['portf' . $k]['name'] = "Введите название работы"; } if (strlen($descr) > 1500) { $error['descr' . $k]['name'] = "Исчерпан лимит символов для этого поля (1500 символов)"; } if ($link != '' && !url_validate($link)) { $error['portf' . $k]['link'] = "Поле заполнено некорректно"; } $portf_insert[] = array("name" => $value, "pict_id" => $_POST['pict_id'][$k] > 0 ? intval($_POST['pict_id'][$k]) : null, "link" => $link, "prof_id" => $spec, "wiz_uid" => $this->getWizardUserID(), "descr" => $descr, "id" => $id); } } if (count($error) <= 0) { if (count($portf_insert) > 0) { $ids = $this->createWorks($portf_insert); } $this->parent->setCompliteStep(true); $this->parent->setNextStep($this->parent->getPosition() + 1); header("Location: /wizard/registration/"); exit; } $this->request = $data; $this->portf_insert = $portf_insert; return $error; }
/** * Возвращает количество всех и PRO фрилансеров по заданными профессиям * @param integer $all_count возвращает количество всех фрилансеров * @param integer $pro_count возвращает количество всех PRO-фрилансеров * @param string $all_profs если NULL, то $pro_profs должен быть не NULL, что означает, что нужно считать только ПРО-количество. * если 'ALL', то $pro_profs игнорируется и выдаются количества (то есть ВСЕХ и ПРО из них) * всех юзеров независимо от их специализаций, главное, чтобы они каким-то образом (по логике каталога) присутствовали в каталоге. * @param integer|string $all_profs список профессий (если список, то должна быть строка разделенная запятыми), из которых нужно брать только ПРО юзеров * @return integer успех выполнения */ function GetMergeCountByProfs(&$all_count, &$pro_count, $all_profs = NULL, $pro_profs = NULL) { global $DB; require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/professions.php"; $all_count = 0; $pro_count = 0; if (!$all_profs && !$pro_profs) { return 0; } if ($all_profs == 'ALL') { $pro_profs = NULL; } if ($all_profs && $all_profs != 'ALL') { $all_profs = professions::GetProfessionOrigin($all_profs); } if ($pro_profs && $pro_profs != 'ALL') { $pro_profs = professions::GetProfessionOrigin($pro_profs); } if ($all_profs == 'ALL' || $pro_profs == 'ALL') { $sql = "SELECT COUNT(fu.uid) as count,\n SUM((fu.is_pro IS TRUE)::int) as pro_count\n FROM fu\n INNER JOIN\n portf_choise pc\n ON pc.user_id = fu.uid\n AND pc.prof_id = fu.spec_orig" . ($pro_profs == 'ALL' ? ' WHERE fu.is_pro = true' : ''); } else { $sql = "\n SELECT\n COUNT(su.uid) as count,\n SUM((su.is_pro IS TRUE)::int) as pro_count\n FROM\n (" . (!$all_profs ? '' : "SELECT " . (!$pro_profs ? 'DISTINCT' : '') . " s.*\n FROM\n (\n SELECT uid, is_pro FROM fu WHERE is_banned = '0' AND spec_orig IN ({$all_profs})\n UNION ALL\n SELECT fu.uid, fu.is_pro\n FROM fu\n INNER JOIN\n spec_add_choise sp\n ON sp.user_id = fu.uid\n AND sp.prof_id IN ({$all_profs})\n WHERE fu.is_pro = true\n AND fu.is_banned = '0'\n UNION ALL\n SELECT fu.uid, fu.is_pro\n FROM fu\n INNER JOIN\n spec_paid_choise pc\n ON pc.user_id = fu.uid\n AND pc.prof_id IN ({$all_profs}) AND pc.paid_to > NOW()\n WHERE fu.is_banned = '0'\n ) as s" . (!$pro_profs ? '' : ' UNION ')) . (!$pro_profs ? '' : "SELECT " . (!$all_profs ? 'DISTINCT' : '') . " s.*\n FROM\n (\n SELECT uid, is_pro, is_team FROM fu WHERE is_pro=true AND is_banned = '0' AND spec_orig IN ({$pro_profs})\n UNION ALL\n SELECT fu.uid, fu.is_pro, fu.is_team\n FROM fu\n INNER JOIN\n spec_add_choise sp\n ON sp.user_id = fu.uid\n AND sp.prof_id IN ({$pro_profs})\n WHERE fu.is_pro = true\n AND fu.is_banned = '0'\n UNION ALL\n SELECT fu.uid, fu.is_pro, fu.is_team\n FROM fu\n INNER JOIN\n spec_paid_choise pc\n ON pc.user_id = fu.uid\n AND pc.prof_id IN ({$pro_profs}) AND pc.paid_to > NOW()\n WHERE fu.is_banned = '0'\n ) as s ") . "\n ) as su"; } $memBuff = new memBuff(); $count_arr = $memBuff->getSql($error, $sql, 1800); if (!$error) { $all_count = $count_arr[0]['count']; $pro_count = $count_arr[0]['pro_count']; return 1; } return 0; }
// #f5f5f5 фон графика // #f6f6f6 серый фон таблицы // #f7f7f7 серый блок внизу // #808080 темно-серые подписи к графику // #b2b2b2 светло-серые подписи к графику $u_m_prm_periods = array(); // склеенные периоды использования параметра (текущего инструмента самопродвижения), начиная с текущего месяца. $u_y_prm_periods = array(); // склеенные периоды использования параметра, начиная с текущего года. $u_last_prm_left = 0; // отступ в пикселях от начала годового графика до начала последнего юзерского ПРО-периода. $u_last_prm_width = 0; // ширина последнего юзерского ПРО-периода, в пикселях. $u_last_prm_period = NULL; $u_prm_end_time = 0; $u_spec = professions::GetProfessionOrigin($user->spec); $u_login = $user->login; $u_is_profi = $user->is_profi == 't'; $u_is_pro = $iAmAdmin ? is_pro(true, $uid) : $_SESSION['pro_last'] !== NULL; // ПРО ли он. Может измениться далее (см. ниже) -- связано с тем, что поле is_pro обновляется раз в минуту. $u_is_pro_auto_prolong = $user->GetField($uid, $e, 'is_pro_auto_prolong', false); // Включено ли у юзера автоматическое продление PRO $u_is_verify = $user->is_verify; $u_summary = promotion::GetSummary($uid); // данные по юзеру из stat_summary. $u_rating = $user->GetField($uid, $e, 'rating_get(rating, is_pro, is_verify)'); $u_pro_rating = $u_rating; // рейтинг, с учетом, что юзер купит ПРО (определяется ниже). $u_has_ps = false; // есть ли у него платные места хоть где-то. $u_has_ps_fp = false;
//Cсылка для new_paginator() $sHref = "%s" . $cur_page_url . "page=%d%s"; if ($page > 1) { $additional_header .= '<link rel="prev" href="' . $cur_page_url . 'page=' . ($page - 1) . '">'; } if ($page < $pages) { $additional_header .= '<link rel="next" href="' . $cur_page_url . 'page=' . ($page + 1) . '">'; } $content = "content.php"; } //------------------------------------------------------------------------------ // Попапы закреплений фрилансеров ---------------------------------------------- $popup = __paramInit('string', 'popup'); $freelancer_binds = new freelancer_binds(); $is_spec = $prof_id > 0; $prof_use = $is_spec ? professions::GetProfessionOrigin($prof_id) : $prof_group_id; $allow_frl_bind = $freelancer_binds->isAllowBind($uid, $prof_use, $is_spec); $binded_to = $freelancer_binds->getBindDateStop($uid, $prof_use, $is_spec); if ($allow_frl_bind || $binded_to) { quickPaymentPopupFrlbind::getInstance()->init(array('prof_id' => $prof_id, 'prof_group_id' => $prof_group_id, 'prof_use' => $prof_use, 'is_spec' => $is_spec, 'ammount' => $freelancer_binds->getPrice($prof_use, $is_spec, (bool) $binded_to, $uid), 'date_stop' => $binded_to, 'autoshow' => $popup == 'bind_prolong', 'addprof' => $is_spec && $freelancer_binds->needAddProf($uid, $prof_use))); } $is_bind_first = $freelancer_binds->isBindFirst($uid, $prof_use, $is_spec); if ($binded_to && !$is_bind_first) { quickPaymentPopupFrlbindup::getInstance()->init(array('prof_id' => $prof_use, 'is_spec' => $is_spec, 'ammount' => $freelancer_binds->getPriceUp($prof_use, $is_spec, $uid), 'autoshow' => $popup == 'bind_up')); } $is_binded_hide = $binded_to && !$freelancer_binds->isAllowBind($uid, $prof_use, $is_spec, false); //------------------------------------------------------------------------------ unset($_SESSION['payed_frl_' . md5($_SERVER['REQUEST_URI'])]); $first_pages = array(); if ($prof_group_id) { $first_pages = firstpage::GetAll($prof_group_id, array(), true);
/** * Проверяет по специализациям, может ли текущий пользователь ответить на проект. * * @param int $projec_id ид проекта * * @return boolean */ public static function offerSpecIsAllowed($projec_id) { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/professions.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/projects.php'; // ПРО отвечают без ограничений if (is_pro()) { return true; } if (!get_uid(false)) { return false; } $is_send_offers = false; $spec_project = new_projects::getSpecs($projec_id); $user_spec = professions::GetProfsAddSpec($_SESSION['uid']); if (is_array($user_spec)) { $user_spec = array_merge($user_spec, $_SESSION['specs']); } else { $user_spec = $_SESSION['specs']; } if ($user_spec) { $user_spec = array_merge($user_spec, professions::GetMirroredProfs(professions::GetProfessionOrigin(implode(',', $user_spec)))); $user_spec = array_unique($user_spec); //@todo запехать в один запрос foreach ($user_spec as $spec) { $prof_group[$spec] = professions::GetProfField($spec, 'prof_group'); } } foreach ($spec_project as $specs) { if (is_array($prof_group) && in_array($specs['category_id'], $prof_group)) { $is_send_offers = true; // Разрашаем оставлять отзыв break; } } return $is_send_offers; }
$anchor = 0; $cat_menu_freelancers = true; } else { // Подсчитываем количество избранных. Переписать в отдельный метод. // $fav_count = 0; if (!$prof_link) { $prof_link = professions::GetProfField($prof_id, 'link'); } $prof_name_arr = professions::GetProfTitle($prof_id); $prof_name = $prof_name_arr['name']; $prof_title = $prof_name_arr['title'] ? $prof_name_arr['title'] : $prof_name; $prof_type = professions::GetProfType($prof_id); //$prof_group_name = professions::GetProfGroupName($prof_id); $prof_descr = professions::GetProfField($prof_id, 'descr'); $prof_descr_text = professions::GetProfField($prof_id, 'descr_text'); $anchor = professions::GetProfessionOrigin($prof_id); $g_page_id = "1|" . $prof_id; if ($page == 1) { if (empty($prof_name_arr['title'])) { $page_title = $prof_title . " - фриланс, удаленная работа на FL.ru"; $page_keyw = $prof_title . ", Поиск работы, Предложение работы, Портфолио фри-лансеров, FL.ru"; } else { $page_title = $page_keyw = $prof_name_arr['title'] . " - фриланс, удаленная работа%prepositional_cityname% на FL.ru"; $page_keyw = $prof_name_arr['title'] . ", Поиск работы, Предложение работы, Портфолио фри-лансеров, FL.ru"; } } else { $page_title = $prof_name . ' - Страница ' . $page . ' - фриланс, удаленная работа%prepositional_cityname% на FL.ru'; $page_keyw = $prof_name . ', Страница ' . $page . ', FL.ru'; } if ($page == 1) { $page_descr = $prof_title . " Удаленная работа. Поиск работы. Предложение работы. Портфолио фри-лансеров. FL.ru";
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']); } $_user_action = isset($_REQUEST['user_action']) && $_REQUEST['user_action'] ? substr(htmlspecialchars($_REQUEST['user_action']), 0, 25) : ''; $_user_action = trim($_user_action); switch ($_user_action) { case 'tu':
/** * Возвращает номер позиции юзера в каталоге * * @param integer $user_id ИД Пользователя * @param integer $user_spec специализация юзера. * @param integer $rating рейтинг юзера. * @param integer $prof_id рейтинг юзера. * @param integer $is_pro Пользователь ПРО или не ПРО. * @return NULL|multitype */ function GetCatalogPosition($user_id, $user_spec, $rating, $prof_id, $is_pro, $not_exact = false) { global $DB; $R = 'rating_get(fu.rating, fu.is_pro, fu.is_verify, fu.is_profi)'; $pos = NULL; $memBuff = new memBuff(); if (!$prof_id) { if (!$not_exact) { $pos_table = professions::GetCatalogPositionsTable(); //такого не должно быть, но на всякий if (!$pos_table) { return NULL; } $out = $DB->row("SELECT 0 as prof_id, 'В общем каталоге' as prof_name, pos FROM {$pos_table} WHERE uid = ?", $user_id); if ($out) { return $out; } } $sql = "SELECT 0 as prof_id, 'В общем каталоге' as prof_name, COUNT(fu.uid) + 1 as pos\n FROM fu\n INNER JOIN\n portf_choise pc\n ON pc.user_id = fu.uid\n\n AND pc.prof_id = fu.spec_orig\n WHERE fu.is_banned = '0'\n AND (fu.is_pro = true " . ($is_pro ? 'AND' : 'OR') . " ({$R} > {$rating} OR ({$R} = {$rating} AND fu.uid < {$user_id})))"; if (!($out = $memBuff->getSql($error, $sql, 300))) { return NULL; } return $out[0]; } $or_prof = $prof_id; $or_prof = professions::GetProfessionOrigin($prof_id); $freelancer_binds = new freelancer_binds(); $date_binded = $freelancer_binds->getBindDate($user_id, $or_prof); $bind_select = $bind_join = $spec_where = ''; if ($date_binded) { $bind_join = "INNER JOIN freelancer_binds ON freelancer_binds.user_id = fu.uid AND freelancer_binds.prof_id = {$or_prof} AND freelancer_binds.is_spec = TRUE AND freelancer_binds.date_stop > NOW() AND freelancer_binds.date_start > '{$date_binded}'"; } else { //Ищем всех закрепленных $bind_select = "SELECT fu.uid, fb.prof_id as spec FROM fu \n LEFT JOIN freelancer_binds fb ON fb.user_id = fu.uid AND fb.date_stop > NOW()\n LEFT JOIN spec_add_choise bsa ON bsa.user_id = fu.uid\n WHERE fu.is_banned = '0' \n AND fb.prof_id={$or_prof} AND (fu.spec_orig = {$or_prof} OR bsa.prof_id = {$or_prof})\n AND fu.uid<>{$user_id} AND fu.cat_show = TRUE\n UNION ALL "; $spec_where = "AND (fu.is_pro = true " . ($is_pro ? 'AND' : 'OR') . " ({$R} > {$rating} OR ({$R} = {$rating} AND fu.uid <> {$user_id})" . ($user_spec == $or_prof ? ") AND fu.spec_orig={$or_prof}" : " OR fu.spec_orig={$or_prof})") . ")"; } $user_where = "\n fu.is_banned = '0' \n AND fu.uid <> {$user_id} \n AND fu.cat_show = TRUE \n AND fu.last_time > now() - '6 months'::interval\n " . $spec_where; $sql = "SELECT \n p.id as prof_id,\n p.name as prof_name,\n COUNT(DISTINCT s.uid) + 1 as pos,\n link\n \n FROM professions p\n LEFT JOIN\n (\n {$bind_select}\n \n SELECT uid, spec_orig as spec\n FROM fu\n {$bind_join}\n WHERE " . $user_where . "\n \n UNION ALL\n \n SELECT fu.uid, sa.prof_id FROM fu\n INNER JOIN spec_add_choise sa ON sa.user_id = fu.uid\n {$bind_join}\n WHERE fu.is_pro = true AND " . $user_where . "\n \n ) AS s ON s.spec = p.id\n \n WHERE p.id = {$or_prof}\n GROUP BY p.id, p.name, link"; $out = $memBuff->getSql($error, $sql, 300, true, freelancer::getCatalogMemTags($or_prof, true)); return $out ? $out[0] : null; }
/** * Редактирование работы в портфолио. * * @see self::addPortf(); * * @param integer $fid ИД * @param string $name Название работы * @param string $pict Основное изображение * @param string $sm_pict Уменьшенное изображение * @param string $link Ссылка на работу * @param string $descr Описание работы * @param integer $prof Специализация работы * @param integer $cost Стоимость работы * @param integer $cost_type Тип стоимости * @param integer $time_type Тип времени работы * @param integer $time_value Время рабты * @param integer $prev_type Тип превью * @param mixed $file_error Ошибка файла если есть * @param mixed $preview_error Превью ошибка * @param integer $new_position Новая позиция * @param integer $in_shop Работа в магазине * @param integer $is_video Есть ли видео * @param string $video_link Ссылка на видео * @param boolean $upd_prev Нужно ли обновить превью из основного изображения * @param integer $moduser_id UID изменяющего пользователя (админа). если null - то берется $fid * @param string $pict_filename Основное изображение для новой загрузки файлов * @param string $prev_pict_filename Уменьшенное изображение для новой загрузки файлов * @param string $login логин пользователя на случай если редактирует админ * @param string $modified_reason причина редактирования * * @return string Сообщение об ошибке */ public function EditPortf($fid, $name, $pict, $sm_pict, $link, $descr, $prof, $cost, $cost_type, $time_type, $time_value, $prev_type, $prj_id, &$file_error, &$preview_error, $new_position, $in_shop = 0, $video_link = '', $upd_prev = false, $moduser_id = null, $pict_filename = '', $prev_pict_filename = '', $login = '', $modified_reason = '') { global $DB; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/professions.php'; $prfs = new professions(); $profs = $prfs->GetAllProfessionsPortf($fid); foreach ($profs as $pf) { if ($pf['checked']) { $check_prof[] = $pf['id']; } } $check_prof[] = professions::CLIENTS_PROF_ID; $check_prof[] = professions::BEST_PROF_ID; if (!in_array($prof, $check_prof)) { return false; } $old_pict = $this->GetField($prj_id, 'pict'); $old_prev_pict = $this->GetField($prj_id, 'prev_pict'); $sp = $this->GetField($prj_id, 'show_preview'); $dir = $login ? $login : get_login($fid); $l_dir = substr($dir, 0, 2) . '/' . $dir; $mp = false; $filename = ''; $fullDir = 'users/' . $l_dir . '/upload/'; $moduser_id = $moduser_id ? $moduser_id : $fid; // если превью не загружено и требуется обновить превью на основе основного изображения if (!$sm_pict->size > 0 && $upd_prev) { $sm_pict = new CFile(); $sm_pict->GetInfo($fullDir . $old_pict); // оригинальное большое изображение if ($sm_pict->size > 0) { $sm_pict->table = 'file_template'; $sm_pict->quality = 100; if ($sm_pict->resizeImage($fullDir . 'sm_' . $sm_pict->name, 200, 200, 'auto', true)) { // уменьшаем $filename = 'sm_' . $sm_pict->name; $static_preview = $filename; $mp = true; } } } /** * Отдельно загруженное превью. */ if (($sm_pict->size > 0 || $prev_pict_filename) && !$upd_prev) { $preview_error = ''; if ($sm_pict->size > 0) { $sm_pict->max_image_size = array('width' => 200, 'height' => 200, 'less' => 0); $sm_pict->resize = 1; $sm_pict->proportional = 1; $sm_pict->prefix_file_name = 'sm_'; $sm_pict->max_size = 102400; $filename = $sm_pict->MoveUploadedFile($dir . '/upload'); $preview_error = $sm_pict->StrError(); // генерируем неанимированное gif превью для ответов в проектах (только для gif файлов) // файл будет такой: st_sm_f_имя файла.gif if ($sm_pict->image_size['type'] == 1) { $static_preview = 'st_' . $sm_pict->name; $sm_pict->resizeImage($sm_pict->path . $static_preview, 200, 200, 'auto', true); } else { $static_preview = $sm_pict->name; } } else { $filename = $prev_pict_filename; $static_preview = $prev_pict_filename; } if ($preview_error) { return $preview_error; } elseif ($old_prev_pict) { $cfile = new CFile(); $cfile->Delete(0, "users/{$l_dir}/upload/", $old_prev_pict); // удаляем ранее загруженное превью $mp = true; } else { $mp = true; } $sql = 'SELECT show_preview FROM portf_choise WHERE user_id=?i AND prof_id=?i'; $res = $DB->row($sql, $fid, $prof); $show_preview = $res['show_preview']; if ($show_preview == 't') { $sp = 't'; } } /*else $filename = $old_prev_pict;*/ if ($pict->size > 0 || $pict_filename) { $sql = 'SELECT prev_pict FROM portfolio WHERE id=?i AND user_id=?i'; $res = $DB->row($sql, $prj_id, $fid); if ($pict->size > 0) { $pict->max_size = 10485760; $pictname = $pict->MoveUploadedFile($dir . '/upload'); if (!isNulArray($pict->error)) { $file_error = true; return $pict->StrError; } } else { $pict = new CFile($fullDir . $pict_filename); $pictname = $pict_filename; } /*if (is_array($pictname)) list($pictname, $filename) = $pictname;*/ if ($upd_prev && !in_array($pict->getext(), $GLOBALS['graf_array'])) { $filename = null; $static_preview = null; $need_delete_preview = true; } if (isNulArray($pict->error) && in_array($pict->getext(), $GLOBALS['graf_array']) && !$filename && $res['prev_pict'] == '' || $upd_prev && in_array($pict->getext(), $GLOBALS['graf_array'])) { //print "2";exit; /** * Делаем превью. */ $pict->proportional = 1; //$pict->imgtosmall() /* if (!$pict->img_to_small("sm_".$pictname,array('width'=>200,'height'=>200))) { $mp = false; } else { $mp = true; $filename = "sm_".$pictname; } */ $pict->table = 'file_template'; $pict->quality = 100; if ($pict->resizeImage($fullDir . 'sm_' . $pict->name, 200, 200, 'auto', true)) { // уменьшаем $filename = 'sm_' . $pict->name; $static_preview = $filename; $mp = true; } $sql = 'SELECT show_preview FROM portf_choise WHERE user_id=?i AND prof_id=?i'; $res = $DB->row($sql, $fid, $prof); $show_preview = $res['show_preview']; if ($show_preview == 't') { $sp = 't'; if (!$mp) { $file_error .= 'Невозможно уменьшить картинку.'; $sp = 'f'; } } } if (isNulArray($pict->error) && $res['prev_pict'] == '') { if (!$cfile) { $cfile = new CFile(); if ($old_prev_pict && $sm_pict->name) { $cfile->Delete(0, "users/{$l_dir}/upload/", $old_prev_pict); // удаляем ранее загруженное превью $need_delete_preview = true; } } if ($old_pict) { $cfile->Delete(0, "users/{$l_dir}/upload/", $old_pict); } // удаляем ранее загруженное превью } } else { $pictname = $old_pict; } // для картинок: если превью загружено отдельно - делаем отдельное привью из оригинальной большой картинки $sPreview = $filename ? $filename : $old_prev_pict; if ($pictname != substr($sPreview, 3, strlen($sPreview))) { $sm_pict = new CFile(); if (($pict->size > 0 || $pict_filename) && $old_pict) { $sm_pict->Delete(0, "users/{$l_dir}/upload/", 'tn_' . $old_pict); } $sm_pict->GetInfo($fullDir . $pictname); if ($sm_pict->size > 0) { $ext = $sm_pict->getext(); if (in_array($ext, $GLOBALS['graf_array']) && $ext != 'swf') { $sm_pict->table = 'file_template'; $sm_pict->quality = 100; $sm_pict->resizeImage($fullDir . 'tn_' . $sm_pict->name, 200, 200, 'auto', true); } } } else { $sm_pict = new CFile(); $sm_pict->Delete(0, "users/{$l_dir}/upload/", 'tn_' . $pictname); } if ($in_shop == 1) { $in_shop = 't'; } else { $in_shop = 'f'; } $prof = professions::GetProfessionOrigin($prof); $sql = ''; if ($fid == $_SESSION['uid'] && !hasPermissions('users')) { // автор, не админ, не про меняет заголовок либо текст - отправить на модерирование $sModer = ' , moderator_status = ' . (!is_pro() ? '0' : '-2') . ' '; if (!is_pro()) { /*require_once( $_SERVER['DOCUMENT_ROOT'] . '/classes/stop_words.php' ); require_once( $_SERVER['DOCUMENT_ROOT'] . '/classes/user_content.php' ); $stop_words = new stop_words(); $nStopWordsCnt = $stop_words->calculate( $name, $descr ); $DB->insert( 'moderation', array('rec_id' => $prj_id, 'rec_type' => user_content::MODER_PORTFOLIO, 'stop_words_cnt' => $nStopWordsCnt) );*/ } } if ($mp) { $sql .= "UPDATE portfolio SET name='{$name}', link='{$link}', descr='{$descr}', cost='{$cost}', cost_type='{$cost_type}', time_type='{$time_type}', time_value='{$time_value}', prev_type='{$prev_type}', pict='{$pictname}', prev_pict='{$filename}', static_preview='{$static_preview}', prof_id='{$prof}'" . ($new_position !== NULL ? ", norder='{$new_position}'" : '') . ", edit_date = NOW(), edit_id = {$moduser_id}, modified_reason = '{$modified_reason}' {$sModer} WHERE (id='{$prj_id}' AND user_id='{$fid}') RETURNING norder"; } else { $sql .= "UPDATE portfolio SET show_preview = '{$sp}', name='{$name}', link='{$link}', descr='{$descr}', cost='{$cost}', cost_type='{$cost_type}', time_type='{$time_type}', time_value='{$time_value}', prev_type='{$prev_type}', pict='{$pictname}', " . ($need_delete_preview ? "prev_pict='',static_preview=''," : '') . " prof_id='{$prof}'" . ($new_position !== NULL ? ", norder='{$new_position}'" : '') . ", in_shop='{$in_shop}', video_link='{$video_link}', edit_date = NOW(), edit_id = {$moduser_id}, modified_reason = '{$modified_reason}' {$sModer} WHERE (id='{$prj_id}' AND user_id='{$fid}') RETURNING norder"; } $DB->squery($sql); return $error; }
/** * Считаем количество фрилансеров различных разрядов СБР * * @return array Данные подсчета */ function getRankCount($prof_id = 0) { $memBuff = new memBuff(); if ($prof_id) { $or_prof = professions::GetProfessionOrigin($prof_id); $tbl_s = "\n ( SELECT * FROM fu WHERE spec_orig = '{$or_prof}' UNION ALL\n SELECT fu.* FROM fu INNER JOIN spec_add_choise sp ON sp.user_id = fu.uid AND sp.prof_id = '{$or_prof}' WHERE fu.is_pro = true\n UNION ALL\n SELECT fu.* FROM fu INNER JOIN spec_paid_choise spc ON spc.user_id = fu.uid AND spc.prof_id = '{$or_prof}' AND spc.paid_to > now()\n ) as s\n "; } else { $tbl_s = "fu s"; $join_pc = "\n INNER JOIN\n portf_choise pc\n ON pc.prof_id = s.spec_orig\n AND pc.user_id = s.uid\n "; } $sql = "\n SELECT SUM((r.rank=3)::int) as rank3, SUM((r.rank=2)::int) as rank2, SUM((r.rank=1)::int) as rank1\n FROM rating r\n INNER JOIN\n {$tbl_s}\n ON s.uid = r.user_id\n AND s.is_banned = '0'\n {$join_pc}\n WHERE r.rank > 0\n "; $rank = $memBuff->getSql($error, $sql, 3600); if ($error || !$rank) { return NULL; } return $rank[0]; }
public function setSelectFilter($filter) { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/professions.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/project_exrates.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/teams.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/freelancer.php'; $project_exRates = project_exrates::GetAll(); $set_select[] = '*'; // Разделы/Подразделы if ($filter['prof']) { if (count($filter['prof'][0]) > 0) { $p1 = professions::getProfIdForGroups(array_keys($filter['prof'][0]), true); } if (count($filter['prof'][1]) > 0) { $p2 = professions::GetProfessionOrigin(implode(',', array_keys($filter['prof'][1]))); } $specs = explode(',', ($p2 ? $p2 : '') . ($p1 && $p2 ? ', ' : '') . ($p1 ? $p1 : '')); $this->_engine->setFilter('specs', $specs); $this->_sortby = 'is_pro DESC, spec_origin IN (' . implode(',', $specs) . ') rating DESC, @id'; } //Стоимость if ($filter['cost']) { foreach ($filter['cost'] as $val) { if ($val['cost_from'] || $val['cost_to']) { switch ($val['type_date']) { default: case 4: if ($prof_id) { $cf = 'pcost_hour'; $ct = 'pcost_type_hour'; } else { $cf = 'cost_hour'; $ct = 'cost_type_hour'; } break; case 3: $cf = 'cost_from'; $ct = 'cost_type'; break; case 1: $cf = 'cost_month'; $ct = 'cost_type_month'; break; case 2: $cf = 'cost_1000'; $ct = 'cost_type'; break; } $cr = (int) $val['cost_type']; $cex = array(freelancer::USD => project_exrates::USD, freelancer::EUR => project_exrates::EUR, freelancer::RUR => project_exrates::RUR, freelancer::FM => project_exrates::FM); if (($cost_from = (double) $val['cost_from']) < 0) { $cost_from = 0; } if (($cost_to = (double) $val['cost_to']) < 0) { $cost_to = 0; } if ($cost_to < $cost_from && $cost_to != 0) { $cost_to = $cost_from; } if ($cost_to || $cost_from) { $cost_sql = ''; for ($i = 0; $i < 4; ++$i) { $exfr = round($cost_from * $project_exRates[$cex[$cr] . $cex[$i]], 4); $exto = round($cost_to * $project_exRates[$cex[$cr] . $cex[$i]], 4); $cost[] = "({$ct} = {$i} AND {$cf} >= {$exfr}" . ($cost_to ? " AND {$cf} <= {$exto}" : '') . ')'; } $select[] = implode(' OR ', $cost); } } } if ($select) { $set_select[] = 'IF( ( ' . implode(' OR ', $select) . ' ), 1, 0) as cost_filter'; unset($select); $this->_engine->setFilter('cost_filter', array(1)); } } // Опыт работы if ($filter['exp'][0] > 0 || $filter['exp'][1] > 0) { if ($filter['exp'][1] == 0 && $filter['exp'][0] > 0) { $select[] = "( exp >= {$filter['exp'][0]} )"; } elseif ($filter['exp'][1] > 0 && $filter['exp'][0] == 0) { $select[] = "( exp <= {$filter['exp'][1]} )"; } else { $select[] = "( exp >= {$filter['exp'][0]} AND exp <= {$filter['exp'][1]} )"; } $set_select[] = 'IF( ( ' . implode(' OR ', $select) . ' ), 1, 0) as exp_filter'; unset($select); $this->_engine->setFilter('exp_filter', array(1)); } //Возраст if ($filter['age'][1] > 0 || $filter['age'][0] > 0) { $age_from = $filter['age'][0]; $age_to = $filter['age'][1]; if ($age_to == 0 && $age_from > 0) { $select[] = "( age >= {$age_from} )"; } elseif ($age_to > 0 && $age_from == 0) { $select[] = "( age <= {$age_to} )"; } else { $select[] = "( age >= {$age_from} AND age <= {$age_to} )"; } $set_select[] = 'IF( ( ' . implode(' OR ', $select) . ' ), 1, 0) as age_filter'; unset($select); $this->_engine->setFilter('age_filter', array(1)); } // Местоположение if ($filter['country']) { $this->_engine->setFilter('country', array($filter['country'])); } if ($filter['city']) { $this->_engine->setFilter('city', array($filter['city'])); } // Ищет работу в офисе if ($filter['in_office']) { $this->_engine->setFilter('in_office', array(1)); } // У меня в избранных if ($filter['in_fav']) { $teams = new teams(); if ($tt = $teams->teamsFavorites($uid, $error)) { foreach ($tt as $t) { $select[] = " ( uid = {$t['uid']} ) "; } $set_select[] = 'IF(( ' . implode(' OR ', $select) . ' ), 1, 0) as is_fav'; unset($select); $this->_engine->setFilter('is_fav', array(1)); } } //С PRO аккаунтом if ($filter['is_pro']) { $this->_engine->setFilter('is_pro', array(1)); } //С положительными рекомендациями if ($filter['sbr_is_positive']) { $select[] = '( sbr_opi_plus > 0 )'; $set_select[] = 'IF(( ' . implode(' OR ', $select) . ' ), 1, 0) as sbr_positive_filter'; unset($select); $this->_engine->setFilter('sbr_positive_filter', array(1)); } //Без отрицательных рекомендаций if ($filter['sbr_not_negative']) { $select[] = '( sbr_opi_minus = 0 )'; $set_select[] = 'IF(( ' . implode(' OR ', $select) . ' ), 1, 0) as sbr_not_negative_filter'; unset($select); $this->_engine->setFilter('sbr_not_negative_filter', array(1)); } //С положительными мнениями /*if($filter['opi_is_positive']) { $select[] = '( ops_emp_plus > 0 )'; $set_select[] = "IF(( ".implode(" OR ", $select)." ), 1, 0) as opi_positive_filter"; unset($select); $this->_engine->setFilter("opi_positive_filter", array(1)); } //Без отрицательных мнений if($filter['opi_not_negative']) { $select[] = '( ops_emp_minus = 0 )'; $set_select[] = "IF(( ".implode(" OR ", $select)." ), 1, 0) as opi_not_negative_filter"; unset($select); $this->_engine->setFilter("opi_not_negative_filter", array(1)); }*/ // Только с примерами работ if ($filter['is_preview']) { $select[] = '( o_wrk_factor_a > 0 )'; $set_select[] = 'IF(( ' . implode(' OR ', $select) . ' ), 1, 0) as preview_filter'; unset($select); $this->_engine->setFilter('preview_filter', array(1)); } // Только свободные if ($filter['only_free']) { $select[] = '( status_type = 0)'; $set_select[] = 'IF(( ' . implode(' OR ', $select) . ' ), 1, 0) as onlyfree_filter'; unset($select); $this->_engine->setFilter('onlyfree_filter', array(1)); } //С успешным СБР if ($filter['success_sbr'][0] == 1) { $select[] = '( sbr_sum > 0 )'; for ($i = 1; $i < 4; ++$i) { if ($filter['success_sbr'][$i] == 1) { $rank[] = "( rank = {$i} )"; } } if ($rank) { $select[] = '( ' . implode(' OR ', $rank) . ' )'; } $set_select[] = 'IF(( ' . implode(' AND ', $select) . ' ), 1, 0) as sbr_rank_filter'; unset($select); $this->_engine->setFilter('sbr_rank_filter', array(1)); } if ($set_select) { $this->_engine->setSelect(implode(', ', $set_select)); } }