/** * Сохранение комментария к предложениям по проектам * * @param object $objResponse xajaxResponse * @param string $rec_id идентификатор записи * @param string $rec_type тип записи * @param array $aForm массив данных * @param string $sDrawFunc имя функции для выполнения после сохранения */ function _admEditPrjDialogSaveForm(&$objResponse, $rec_id = '', $rec_type = '', $aForm = array(), $sDrawFunc = '') { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/projects_offers_dialogue.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/user_content.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/messages.php'; $bValid = true; if (!trim($aForm['post_text'])) { $bValid = false; $sParent = $sDrawFunc == 'stream0' || $sDrawFunc == 'stream1' || $sDrawFunc == 'stream2' ? 'parent.' : ''; $objResponse->script("{$sParent}\$('adm_edit_err_msg').set('html', 'Поле заполнено некорректно.'); "); $objResponse->script("{$sParent}\$('div_adm_edit_err_msg').setStyle('display', '');"); $objResponse->script("{$sParent}adm_edit_content.disabled = false; {$sParent}adm_edit_content.button();"); } if ($bValid) { $sReason = _parseReason($aForm['user_id'], $aForm['adm_edit_text']); $pod = new projects_offers_dialogue(); $po_text = antispam(trim($aForm['post_text'])); $po_text = preg_replace("/(\r\n|\r|\n){3,100}/i", "\r\n\r\n", $po_text); $error = $pod->SaveDialogueMessage($aForm['user_id'], $po_text, $rec_id, $aForm['po_id'], false, $_SESSION['uid'], $sReason); messages::prjDialogModifiedNotification($aForm['user_id'], $aForm['project_id'], $po_text, $sReason); $content_id = user_content::MODER_PRJ_DIALOG; _admEditAfterAll($objResponse, $content_id, $rec_id, $rec_type, $sDrawFunc, $aForm); } }
/** * Добавление предложения к проекту. * * @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; } }
function AddDialogueMessage($form) { global $session; session_start(); $objResponse = new xajaxResponse(); $offerIsBlocked = projects_offers::isOfferBlocked(false, get_uid(), $form['prj_id']); if ($offerIsBlocked) { $objResponse->alert('Ваше предложение заблокировано, вы не можете отправить это сообщение'); return $objResponse; } $prj = new projects(); $project = $prj->GetPrjCust(intval($form['prj_id'])); $is_pro = is_pro(); if ($project['pro_only'] == 't' && !$is_pro && !is_emp() && !hasPermissions('projects')) { if ($project['kind'] == 7) { if (contest::IsContestOfferExists($project['id'], get_uid(false))) { $is_pro = true; } } else { if (projects_offers::IsPrjOfferExists($project['id'], get_uid(false))) { $is_pro = true; } } } if ($project['pro_only'] == 't' && !$is_pro && $project['user_id'] != get_uid() && !hasPermissions('projects')) { $objResponse->alert('Данная функция доступна только пользователям с аккаунтом PRO.'); $objResponse->script("\$('savebtn').set('disabled', false);"); return $objResponse; } elseif ($project['verify_only'] == 't' && !($_SESSION['is_verify'] == 't') && $project['user_id'] != get_uid() && !hasPermissions('projects')) { $objResponse->alert('Данная функция доступна только верифицированным пользователям.'); $objResponse->script("\$('savebtn').set('disabled', false);"); return $objResponse; } if (!trim($form['po_text'])) { $objResponse->alert('Невозможно отправить пустое сообщение.'); $objResponse->script("\n \$('savebtn').set('disabled', false);\n "); return $objResponse; } if (!is_emp() && $form['from'] == 'emp') { $objResponse->script("\n \$('savebtn').set('disabled', false);\n "); $objResponse->alert('Невозможно отправить сообщение. Вы вышли из аккаунта работодателя.'); return $objResponse; } elseif (is_emp() && $form['from'] == 'frl') { $objResponse->script("\n \$('savebtn').set('disabled', false);\n "); $objResponse->alert('Невозможно отправить сообщение. Вы вышли из аккаунта фрилансера.'); return $objResponse; } //Не позволяем производить действия с заблокированным проектом if (projects::CheckBlocked(intval($form['prj_id']))) { $objResponse->script("document.location.href='/projects/index.php?pid=" . intval($form['prj_id']) . "'"); } elseif (intval($_SESSION['uid'])) { $po_id = intval($form['po_id']); //$po_text = substr(change_q_x($form['po_text'], false), 0, 1000); $po_text = antispam(trim($form['po_text'])); $po_text = preg_replace("/(\r\n|\r|\n){3,100}/i", "\r\n\r\n", $po_text); $po_commentid = intval($form['po_commentid']); $user_id = get_uid(false); $user = new users(); $user_name = $user->GetName($user_id, $error); $pod = new projects_offers_dialogue(); $project_dialogue = $pod->GetDialogueForOffer($po_id); $project = $pod->GetProjectFromDialogue($po_id); if (count($project_dialogue)) { for ($i = count($project_dialogue) - 1; $i >= 0; --$i) { if ($project_dialogue[$i]['user_id'] != $user_id) { $to_user_name = $project_dialogue[$i]['login']; break; } } } if (is_emp()) { $emp_read = true; $frl_read = false; } else { $emp_read = false; $frl_read = true; } if (!$po_commentid) { $error = $pod->AddDialogueMessage($po_id, $user_id, $po_text, $frl_read, $emp_read); $last_comment = $pod->GetLastDialogueMessage($user_id, $po_id); $objResponse->script("last_commentid={$last_comment};"); $objResponse->script("edit_block[{$po_id}] = ' <span><a href=\"javascript:void(null)\" onClick=\"answer({$po_id}, {$last_comment});markRead(\\'{$po_id}\\');\" class=\"internal\">Редактировать</a></span>';"); // $objResponse->script("alert(last_commentid);"); // $objResponse->script("alert(edit_block);"); } else { $error = $pod->SaveDialogueMessage($user_id, $po_text, $po_commentid, $po_id, false); if ($error == 1) { $objResponse->alert('Вы не можете редактировать комментарий, так как на него уже ответили.'); return $objResponse; } } $po_text = rtrim(ltrim($po_text, "\r\n")); $po_text = substr(change_q_x($po_text, false, true, '', false, false), 0, 1000); $po_text = stripslashes($po_text); if ($error == '') { $sPostText = $po_text; if ($project['kind'] != 4) { $sId = $po_commentid ? $po_commentid : $last_comment; $aComment = $pod->getDialogueMessageById($sId); if ($aComment['moderator_status'] === '0') { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/stop_words.php'; $stop_words = new stop_words(hasPermissions('projects')); $sPostText = $stop_words->replace($sPostText); } } if (!$po_commentid) { $objResponse->append('po_dialogue_talk_' . $po_id, 'innerHTML', '<div style="margin-bottom:8px;font-size:100%;"><span class="' . (is_emp() ? 'emp' : 'frl') . 'name11"><a href="/users/' . get_login($user_id) . '/" class="' . (is_emp() ? 'emp' : 'frl') . 'name11" title="' . $user_name['uname'] . ' ' . $user_name['usurname'] . '">' . $user_name['uname'] . ' ' . $user_name['usurname'] . '</a> [<a href="/users/' . $user_name['login'] . '/" class="' . (is_emp() ? 'emp' : 'frl') . 'name11" title="' . $user_name['login'] . '">' . $user_name['login'] . '</a>]</span> <span id="po_date_' . $last_comment . '">[' . strftime('%d.%m.%Y | %H:%M', time()) . ']</span><br /><div id="po_comment_' . $last_comment . '">' . reformat($sPostText, 50, 0, 0, 1) . '</div><div id="po_comment_original_' . $last_comment . '" style="display:none;">' . str_replace(' ', ' ', reformat($po_text, 1000, 0, 1)) . '</div></div>'); // $objResponse->call('resetfld', $po_id); $objResponse->script('dialogue_count[' . $po_id . '] = ' . (count($project_dialogue) + 1)); } else { $objResponse->assign('po_comment_' . $po_commentid, 'innerHTML', reformat($sPostText, 50, 0, 0, 1)); $objResponse->assign('po_comment_original_' . $po_commentid, 'innerHTML', str_replace(' ', ' ', reformat($po_text, 1000, 0, 1))); $objResponse->assign('po_date_' . $po_commentid, 'innerHTML', dateFormat('[d.m.Y | H:i]', date('Y-m-d H:i:s'))); } $objResponse->call('answer', $po_id); if ($to_user_name && $project['id'] && $project['name'] && !$po_commentid) { /*require_once($_SERVER['DOCUMENT_ROOT'] . "/classes/smail.php"); $smail = new smail(); if ($project['user_id'] == $user_id) { $error = $smail->NewPrjMessageOnOfferFrl($user_name['login'], $project['id'], $project['name'], $to_user_name, $po_text); } else { $error = $smail->NewPrjMessageOnOfferEmp($user_name['login'], $project['id'], $project['name'], $to_user_name, $po_text); }*/ } } else { $objResponse->alert('Ошибка сохранения.'); } } else { $objResponse->alert('Ошибка сохранения. Авторизируйтесь на сайте.'); } return $objResponse; }
break; } } } if (is_emp()) { $emp_read = true; $frl_read = false; } else { $emp_read = false; $frl_read = true; } if (!$po_commentid) { $error = $pod->AddDialogueMessage($po_id, $user_id, $po_text, $frl_read, $emp_read); $last_comment = $pod->GetLastDialogueMessage($user_id, $po_id); } else { $error = $pod->SaveDialogueMessage($user_id, $po_text, $po_commentid, $po_id, false); $last_comment = $po_commentid; if ($error == 1) { $error = 'Вы не можете редактировать комментарий, так как на него уже ответили.'; } } $po_text = rtrim(ltrim($po_text, "\r\n")); $po_text = substr(change_q_x($po_text, false, true, '', false, false), 0, 1000); $po_text = stripslashes($po_text); } if (!$error) { //header("Location: ".getFriendlyURL("project", $project['id'])."?id={$po_id}&cid={$last_comment}&p=comment"); header('Location: ' . getFriendlyURL('project', $project['id'])); exit; } }