コード例 #1
0
ファイル: users.php プロジェクト: kapai69/fl-ru-damp
 /**
  * Изменение данных пользователя
  * Должны быть определены только те переменные, которые надо изменять
  * Перед вызовом проверить переменные класса!
  *
  * @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;
 }