/** * Отправить услугу на модерацию. * * @param int $id * @param array $data */ public function sendToModeration($id, $data, $status = 0) { $stop_words = new stop_words(); $nStopWordsCnt = $stop_words->calculate($data['title'], $data['description'], $data['requirement']); $this->db()->insert($this->TABLE_MODERATION, array('rec_id' => $id, 'rec_type' => 22, 'stop_words_cnt' => $nStopWordsCnt, 'status' => $status)); }
/** * Редактировать проект * * @param array $prj Данные для редактирования * @param object $newattach Новые файлы (@see class CFile) * @return boolean true если редактирование прошло успешно, иначе false */ function editPrj($prj, $newattach, $categories = false) { global $DB; if ($prj['kind'] == 7) { preg_match("/^([0-9]{1,2})\\-([0-9]{1,2})\\-([0-9]{4})\$/", $prj['end_date'], $o1); preg_match("/^([0-9]{1,2})\\-([0-9]{1,2})\\-([0-9]{4})\$/", $prj['win_date'], $o2); if ($o1) { $end_date = date('Y-m-d', mktime(0, 0, 0, $o1[2], $o1[1], $o1[3])); } else { $end_date = $prj['end_date']; } if ($o2) { $win_date = date('Y-m-d', mktime(0, 0, 0, $o2[2], $o2[1], $o2[3])); } else { $win_date = $prj['win_date']; } } else { $end_date = NULL; $win_date = NULL; } $top_set = $post_set = ''; if ($prj['top_days']) { $top_set = $DB->parse(",\n top_from = CASE WHEN COALESCE(top_to,'epoch') >= now() THEN top_from ELSE now() END,\n top_to = CASE WHEN COALESCE(top_to,'epoch') >= now() THEN top_to + '?i days'::interval ELSE now() + '?i days'::interval END\n ", $prj['top_days'], $prj['top_days']); } if ($prj['post_now']) { $post_set = ", post_date = NOW()"; } $sql = ''; if ($prj['user_id'] == $_SESSION['uid'] && !hasPermissions('projects')) { // автор, не админ, не про - отправить на модерирование $sModeration = 'moderator_status = 0, '; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/stop_words.php'; $stop_words = new stop_words(); $nStopWordsCnt = $stop_words->calculate($prj['name'], $prj['descr']); $this->addModeration($prj['id'], $nStopWordsCnt); } $prj['payed'] = round($prj['payed'], 0); $prj['strong_top'] = hasPermissions('projects') ? (int) $prj['strong_top'] : 0; $sql .= $DB->parse("UPDATE projects\n SET state = ?i,\n name = ?,\n cost = ?f,\n descr = ?,\n currency = ?i,\n kind = ?i,\n country = ?i,\n city = ?i,\n payed = ?,\n pro_only = ?b,\n verify_only = ?b,\n videolnk = ?,\n strong_top = ?i,\n logo_id = ?i,\n link = ?,\n is_color = ?b,\n is_bold = ?b,\n billing_id = ?i,\n payed_items = ?,\n edit_date = NOW(),\n\t\t\t\tend_date = ?,\n\t\t\t\tbudget_type = ?i,\n\t\t\t\tpriceby = ?i,\n prefer_sbr = ?b,\n urgent = ?b,\n hide = ?b,\n o_urgent = ?b,\n o_hide = ?b,\n contacts = ?,\n {$sModeration}\n\t\t\t\twin_date = ?\n {$top_set}\n {$post_set}\n WHERE id = ?i\n ", $prj['state'], $prj['name'], $prj['cost'], $prj['descr'], $prj['currency'], $prj['kind'], $prj['country'], $prj['city'], $prj['payed'], $prj['pro_only'], $prj['verify_only'], $prj['videolnk'], $prj['strong_top'], $prj['logo_id'], $prj['link'], $prj['is_color'], $prj['is_bold'], $prj['billing_id'], $prj['payed_items'], $end_date, $prj['budget_type'], $prj['priceby'], $prj['prefer_sbr'], $prj['urgent'], $prj['hide'], $prj['urgent'], $prj['hide'], $prj['contacts'], $win_date, $prj['id']); if ($categories) { $this->saveSpecs($prj['id'], $categories); } $DB->query("DELETE FROM project_attach WHERE project_id = ?i", $prj['id']); // Удаляем все if ($newattach && is_array($newattach)) { $sql .= ";INSERT INTO project_attach (project_id, file_id) VALUES "; $i = 0; foreach ($newattach as $a) { $sql .= ($i++ ? ',' : '') . $DB->parse('(?i, ?i)', $prj['id'], $a['file_id']); } } //Обновляем информацию в старых преоктах (которые хранились также в таблице blogs_msgs) if (is_new_prj($prj['post_date'])) { $base = $prj['kind'] == 2 ? 5 : 3; $sql .= $DB->parse(";UPDATE blogs_msgs b\n SET title = ?,\n msgtext = ?,\n modified = NOW()\n FROM blogs_themes_old t\n WHERE t.id_gr = ?i\n AND t.base = ?i\n AND b.thread_id = t.thread_id\n AND b.reply_to IS NULL", $prj['name'], $prj['descr'], $prj['id'], $base); } return !!$DB->squery($sql); }
function addUserTopNew($ad) { global $DB; $insert = array(); $insert['uid'] = $ad['uid']; $insert['type_place'] = $ad['type_place']; if ($ad['ad_header']) { $insert['ad_header'] = $ad['ad_header']; } if ($ad['ad_text']) { $insert['ad_text'] = $ad['ad_text']; } if ($ad['ad_img_file_name']) { $insert['ad_img_file_name'] = $ad['ad_img_file_name']; } $DB->setCheckAutoSlashes(false); $nId = $DB->insert('paid_places', $insert, 'id'); if ($nId) { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/user_content.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/stop_words.php'; $stop_words = new stop_words(true); $nStopWordsCnt = $stop_words->calculate($ad['ad_header'], $ad['ad_text']); $DB->insert('moderation', array('rec_id' => $nId, 'rec_type' => user_content::MODER_CAROUSEL, 'stop_words_cnt' => $nStopWordsCnt)); } $DB->setCheckAutoSlashes(true); return !empty($nId); }
/** * Восстанавливает комментарий. * * @param int $cid id комментария * * @return string сообщение об ошибке или пустая строка, если все нормально */ public function RestoreComment($cid) { global $DB; if ($this->is_moder) { $cid = intval($cid); $sModer = ''; if (!hasPermissions('projects') && !is_pro()) { $p_comment = $this->GetComment($cid); if ($p_comment['user_id'] == $_SESSION['uid']) { 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($p_comment['msg']); $sModer = ' , moderator_status =' . ($nStopWordsCnt ? ' 0 ' : ' NULL '); if ($nStopWordsCnt) { $DB->insert('moderation', array('rec_id' => $cid, 'rec_type' => user_content::MODER_CONTEST_COM, 'stop_words_cnt' => $nStopWordsCnt)); } else { $DB->query('DELETE FROM moderation WHERE rec_id = ?i AND rec_type = ?i;', $cid, user_content::MODER_CONTEST_COM); } } } $DB->query("UPDATE projects_contest_msgs SET deleted = NULL, deluser_id = NULL {$sModer} WHERE id = ?i", $cid); return $DB->error; } }
/** * Добавление предложения к проекту. * * @param integer $user_id id фрилансера * @param integer $prj_id id проекта * @param integer $cost_from цена ОТ * @param integer $cost_to цена ДО * @param integer $cost_type валюта цены * @param integer $time_from время ОТ * @param integer $time_to время ДО * @param integer $time_type тип времени (0 - часы, 1 - дни. 2 - месяцы) * @param string $text текст предложения * @param string $work1_id id 1 прикрепленной работы * @param string $work2_id id 2 прикрепленной работы * @param string $work3_id id 3 прикрепленной работы * @param string $work1_link ссылка на 1 прикрепленную работы * @param string $work2_link ссылка на 2 прикрепленную работы * @param string $work3_link ссылка на 3 прикрепленную работы * @param string $work1_name название 1 прикрепленной работы * @param string $work2_name название 2 прикрепленной работы * @param string $work3_name название 3 прикрепленной работы * @param array $work1_pict файл 1 работы * @param array $work2_pict файл 2 работы * @param array $work3_pict файл 3 работы * @param array $work1_prev_pict файл превью 1 работы * @param array $work2_prev_pict файл превью 2 работы * @param array $work3_prev_pict файл превью 3 работы * @param boolean $for_customer_only показывать предложение только работоадетлю * @param integer $dialogueId id ветки диалога * @param integer $emp_read прочитано работодателем или нет * @param boolean $prefer_sbr предпочитаю работать с СБР * @param boolean $auto 0 или ID автоответа (не обновляется) * @param integer $moduser_id UID пользователя (админа), изменяющего предложение. если null - то $user_id id фрилансера * @param string modified_reason Причина редактирования * * @return string текст ошибки в случае неуспеха */ public function AddOffer($user_id, $prj_id, $cost_from, $cost_to, $cost_type, $time_from, $time_to, $time_type, $text, $work1_id, $work2_id, $work3_id, $work1_link, $work2_link, $work3_link, $work1_name, $work2_name, $work3_name, $work1_pict, $work2_pict, $work3_pict, $work1_prev_pict, $work2_prev_pict, $work3_prev_pict, $for_customer_only = false, $dialogueId = 0, $emp_read = 0, $prefer_sbr = false, $is_color = false, $contacts = null, $payed_items = '0', $auto = 0, $moduser_id = null, $modified_reason = '') { global $DB; $obj_portfolio = new portfolio(); $obj_dialogue = new projects_offers_dialogue(); if ((int) $user_id <= 0 || (int) $prj_id <= 0) { return false; } $is_color = $is_color ? 't' : 'f'; if ($cost_from < 0 && $cost_from !== '') { $cost_from = 0; //$error = 'Начальная стоимость должна быть положительным числом.'; } if ($cost_to < 0 && $cost_to !== '') { $cost_to = 0; //$error = 'Конечная стоимость должна быть положительным числом.'; } if ($cost_to !== '' && $cost_from !== '' && ($cost_to < $cost_from && $cost_to > 0)) { $wrk = $cost_to; $cost_to = $cost_from; $cost_from = $wrk; } if ($time_from < 0 && $time_from !== '') { $time_from = 0; } if ($time_to < 0 && $time_to !== '') { $time_to = 0; } if ($time_to !== '' && $time_from !== '' && $time_to < $time_from && intval($time_to) > 0) { $wrk = $time_to; $time_to = $time_from; $time_from = $wrk; } $prj_id = intval($prj_id); $user_id = intval($user_id); $cost_from = floatval(str_replace(',', '.', str_replace(' ', '', $cost_from))); $cost_to = floatval(str_replace(',', '.', str_replace(' ', '', $cost_to))); $cost_type = intval($cost_type); $time_from = intval($time_from); $time_to = intval($time_to); $time_type = intval($time_type); $text = __paramValue('string', $text); $text = str_replace("\r\n", "\n", $text); // Cчитается как два символа -- поэтому надо заменить на один, чтобы при подсчете символов последние символы не обрезались //$text = preg_replace("/(\r\n|\r|\n){3,100}/i", "\r\n\r\n", $text);//trim(substr(change_q(trim($text), true, 90), 0, 3000)); $for_customer_only = $for_customer_only ? 't' : 'f'; $prefer_sbr = $prefer_sbr ? 't' : 'f'; $work1_id = intval($work1_id); $work2_id = intval($work2_id); $work3_id = intval($work3_id); $work1_pict = substr(change_q(trim($work1_pict), false, 25), 0, 24); $work2_pict = substr(change_q(trim($work2_pict), false, 25), 0, 24); $work3_pict = substr(change_q(trim($work3_pict), false, 25), 0, 24); $work1_prev_pict = substr(change_q(trim($work1_prev_pict), false, 30), 0, 29); $work2_prev_pict = substr(change_q(trim($work2_prev_pict), false, 30), 0, 29); $work3_prev_pict = substr(change_q(trim($work3_prev_pict), false, 30), 0, 29); $work1_pict = $work1_pict == '' && $work1_prev_pict != '' ? $work1_prev_pict : $work1_pict; $work2_pict = $work2_pict == '' && $work2_prev_pict != '' ? $work2_prev_pict : $work2_pict; $work3_pict = $work3_pict == '' && $work3_prev_pict != '' ? $work3_prev_pict : $work3_pict; $moduser_id = $moduser_id ? $moduser_id : $user_id; $payed_items = $payed_items == '1' ? $payed_items : '0'; $sql = "SELECT po.*, pb.id IS NOT NULL AS is_blocked \n FROM projects_offers AS po\n LEFT JOIN projects_offers_blocked pb ON pb.src_id = po.id\n WHERE po.project_id = '{$prj_id}' AND po.user_id = " . $user_id; $po = $DB->row($sql, $prj_id, $user_id); if ($DB->error) { return $DB->error; } $sql = 'SELECT e.is_pro FROM projects p INNER JOIN employer e ON e.uid = p.user_id WHERE p.id = ?i'; $emp_is_pro = $DB->val($sql, $prj_id); if ($po['is_blocked'] == 't' && $moduser_id == $user_id) { return 'OfferIsBlocked'; } $slashedText = addslashes($text); if ($po['id']) { if ($po['refused'] == 't' && $moduser_id == $user_id) { return 403; } $sql = ''; $sModer = ''; if ($emp_is_pro != 't' && $moduser_id == $user_id && !hasPermissions('projects') && !is_pro() && ($po['descr'] != $slashedText || $po['pict1'] != $work1_pict && !empty($work1_pict) || $po['pict2'] != $work2_pict && !empty($work2_pict) || $po['pict3'] != $work3_pict && !empty($work3_pict) || $po['prev_pict1'] != $work1_prev_pict && !empty($work1_prev_pict) || $po['prev_pict2'] != $work2_prev_pict && !empty($work2_prev_pict) || $po['prev_pict3'] != $work3_prev_pict && !empty($work3_prev_pict))) { // автор, не админ, не про меняет заголовок либо текст - отправить на модерирование 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($slashedText); $sModer = ' , moderator_status =' . ($nStopWordsCnt ? ' 0 ' : ' NULL '); if ($nStopWordsCnt) { // если есть что то подозрительное - на модерирование $DB->insert('moderation', array('rec_id' => $po['id'], 'rec_type' => user_content::MODER_PRJ_OFFERS, 'stop_words_cnt' => $nStopWordsCnt)); } else { // иначе на модерирование не отправляем $DB->query('DELETE FROM moderation WHERE rec_id = ?i AND rec_type = ?i;', $po['id'], user_content::MODER_PRJ_OFFERS); } } $sql .= "UPDATE projects_offers SET\n descr = '{$slashedText}',\n cost_from = {$cost_from},\n cost_to = {$cost_to},\n cost_type = {$cost_type},\n time_from = {$time_from},\n time_to = {$time_to},\n time_type = {$time_type},\n portf_id1 = '{$work1_id}',\n portf_id2 = '{$work2_id}',\n portf_id3 = '{$work3_id}',\n pict1 = '{$work1_pict}',\n pict2 = '{$work2_pict}',\n pict3 = '{$work3_pict}',\n prev_pict1 = '{$work1_prev_pict}',\n prev_pict2 = '{$work2_prev_pict}',\n prev_pict3 = '{$work3_prev_pict}',\n only_4_cust = '{$for_customer_only}',\n prefer_sbr = '{$prefer_sbr}',\n po_emp_read = '{$emp_read}',\n is_color = '{$is_color}',\n payed_items = B'{$payed_items}',\n moduser_id = {$moduser_id}, \n modified_reason = '{$modified_reason}',\n " . ($contacts !== null ? "offer_contacts = '{$contacts}'," : '') . "\n modified = now() \n {$sModer} \n WHERE id = {$po['id']} AND refused = false"; $this->offer_id = $po['id']; $DB->squery($sql); $error = $DB->error; if ($dialogueId) { $error .= $obj_dialogue->SaveDialogueMessage($user_id, $text, $dialogueId, 0, true, $moduser_id); $authorId = $DB->val('SELECT user_id FROM projects WHERE id = ?', $prj_id); $memBuff = new memBuff(); $memBuff->delete("prjEventsCnt{$authorId}"); } return $error; } else { $nStopWordsCnt = 0; if ($emp_is_pro != 't' && !is_pro()) { // если нужно считаем стоп-слова require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/stop_words.php'; $stop_words = new stop_words(); $nStopWordsCnt = $stop_words->calculate($slashedText); } include_once $_SERVER['DOCUMENT_ROOT'] . '/classes/projects_offers_answers.php'; $sModVal = !is_pro() && $emp_is_pro != 't' && $nStopWordsCnt ? '0' : 'NULL'; $sql = "INSERT INTO projects_offers (project_id, user_id, cost_from, cost_to, cost_type, time_from, time_to, time_type, portf_id1, portf_id2, portf_id3, pict1, pict2, pict3, prev_pict1, prev_pict2, prev_pict3, only_4_cust, prefer_sbr, po_emp_read, descr, is_color, payed_items, offer_contacts, po_frl_read, moderator_status, auto)\n ( SELECT {$prj_id}, {$user_id}, {$cost_from}, {$cost_to}, {$cost_type}, {$time_from}, {$time_to}, {$time_type}, '{$work1_id}', '{$work2_id}', '{$work3_id}', '{$work1_pict}', '{$work2_pict}', '{$work3_pict}', '{$work1_prev_pict}', '{$work2_prev_pict}', '{$work3_prev_pict}', '{$for_customer_only}', '{$prefer_sbr}', '{$emp_read}', '{$slashedText}', '{$is_color}', B'{$payed_items}', '{$contacts}', TRUE, {$sModVal}, {$auto} \n WHERE NOT EXISTS(SELECT 1 FROM projects_blocked WHERE project_id = {$prj_id}) ); \n SELECT currval('projects_offers_id_seq');"; $po_id = $DB->val($sql); $error = $DB->error; $this->offer_id = $po_id; if ($po_id) { if ($emp_is_pro != 't' && !is_pro() && $nStopWordsCnt) { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/user_content.php'; $DB->insert('moderation', array('rec_id' => $po_id, 'rec_type' => user_content::MODER_PRJ_OFFERS, 'stop_words_cnt' => $nStopWordsCnt)); } $error .= $obj_dialogue->AddDialogueMessage($po_id, $user_id, $text, true, false, true); } if (!$error) { $_SESSION['po_count'] = (int) $_SESSION['po_count'] + 1; } return $error; } }
/** * Отправить на модерирование запись какой-либо сущности * * @param int $rec_id - ID записи * @param int $rec_type - ID в admin_contents - сущность для модерирования * @param array $data - тестовые данные для автоматической проверки на стоп-слова */ static function sendToModeration($rec_id, $rec_type, $data = null) { $stop_words = new stop_words(); $nStopWordsCnt = $stop_words->calculate($data); $GLOBALS['DB']->insert('moderation', array('rec_id' => $rec_id, 'rec_type' => $rec_type, 'stop_words_cnt' => $nStopWordsCnt)); }
/** * Изменение данных пользователя * Должны быть определены только те переменные, которые надо изменять * Перед вызовом проверить переменные класса! * * @param integer $fid id пользователя * @param array $res ошибки базы данных * @param string $eddition дополнительное условие SQL * * @return string (error) */ public function Update($fid, &$res, $eddition = '') { global $DB; if (!$fid) { return 'Пользователь не определен!'; } //Хотфикс $parnames = array('skype_as_link', 'skype_1_as_link', 'skype_2_as_link', 'skype_3_as_link', 'email_as_link', 'email_1_as_link', 'email_2_as_link', 'email_3_as_link'); $current = get_class($this); $class_vars = get_class_vars(get_class($this)); $fields = array(); $pwd_changed = false; if (!isset($this->moduser_id)) { $this->moduser_id = $fid; } $this->modified_time = 'now'; if (isset($this->photo)) { $this->photo_modified_time = 'now'; } // отправка на модерирование ----------- require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/stop_words.php'; $stop_words = new stop_words(); $aModerFields = array('uname', 'usurname', 'pname', 'spec_text', 'resume_file', 'resume', 'konk', 'company', 'status_text', 'photo', 'logo', 'compname'); $aModerUpdate = array(); $aOldValues = array(); //-------------------------------------- foreach ($class_vars as $name => $value) { if (!in_array($name, $parnames) && isset($this->{$name})) { if ($name == 'passwd') { $fields[] = $name . "= '" . self::hashPasswd($this->{$name}) . "'"; $pwd_changed = true; } else { if ($name == 'rating') { // рейтинг напрямую в users менять нельзя continue; } else { //$fields[] = $name."= '".$this->$name."'"; $fields[] = $DB->parse("{$name} = ?", $this->{$name}); // отправка на модерирование ----------- if ($this->moduser_id == $fid && in_array($name, $aModerFields)) { $aModerUpdate[] = $name; $aOldValues[$name] = $this->GetField($fid, $sGetFieldError, $name); } //-------------------------------------- } } } } $fld = implode(', ', $fields); if ($fld) { $fid = intval($fid); $sql .= $DB->parse("UPDATE {$current} SET {$fld} WHERE (uid = ?i " . $eddition . ')', $fid); if ($res = $DB->squery($sql)) { // отправка на модерирование ----------- if ($aModerUpdate) { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/user_content.php'; $aModerNoWord = array('resume_file', 'photo', 'logo'); $nOrderId = $DB->val("SELECT from_id FROM orders WHERE from_id= ?i \n AND from_date <= now() AND from_date + to_date + COALESCE(freeze_to, '0')::interval >= now() \n AND NOT (freeze_from_time IS NOT NULL AND NOW() >= freeze_from_time::date AND NOW() < freeze_to_time)", $fid); foreach ($aModerUpdate as $name) { $sChangeId = $DB->val('SELECT id FROM users_change WHERE user_id = ?i AND ucolumn = ?', $fid, $name); if (!$sChangeId && ($stop_words->calculate($this->{$name}) || in_array($name, $aModerNoWord))) { if (!empty($this->{$name})) { $aData = array('user_id' => $fid, 'utable' => $current, 'ucolumn' => $name, 'old_val' => $aOldValues[$name], 'new_val' => $this->{$name}, 'moderator_status' => $nOrderId ? -2 : 0); $sChangeId = $DB->insert('users_change', $aData, 'id'); if (!$nOrderId) { $aData = array('rec_id' => $sChangeId, 'rec_type' => user_content::MODER_PROFILE, 'status' => 0); if (!in_array($name, $aModerNoWord)) { $stop_words->calculateRegexNoWords(); // устанавливаем спец режим $aData['stop_words_cnt'] = $stop_words->calculate($this->{$name}); } $DB->insert('moderation', $aData); } } } else { if (!empty($this->{$name}) && ($stop_words->calculate($this->{$name}) || in_array($name, $aModerNoWord))) { $stop_words->calculateRegexNoWords(); // устанавливаем спец режим $DB->update('users_change', array('new_val' => $this->{$name}), 'id = ?i', $sChangeId); $DB->update('moderation', array('stream_id' => null, 'stop_words_cnt' => $stop_words->calculate($this->{$name})), 'rec_id = ?i AND rec_type = ?i', $sChangeId, user_content::MODER_PROFILE); } else { $DB->query('DELETE FROM users_change WHERE id = ?i', $sChangeId); $DB->query('DELETE FROM moderation WHERE rec_id = ?i AND rec_type = ?i', $sChangeId, user_content::MODER_PROFILE); } } } } //-------------------------------------- if ($pwd_changed) { // убиваем сессии клиентов внешнего api. require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/external/session.php'; $sess = new externalSession(); $sess->destroy($fid); // сброс привязки аккаунтов фрилансера и работодателя ----- if ($aAnti = $DB->col('SELECT "login" FROM users WHERE anti_uid = ?i', $fid)) { foreach ($aAnti as $sLogin) { $GLOBALS['session']->logout($sLogin); } if ($_SESSION['uid'] == $fid) { $_SESSION['anti_uid'] = $_SESSION['anti_login'] = $_SESSION['anti_surname'] = $_SESSION['anti_name'] = ''; } $DB->query('UPDATE users SET anti_uid = NULL WHERE uid = ?i OR anti_uid = ?i', $fid, $fid); } //--------------------------------------------------------- } //если человек отписался от всех рассылок, удалить запись из users_subscribe_keys if (strpos($this->subscr, '1') === false && strlen($this->subscr) > 0) { $DB->query('DELETE FROM users_subscribe_keys WHERE uid = ?i', $fid); } } else { if ($error = $DB->error) { $error = parse_db_error($error); } } } return $error; }
/** * Сохраняет изменения ключевые слова пользователя для модерирование * * @param int $uid UID Пользователя * @param int $prof ID Профессии * @param array $old_ids массив ID старых ключевых слов * @param array $new_ids массив ID новых ключевых слов * @param integer $moduser_id UID изменяющего пользователя (админа). если null - то берется $uid * @param string $keys строка с ключевыми словами через запятую * @return bool true - успех, false - провал */ function moderUserKeys($uid = 0, $prof = 0, $old_ids = array(), $new_ids = array(), $moduser_id = null, $keys = '') { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/user_content.php'; $bRet = true; $moduser_id = $moduser_id ? $moduser_id : $uid; $new_ids = $new_ids ? $new_ids : array(); if ($uid && $uid == $moduser_id && !hasPermissions('users') && $prof && (array_diff($new_ids, $old_ids) || array_diff($old_ids, $new_ids))) { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/stop_words.php'; $sId = $GLOBALS['DB']->val("SELECT id FROM portf_choise_change \n WHERE user_id = ?i AND prof_id = ?i AND ucolumn = 'kwords'", $uid, $prof); $stop_words = new stop_words(); $nStopWordsCnt = $stop_words->calculate($keys); if (!$sId && $new_ids && $nStopWordsCnt) { $aData = array('user_id' => $uid, 'prof_id' => $prof, 'ucolumn' => 'kwords', 'stop_words_cnt' => $nStopWordsCnt, 'old_val' => implode(',', $old_ids), 'moderator_status' => is_pro() ? -2 : 0); $sId = $GLOBALS['DB']->insert('portf_choise_change', $aData, 'id'); $bRet = empty($GLOBALS['DB']->error); if ($bRet && !is_pro()) { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/user_content.php'; $GLOBALS['DB']->insert('moderation', array('rec_id' => $sId, 'rec_type' => user_content::MODER_PORTF_CHOISE, 'stop_words_cnt' => $nStopWordsCnt)); } } elseif ($sId && $new_ids && $nStopWordsCnt) { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/user_content.php'; $GLOBALS['DB']->query('UPDATE portf_choise_change SET stop_words_cnt = ?i WHERE id = ?i', $nStopWordsCnt, $sId); $GLOBALS['DB']->query('UPDATE moderation SET stream_id = NULL, stop_words_cnt = ?i WHERE rec_id = ?i AND rec_type = ?i', $nStopWordsCnt, $sId, user_content::MODER_PORTF_CHOISE); } else { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/user_content.php'; $GLOBALS['DB']->query('DELETE FROM portf_choise_change WHERE id = ?i', $sId); $GLOBALS['DB']->query('DELETE FROM moderation WHERE rec_id = ?i AND rec_type = ?i', $sId, user_content::MODER_PORTF_CHOISE); } } elseif ($uid && $moduser_id && $uid != $moduser_id && hasPermissions('users') && $prof) { $sId = $GLOBALS['DB']->val("SELECT id FROM portf_choise_change \n WHERE user_id = ?i AND prof_id = ?i AND ucolumn = 'kwords'", $uid, $prof); if ($sId) { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/user_content.php'; $GLOBALS['DB']->query('DELETE FROM portf_choise_change WHERE id = ?i', $sId); $GLOBALS['DB']->query('DELETE FROM moderation WHERE rec_id = ?i AND rec_type = ?i', $sId, user_content::MODER_PORTF_CHOISE); } } return $bRet; }
/** * Обновление предложения * * @param integer $fid ИД обновляемого предложения * @param array $update Переменная типа array(name=>value) где name - поле таблицы, value - значение для записи (@see Таблица freelance_offers) * @return boolean */ public function Update($fid, $update) { global $DB; if (!hasPermissions('projects') && !is_pro()) { // автор, не админ, не про $update['moderator_status'] = 0; 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($fields['descr'], $fields['title']); $DB->insert('moderation', array('rec_id' => $fid, 'rec_type' => user_content::MODER_SDELAU, 'stop_words_cnt' => $nStopWordsCnt)); } if (isset($update['is_blocked']) && $update['is_blocked']) { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/user_content.php'; $DB->query('DELETE FROM moderation WHERE rec_id = ?i AND rec_type = ?i;', $fid, user_content::MODER_SDELAU); } $DB->update("freelance_offers", $update, "id = ?i {$this->access}", $fid); return true; }
/** * Привязать объявление к платному месту * * @param int $nId ID платного места из users_first_page * @param string $sError опционально. возвращает сообщение об ошибке. * если функция вернула false, но ошибки нет - значит просто нет объявления. * @return bool true - успех, false - провал */ function bindDescription($nId = 0, &$sError = '') { $bRet = false; if ($nId) { $nModeratorStatus = null; $nDescriptionId = self::GetLastUfpID($nId, $nModeratorStatus); if ($nDescriptionId) { $GLOBALS['DB']->query('UPDATE users_first_page SET ufp_description_id = ?i WHERE id = ?i', $nDescriptionId, $nId); $bRet = true; $sError = $GLOBALS['DB']->error; if (empty($sError) && !$nModeratorStatus) { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/user_content.php'; $GLOBALS['DB']->query('DELETE FROM moderation WHERE rec_type = ?i AND rec_id IN (SELECT id FROM users_first_page WHERE ufp_description_id = ?i)', user_content::MODER_FIRST_PAGE, $nDescriptionId); $aDescr = firstpage::GetFullDescription($nId); if (!empty($aDescr['title']) || !empty($aDescr['descr']) || !empty($aDescr['full_descr']) || !empty($aDescr['portfolio'])) { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/stop_words.php'; $stop_words = new stop_words(true); $nStopWordsCnt = $stop_words->calculate($aDescr['title'], $aDescr['descr'], $aDescr['full_descr']); $GLOBALS['DB']->insert('moderation', array('rec_id' => $nId, 'rec_type' => user_content::MODER_FIRST_PAGE, 'stop_words_cnt' => $nStopWordsCnt)); } } } } return $bRet; }
/** * Отправка уточнения к разделу в портфолио на модерирование * * @global DB $DB * @param int $uid UID пользователя * @param int $prof_id ID профессии * @param string $text новый текст уточнения * @param string $old_text старый текст уточнения */ public function checkUserContent($uid, $prof_id, $text, $old_text) { global $DB; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/stop_words.php'; $choise_id = $DB->val("SELECT id FROM portf_choise_change WHERE user_id = ?i AND prof_id = ?i AND ucolumn = 'text';", $uid, $prof_id); $stop_words = new stop_words(); $nStopWordsCnt = $stop_words->calculate($text); // сам юзер if (!$choise_id && !empty($text) && $text != "" && $nStopWordsCnt) { $nModeratorStatus = is_pro() ? -2 : 0; $sId = $DB->val("INSERT INTO portf_choise_change (user_id, prof_id, ucolumn, stop_words_cnt, old_val, moderator_status) \n VALUES (?i, ?i, 'text', ?i, ?, ?i) RETURNING id", $uid, $prof_id, $nStopWordsCnt, $old_text, $nModeratorStatus); if ($nModeratorStatus == 0) { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/user_content.php'; $DB->insert('moderation', array('rec_id' => $sId, 'rec_type' => user_content::MODER_PORTF_CHOISE, 'stop_words_cnt' => $nStopWordsCnt)); } } else { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/user_content.php'; if ($choise_id && !empty($text) && $text != "" && $nStopWordsCnt) { $DB->query('UPDATE portf_choise_change SET stop_words_cnt = ?i WHERE id = ?i', $nStopWordsCnt, $choise_id); $DB->query('UPDATE moderation SET stream_id = NULL, stop_words_cnt = ?i WHERE rec_id = ?i AND rec_type = ?i', $nStopWordsCnt, $choise_id, user_content::MODER_PORTF_CHOISE); } else { $DB->query('DELETE FROM portf_choise_change WHERE id = ?i; DELETE FROM moderation WHERE rec_id = ?i AND rec_type = ?i', $choise_id, $choise_id, user_content::MODER_PORTF_CHOISE); } } }
/** * Редактирование сообщения в диалоге предложения к проекту. * * @param integer $user_id id пользователя * @param string $message текст сообщения * @param integer $comment_id id комментария * @param integer $po_id id ветки комментариев проекта * @param boolean $is_first первый комментарий в ветке (продложение) или комментарии * @param integer $moduser_id UID пользователя (админа), изменяющего предложение. если null - то берется $user_id * @param string $modified_reason причина редактирования * * @return string пустая строка если метод выполнен успешно или сообщение об ошибке */ public function SaveDialogueMessage($user_id, $message, $comment_id, $po_id, $is_first = false, $moduser_id = null, $modified_reason = '') { $user_id = intval($user_id); $comment_id = intval($comment_id); $message = preg_replace("/(\r\n|\r|\n){3,100}/i", "\r\n\r\n", $message); $message = rtrim(ltrim($message, "\r\n")); $message = change_q_x(substr(stripcslashes($message), 0, 1000), false, true, '', false, false); $moduser_id = $moduser_id ? $moduser_id : $user_id; if ($is_first) { $GLOBALS['DB']->query('UPDATE projects_offers_dialogue SET post_text = ?, post_date = NOW(), moduser_id = ?i, modified = now() WHERE id = ?', $message, $moduser_id, $comment_id); return $DB->error; } else { $ret = $GLOBALS['DB']->row('SELECT d.user_id, d.post_text, e.is_pro AS emp_is_pro, f.is_pro AS frl_is_pro FROM projects_offers_dialogue d LEFT JOIN projects_offers po ON po.id = d.po_id LEFT JOIN projects p ON p.id = po.project_id LEFT JOIN employer e ON e.uid = p.user_id LEFT JOIN freelancer f ON f.uid = po.user_id WHERE po_id = ? LIMIT 1', $po_id); if ($ret['user_id'] == $user_id || hasPermissions('projects')) { if ($ret['emp_is_pro'] != 't' && $ret['frl_is_pro'] != 't' && $ret['user_id'] == $moduser_id && !hasPermissions('projects') && $ret['post_text'] != $message) { // автор, не админ, не про меняет заголовок либо текст - отправить на модерирование 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($message); $sModer = ' , moderator_status =' . ($nStopWordsCnt ? ' 0 ' : ' NULL '); if ($nStopWordsCnt) { $GLOBALS['DB']->insert('moderation', array('rec_id' => $comment_id, 'rec_type' => user_content::MODER_PRJ_DIALOG, 'stop_words_cnt' => $nStopWordsCnt)); } else { $GLOBALS['DB']->query('DELETE FROM moderation WHERE rec_id = ?i AND rec_type = ?i;', $comment_id, user_content::MODER_PRJ_DIALOG); } } $GLOBALS['DB']->query("UPDATE projects_offers_dialogue SET post_text = ?, post_date = NOW(), moduser_id = ?i, modified = now(), modified_reason = ? {$sModer} WHERE id = ? AND user_id = ?", $message, $moduser_id, $modified_reason, $comment_id, $user_id); return $GLOBALS['DB']->error; } else { return 1; } } }