/** * Изменение данных пользователя * Должны быть определены только те переменные, которые надо изменять * Перед вызовом проверить переменные класса! * * @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; }