Esempio n. 1
0
 /**
  * Поиск блогов по названию
  */
 protected function EventAjaxSearch()
 {
     // * Устанавливаем формат Ajax ответа
     E::ModuleViewer()->SetResponseAjax('json');
     // * Получаем из реквеста первые буквы блога
     if ($sTitle = F::GetRequestStr('blog_title')) {
         $sTitle = str_replace('%', '', $sTitle);
     }
     if (!$sTitle) {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error'));
         return;
     }
     // * Ищем блоги
     if (F::GetRequestStr('blog_type') == 'personal') {
         $aFilter = array('include_type' => 'personal');
     } else {
         $aFilter = array('include_type' => E::ModuleBlog()->GetAllowBlogTypes(E::User(), 'list', true));
         $aFilter['exclude_type'] = 'personal';
     }
     $aFilter['title'] = "%{$sTitle}%";
     $aFilter['order'] = array('blog_title' => 'asc');
     $aResult = E::ModuleBlog()->GetBlogsByFilter($aFilter, 1, 100);
     // * Формируем и возвращаем ответ
     $aVars = array('aBlogs' => $aResult['collection'], 'oUserCurrent' => E::User(), 'sBlogsEmptyList' => E::ModuleLang()->Get('blogs_search_empty'));
     E::ModuleViewer()->AssignAjax('sText', E::ModuleViewer()->Fetch('commons/common.blog_list.tpl', $aVars));
 }
 protected function SubmitComment()
 {
     /**
      * Проверям авторизован ли пользователь
      */
     if (!E::ModuleUser()->IsAuthorization()) {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('need_authorization'), E::ModuleLang()->Get('error'));
         return;
     }
     $xResult = E::Module('PluginMagicrules\\Rule')->CheckRuleAction('create_comment', $this->oUserCurrent);
     if (true === $xResult) {
         $xResult = E::Module('PluginMagicrules\\Rule')->CheckRuleCreateAction('comment', $this->oUserCurrent);
     }
     if (true === $xResult) {
         return parent::SubmitComment();
     } else {
         if (is_string($xResult)) {
             E::ModuleMessage()->AddErrorSingle($xResult, E::ModuleLang()->Get('attention'));
             return;
         } else {
             E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('plugin.magicrules.check_rule_action_error'), E::ModuleLang()->Get('attention'));
             return;
         }
     }
 }
Esempio n. 3
0
 /**
  * Поиск пользователей по логину
  *
  */
 protected function EventAjaxSearch()
 {
     // Устанавливаем формат Ajax ответа
     E::ModuleViewer()->SetResponseAjax('json');
     // Получаем из реквеста первые быквы для поиска пользователей по логину
     $sTitle = F::GetRequest('user_login');
     if (is_string($sTitle) && mb_strlen($sTitle, 'utf-8')) {
         $sTitle = str_replace(array('_', '%'), array('\\_', '\\%'), $sTitle);
     } else {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error'));
         return;
     }
     // Как именно искать: совпадение в любой части логина, или только начало или конец логина
     if (F::GetRequest('isPrefix')) {
         $sTitle .= '%';
     } elseif (F::GetRequest('isPostfix')) {
         $sTitle = '%' . $sTitle;
     } else {
         $sTitle = '%' . $sTitle . '%';
     }
     $aFilter = array('activate' => 1, 'login' => $sTitle);
     // Ищем пользователей
     $aResult = E::ModuleUser()->GetUsersByFilter($aFilter, array('user_rating' => 'desc'), 1, 50);
     // Формируем ответ
     $aVars = array('aUsersList' => $aResult['collection'], 'oUserCurrent' => E::ModuleUser()->GetUserCurrent(), 'sUserListEmpty' => E::ModuleLang()->Get('user_search_empty'));
     E::ModuleViewer()->AssignAjax('sText', E::ModuleViewer()->Fetch('commons/common.user_list.tpl', $aVars));
 }
Esempio n. 4
0
 public function EventDownloadFile()
 {
     $this->SetTemplate(false);
     $sTopicId = $this->GetParam(0);
     $sFieldId = $this->GetParam(1);
     E::ModuleSecurity()->ValidateSendForm();
     if (!($oTopic = E::ModuleTopic()->GetTopicById($sTopicId))) {
         return parent::EventNotFound();
     }
     if (!($this->oType = E::ModuleTopic()->GetContentType($oTopic->getType()))) {
         return parent::EventNotFound();
     }
     if (!($oField = E::ModuleTopic()->GetContentFieldById($sFieldId))) {
         return parent::EventNotFound();
     }
     if ($oField->getContentId() != $this->oType->getContentId()) {
         return parent::EventNotFound();
     }
     //получаем объект файла
     $oFile = $oTopic->getFieldFile($oField->getFieldId());
     //получаем объект поля топика, содержащий данные о файле
     $oValue = $oTopic->getField($oField->getFieldId());
     if ($oFile && $oValue) {
         if (preg_match("/^(http:\\/\\/)/i", $oFile->getFileUrl())) {
             $sFullPath = $oFile->getFileUrl();
             R::Location($sFullPath);
         } else {
             $sFullPath = Config::Get('path.root.dir') . $oFile->getFileUrl();
         }
         $sFilename = $oFile->getFileName();
         /*
          * Обновляем данные
          */
         $aFileObj = array();
         $aFileObj['file_name'] = $oFile->getFileName();
         $aFileObj['file_url'] = $oFile->getFileUrl();
         $aFileObj['file_size'] = $oFile->getFileSize();
         $aFileObj['file_extension'] = $oFile->getFileExtension();
         $aFileObj['file_downloads'] = $oFile->getFileDownloads() + 1;
         $sText = serialize($aFileObj);
         $oValue->setValue($sText);
         $oValue->setValueSource($sText);
         //сохраняем
         E::ModuleTopic()->UpdateContentFieldValue($oValue);
         /*
          * Отдаем файл
          */
         header('Content-type: ' . $oFile->getFileExtension());
         header('Content-Disposition: attachment; filename="' . $sFilename . '"');
         F::File_PrintChunked($sFullPath);
     } else {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('content_download_file_error'));
         return R::Action('error');
     }
 }
 protected function EventAdd()
 {
     $xResult = E::Module('PluginMagicrules\\Rule')->CheckRuleAction('create_topic', $this->oUserCurrent);
     if ($xResult === true) {
         return parent::EventAdd();
     } else {
         if (is_string($xResult)) {
             E::ModuleMessage()->AddErrorSingle($xResult, E::ModuleLang()->Get('attention'));
             return Router::Action('error');
         } else {
             E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('plugin.magicrules.check_rule_action_error'), E::ModuleLang()->Get('attention'));
             return Router::Action('error');
         }
     }
 }
 /**
  * Добавление записи на стену
  */
 public function EventWallAdd()
 {
     // * Устанавливаем формат Ajax ответа
     E::ModuleViewer()->SetResponseAjax('json');
     // * Пользователь авторизован?
     if (!E::IsUser()) {
         return parent::EventNotFound();
     }
     $xResult = E::Module('PluginMagicrules\\Rule')->CheckRuleAction('create_wall', E::User());
     if ($xResult === true) {
         return parent::EventWallAdd();
     } else {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('plugin.magicrules.check_rule_action_error'), E::ModuleLang()->Get('attention'));
         return Router::Action('error');
     }
 }
Esempio n. 7
0
 /**
  * Обработка хука инициализации экшенов
  */
 public function InitAction()
 {
     // * Проверяем наличие директории install
     if (is_dir(rtrim(Config::Get('path.root.dir'), '/') . '/install') && (!isset($_SERVER['HTTP_APP_ENV']) || $_SERVER['HTTP_APP_ENV'] != 'test')) {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('install_directory_exists'));
         R::Action('error');
     }
     // * Проверка на закрытый режим
     $oUserCurrent = E::ModuleUser()->GetUserCurrent();
     if (!$oUserCurrent && Config::Get('general.close.mode')) {
         $aEnabledActions = F::Str2Array(Config::Get('general.close.actions'));
         if (!in_array(R::GetAction(), $aEnabledActions)) {
             return R::Action('login');
         }
     }
     return null;
 }
Esempio n. 8
0
 /**
  * Компилирует файл less и возвращает текст css-файла
  *
  * @param $aFile
  * @param $sCacheDir
  * @param $sMapPath
  * @param $aParams
  * @param $bCompress
  * @return string
  */
 public function CompileFile($aFile, $sCacheDir, $sMapPath, $aParams, $bCompress)
 {
     if (!($sMapPath && $sCacheDir && $aFile)) {
         return '';
     }
     try {
         $options = array('sourceMap' => TRUE, 'sourceMapWriteTo' => $sMapPath, 'sourceMapURL' => E::ModuleViewerAsset()->AssetFileUrl($sMapPath), 'cache_dir' => $sCacheDir);
         if ($bCompress) {
             $options = array_merge($options, array('compress' => TRUE));
         }
         $sCssFileName = Less_Cache::Get($aFile, $options, $aParams);
         return file_get_contents($sCacheDir . $sCssFileName);
     } catch (Exception $e) {
         E::ModuleMessage()->AddErrorSingle($e->getMessage());
     }
     return '';
 }
 /**
  * @return string|void
  */
 protected function EventVoteUser()
 {
     // * Пользователь авторизован?
     if (!E::IsUser()) {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('need_authorization'), E::ModuleLang()->Get('error'));
         return;
     }
     $xResult = E::Module('PluginMagicrules\\Rule')->CheckRuleAction('vote_user', E::User(), array('vote_value' => (int) $this->getPost('value')));
     if (true === $xResult) {
         return parent::EventVoteUser();
     } else {
         if (is_string($xResult)) {
             E::ModuleMessage()->AddErrorSingle($xResult, E::ModuleLang()->Get('attention'));
             return Router::Action('error');
         } else {
             E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('plugin.magicrules.check_rule_action_error'), E::ModuleLang()->Get('attention'));
             return Router::Action('error');
         }
     }
 }
 protected function checkBlogFields($oBlog = null)
 {
     $bOk = parent::checkBlogFields($oBlog);
     if (!F::isPost('submit_blog_add')) {
         //  Проверяем есть ли подзаголовок блога
         $iMin = C::Get('plugin.blogsubtitle.min_subtitle_len');
         $iMax = C::Get('plugin.blogsubtitle.max_subtitle_len');
         $sSubtitle = F::GetRequestStr('blog_subtitle');
         if (!$sSubtitle && $iMin) {
             E::ModuleMessage()->AddError(E::ModuleLang()->Get('plugin.blogsubtitle.blog_create_subtitle_error', array('min' => $iMin, 'max' => $iMax)), E::ModuleLang()->Get('error'));
             $bOk = false;
         } elseif ($iMax) {
             if (!F::CheckVal($sSubtitle, 'text', $iMin, $iMax)) {
                 E::ModuleMessage()->AddError(E::ModuleLang()->Get('plugin.blogsubtitle.blog_create_subtitle_error', array('min' => $iMin, 'max' => $iMax)), E::ModuleLang()->Get('error'));
                 $bOk = false;
             }
         }
     }
     return $bOk;
 }
Esempio n. 11
0
 /**
  * Вывод ошибки
  *
  */
 protected function EventError()
 {
     /**
      * Если евент равен одной из ошибок из $aHttpErrors, то шлем браузеру специфичный header
      * Например, для 404 в хидере будет послан браузеру заголовок HTTP/1.1 404 Not Found
      */
     if (array_key_exists($this->sCurrentEvent, $this->aHttpErrors)) {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error_' . $this->sCurrentEvent), $this->sCurrentEvent);
         $aHttpError = $this->aHttpErrors[$this->sCurrentEvent];
         if (isset($aHttpError['header'])) {
             $sProtocol = isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.1';
             header("{$sProtocol} {$aHttpError['header']}");
         }
     }
     /**
      * Устанавливаем title страницы
      */
     E::ModuleViewer()->AddHtmlTitle(E::ModuleLang()->Get('error'));
     $this->SetTemplateAction('index');
 }
Esempio n. 12
0
 /**
  * @return bool
  */
 protected function CheckSeopackFields()
 {
     E::ModuleSecurity()->ValidateSendForm();
     $bOk = true;
     if (F::isPost('title') && !F::CheckVal(F::GetRequest('title', null, 'post'), 'text', 0, 1000)) {
         E::ModuleMessage()->AddError(E::ModuleLang()->Get('plugin.seopack.title_error'), E::ModuleLang()->Get('error'));
         $bOk = false;
     }
     if (F::isPost('description') && !F::CheckVal(F::GetRequest('description', null, 'post'), 'text', 0, 1000)) {
         E::ModuleMessage()->AddError(E::ModuleLang()->Get('plugin.seopack.description_error'), E::ModuleLang()->Get('error'));
         $bOk = false;
     }
     if (F::isPost('keywords') && !F::CheckVal(F::GetRequest('keywords', null, 'post'), 'text', 0, 1000)) {
         E::ModuleMessage()->AddError(E::ModuleLang()->Get('plugin.seopack.keywords_error'), E::ModuleLang()->Get('error'));
         $bOk = false;
     }
     if (!F::CheckVal(F::GetRequest('url', null, 'post'), 'text', 0, 255)) {
         E::ModuleMessage()->AddError(E::ModuleLang()->Get('plugin.seopack.url_error'), E::ModuleLang()->Get('error'));
         $bOk = false;
     }
     return $bOk;
 }
Esempio n. 13
0
 /**
  * Разбор запроса
  *
  * @param null $sType
  *
  * @return mixed
  */
 protected function _prepareRequest($sType = null)
 {
     $sRequest = trim(F::GetRequest('q'));
     // * Иногда ломается кодировка, напр., если ввели поиск в адресной строке браузера
     // * Пытаемся восстановить по основной кодировке браузера
     if (!mb_check_encoding($sRequest)) {
         list($sCharset) = explode(',', $_SERVER['HTTP_ACCEPT_CHARSET']);
         $sQueryString = mb_convert_encoding($_SERVER['QUERY_STRING'], 'UTF-8', $sCharset);
         $sRequest = mb_convert_encoding($sRequest, 'UTF-8', $sCharset);
     }
     if ($sRequest) {
         // Две звездочки подряд меняем на одну
         $sRequest = preg_replace('/(\\*{2,})/', '*', $sRequest);
         // Две пробела подряд меняем на один
         $sRequest = preg_replace('/(\\s{2,})/', ' ', $sRequest);
         // Последовательность звездочек и пробелов, начинающаяся со звездочки
         $sRequest = preg_replace('/\\*[\\*\\s]{2,}/', '* ', $sRequest);
         // Последовательность звездочек и пробелов, начинающаяся с пробела
         $sRequest = preg_replace('/\\s[\\*\\s]{2,}/', ' *', $sRequest);
     }
     $aReq['q'] = $sRequest;
     $aReq['regexp'] = preg_quote(trim(mb_strtolower($aReq['q'])));
     // * Проверка длины запроса
     if (!F::CheckVal($aReq['regexp'], 'text', Config::Get('module.search.min_length_req'), Config::Get('module.search.max_length_req'))) {
         E::ModuleMessage()->AddError(E::ModuleLang()->Get('search_err_length', array('min' => Config::Get('module.search.min_length_req'), 'max' => Config::Get('module.search.max_length_req'))));
         $aReq['regexp'] = '';
     }
     // Save quoted substrings
     $aQuoted = array();
     if (preg_match_all('/"([^"]+)"/U', $aReq['regexp'], $aMatches)) {
         foreach ($aMatches[1] as $sStr) {
             $sSubstKey = 'begin-' . md5($sStr) . '-end';
             $aQuoted[0][] = $sSubstKey;
             $aQuoted[1][] = $sStr;
         }
         $aReq['regexp'] = str_replace($aQuoted[1], $aQuoted[0], $aReq['regexp']);
     }
     /*
      * Проверка длины каждого слова в запросе
      * Хотя бы одно слово должно быть больше минимальной длины
      * Слова меньше минимальной длины исключаем из поиска
      */
     if ($aReq['regexp']) {
         $aWords = explode(' ', $aReq['regexp']);
         $nErr = 0;
         $sStr = '';
         foreach ($aWords as $sWord) {
             if (!F::CheckVal($sWord, 'text', Config::Get('module.search.min_length_req'), Config::Get('module.search.max_length_req'))) {
                 $nErr += 1;
             } else {
                 if ($sStr) {
                     $sStr .= ' ';
                 }
                 $sStr .= $sWord;
             }
         }
         if ($nErr == sizeof($aWords)) {
             E::ModuleMessage()->AddError(E::ModuleLang()->Get('search_err_length_word', array('min' => Config::Get('module.search.min_length_req'), 'max' => Config::Get('module.search.max_length_req'))));
             $aReq['regexp'] = '';
         } else {
             $aReq['regexp'] = $sStr;
         }
     }
     // * Если все нормально, формируем выражение для поиска
     if ($aReq['regexp']) {
         if ($this->bSearchStrict) {
             $aReq['regexp'] = str_replace('\\*', '*', $aReq['regexp']);
             /*
              * Проверка на "лишние" символы, оставляем только "слова"
              * На месте "небукв" оставляем пробелы
              */
             $aReq['regexp'] = preg_replace('/' . $this->sPatternXA . '/iusxSU', ' ', $aReq['regexp']);
             $aReq['regexp'] = trim(preg_replace('/(\\s{2,})/', ' ', $aReq['regexp']));
             // * Если после "чистки" что-то осталось, то продолжаем дальше
             if ($aReq['regexp']) {
                 $aReq['regexp'] = str_replace('* *', '|', $aReq['regexp']);
                 $aReq['regexp'] = str_replace('* ', '|[[:<:]]', $aReq['regexp']);
                 $aReq['regexp'] = str_replace(' *', '[[:>:]]|', $aReq['regexp']);
                 $aReq['regexp'] = str_replace(' ', '[[:>:]]|[[:<:]]', $aReq['regexp']);
                 if (mb_substr($aReq['regexp'], 0, 1) == '*') {
                     $aReq['regexp'] = mb_substr($aReq['regexp'], 1);
                 } else {
                     $aReq['regexp'] = '[[:<:]]' . $aReq['regexp'];
                 }
                 if (mb_substr($aReq['regexp'], -1) == '*') {
                     $aReq['regexp'] = mb_substr($aReq['regexp'], 0, mb_strlen($aReq['regexp']) - 1);
                 } else {
                     $aReq['regexp'] = $aReq['regexp'] . '[[:>:]]';
                 }
             }
         } else {
             $aReq['regexp'] = preg_replace('/' . $this->sPatternXA . '/uU', '', $aReq['regexp']);
             $aReq['regexp'] = trim(preg_replace('/(\\s{2,})/', ' ', $aReq['regexp']));
             $aReq['regexp'] = str_replace(' ', '|', $aReq['regexp']);
         }
     }
     // Restore quoted substrings
     if ($aReq['regexp'] && !empty($aQuoted[0])) {
         $aReq['regexp'] = str_replace($aQuoted[0], $aQuoted[1], $aReq['regexp']);
     }
     $aReq['params']['bSkipTags'] = false;
     if ($sType) {
         $aReq['sType'] = $sType;
     } else {
         $aReq['sType'] = 'topics';
     }
     // * Определяем текущую страницу вывода результата
     $aReq['iPage'] = intval(preg_replace('#^page(\\d+)$#', '\\1', $this->getParam(0)));
     if (!$aReq['iPage']) {
         $aReq['iPage'] = 1;
     }
     return $aReq;
 }
Esempio n. 14
0
 /**
  * Меняет сортировку элементов фотосета
  */
 public function EventSort()
 {
     // * Устанавливаем формат Ajax ответа
     E::ModuleViewer()->SetResponseAjax('json');
     // Проверяем, целевой объект и права на его редактирование
     if (!($oTarget = E::ModuleUploader()->CheckAccessAndGetTarget($sTargetType = F::GetRequest('target', FALSE), $sTargetId = F::GetRequest('target_id', FALSE)))) {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('not_access'), E::ModuleLang()->Get('error'));
         return;
     }
     if (!($aOrder = F::GetRequest('order', FALSE))) {
         E::ModuleMessage()->AddError(E::ModuleLang()->Get('not_access'), E::ModuleLang()->Get('error'));
         return;
     }
     if (!is_array($aOrder)) {
         E::ModuleMessage()->AddError(E::ModuleLang()->Get('not_access'), E::ModuleLang()->Get('error'));
         return;
     }
     E::ModuleMresource()->UpdateSort(array_flip($aOrder), $sTargetType, $sTargetId);
     E::ModuleMessage()->AddNoticeSingle(E::ModuleLang()->Get('uploader_sort_changed'));
 }
Esempio n. 15
0
 public function EventAjaxUserList()
 {
     E::ModuleViewer()->SetResponseAjax('json');
     if ($this->IsPost()) {
         $sList = trim($this->GetPost('invite_listmail'));
         if ($aList = F::Array_Str2Array($sList, "\n", true)) {
             $iSentCount = 0;
             foreach ($aList as $iKey => $sMail) {
                 if (F::CheckVal($sMail, 'mail')) {
                     $oInvite = E::ModuleUser()->GenerateInvite($this->oUserCurrent);
                     if (E::ModuleNotify()->SendInvite($this->oUserCurrent, $sMail, $oInvite)) {
                         unset($aList[$iKey]);
                         $iSentCount++;
                     }
                 }
             }
             E::ModuleMessage()->AddNotice(E::ModuleLang()->Get('action.admin.invaite_mail_done', array('num' => $iSentCount)), null, true);
             if ($aList) {
                 E::ModuleMessage()->AddError(E::ModuleLang()->Get('action.admin.invaite_mail_err', array('num' => count($aList))), null, true);
             }
         }
     } else {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error'));
     }
 }
Esempio n. 16
0
 /**
  * Возвращает количество новых сообщений
  */
 public function AjaxNewMessages()
 {
     // * Устанавливаем формат Ajax ответа
     E::ModuleViewer()->SetResponseAjax('json');
     if (!$this->oUserCurrent) {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('need_authorization'), E::ModuleLang()->Get('error'));
         return;
     }
     $iCountTalkNew = E::ModuleTalk()->GetCountTalkNew($this->oUserCurrent->getId());
     E::ModuleViewer()->AssignAjax('iCountTalkNew', $iCountTalkNew);
 }
Esempio n. 17
0
 /**
  * Распаковывает архив с плагином и перемещает его в нужную папку
  *
  * @param $sPackFile
  *
  * @return  bool
  */
 public function UnpackPlugin($sPackFile)
 {
     $zip = new ZipArchive();
     if ($zip->open($sPackFile) === true) {
         $sUnpackDir = F::File_NormPath(dirname($sPackFile) . '/_unpack/');
         if (!$zip->extractTo($sUnpackDir)) {
             E::ModuleMessage()->AddError(E::ModuleLang()->Get('action.admin.err_extract_zip_file'), E::ModuleLang()->Get('error'));
             return false;
         } else {
             // Ищем в папках XML-манифест
             $aDirs = glob($sUnpackDir . '*', GLOB_ONLYDIR);
             $sXmlFile = '';
             if ($aDirs) {
                 foreach ($aDirs as $sDir) {
                     if ($sXmlFile = $this->_seekManifest($sDir . '/')) {
                         break;
                     }
                 }
             }
             if (!$sXmlFile) {
                 E::ModuleMessage()->AddError(E::ModuleLang()->Get('action.admin.file_not_found', array('file' => self::PLUGIN_XML_FILE)), E::ModuleLang()->Get('error'));
                 return false;
             }
             $sPluginSrc = dirname($sXmlFile);
             // try to define plugin's dirname
             $oXml = @simplexml_load_file($sXmlFile);
             if (!$oXml) {
                 E::ModuleMessage()->AddError(E::ModuleLang()->Get('action.admin.err_read_xml', array('file' => $sXmlFile)), E::ModuleLang()->Get('error'));
                 return false;
             }
             $sPluginDir = (string) $oXml->dirname;
             if (!$sPluginDir) {
                 $sPluginDir = (string) $oXml->id;
             }
             if (!$sPluginDir) {
                 $sPluginDir = basename($sPluginSrc);
             }
             $sPluginPath = $this->GetPluginsDir() . '/' . $sPluginDir . '/';
             if (F::File_CopyDir($sPluginSrc, $sPluginPath)) {
                 E::ModuleMessage()->AddNotice(E::ModuleLang()->Get('action.admin.plugin_added_ok'));
             } else {
                 E::ModuleMessage()->AddError(E::ModuleLang()->Get('action.admin.plugin_added_err'), E::ModuleLang()->Get('error'));
             }
         }
         $zip->close();
     } else {
         E::ModuleMessage()->AddError(E::ModuleLang()->Get('action.admin.err_open_zip_file'), E::ModuleLang()->Get('error'));
     }
     return true;
 }
Esempio n. 18
0
 /**
  * Поиск комментариев
  *
  */
 function EventComments()
 {
     // * Ищем
     $aReq = $this->PrepareRequest();
     $aRes = $this->PrepareResults($aReq, Config::Get('module.comment.per_page'));
     if (false === $aRes) {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error'));
         return Router::Action('error');
     }
     // * Если поиск дал результаты
     if ($this->bIsResults) {
         // *  Получаем топик-объекты по списку идентификаторов
         $aComments = E::ModuleComment()->GetCommentsAdditionalData(array_keys($this->aSphinxRes['matches']));
         // * Конфигурируем парсер
         $oTextParser = ModuleText::newTextParser('search');
         $aErrors = array();
         // * Делаем сниппеты
         /** @var ModuleComment_EntityComment $oComment */
         foreach ($aComments as $oComment) {
             $oComment->setText($oTextParser->parse(E::ModuleSphinx()->GetSnippet(htmlspecialchars($oComment->getText()), 'comments', $aReq['q'], '<span class="searched-item">', '</span>'), $aErrors));
         }
         /**
          *  Отправляем данные в шаблон
          */
         E::ModuleViewer()->Assign('aRes', $aRes);
         E::ModuleViewer()->Assign('aComments', $aComments);
     }
 }
Esempio n. 19
0
 /**
  * Обработка кода приглашения при включеном режиме инвайтов
  *
  */
 protected function EventInvite()
 {
     if (!Config::Get('general.reg.invite')) {
         return parent::EventNotFound();
     }
     //  Обработка отправки формы с кодом приглашения
     if (F::isPost('submit_invite')) {
         //  проверяем код приглашения на валидность
         if ($this->CheckInviteRegister()) {
             $sInviteCode = $this->GetInviteRegister();
         } else {
             $sInviteCode = trim(F::GetRequestStr('invite_code'));
         }
         $oInvite = E::ModuleUser()->GetInviteByCode($sInviteCode);
         if ($oInvite) {
             if (!$this->CheckInviteRegister()) {
                 E::ModuleSession()->Set('invite_code', $oInvite->getCode());
             }
             return R::Action('registration');
         } else {
             E::ModuleMessage()->AddError(E::ModuleLang()->Get('registration_invite_code_error'), E::ModuleLang()->Get('error'));
         }
     }
 }
Esempio n. 20
0
 /**
  * Отписка от блога или пользователя
  *
  */
 protected function EventUnsubscribe()
 {
     // * Устанавливаем формат Ajax ответа
     E::ModuleViewer()->SetResponseAjax('json');
     if (!F::GetRequest('id')) {
         E::ModuleMessage()->AddError(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error'));
         return;
     }
     $sType = F::GetRequestStr('type');
     $iType = null;
     // * Определяем от чего отписываемся
     switch ($sType) {
         case 'blogs':
         case 'blog':
             $iType = ModuleUserfeed::SUBSCRIBE_TYPE_BLOG;
             break;
         case 'users':
         case 'user':
             $iType = ModuleUserfeed::SUBSCRIBE_TYPE_USER;
             break;
         default:
             E::ModuleMessage()->AddError(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error'));
             return;
     }
     // * Отписываем пользователя
     E::ModuleUserfeed()->UnsubscribeUser($this->oUserCurrent->getId(), $iType, F::GetRequestStr('id'));
     E::ModuleMessage()->AddNotice(E::ModuleLang()->Get('userfeed_subscribes_updated'), E::ModuleLang()->Get('attention'));
 }
Esempio n. 21
0
 /**
  * Ответ на ajax запрос
  *
  * @param string $sType - Варианты: json, jsonIframe, jsonp
  */
 public function DisplayAjax($sType = 'json')
 {
     $sOutput = '';
     // * Загружаем статус ответа и сообщение
     $bStateError = false;
     $sMsgTitle = '';
     $sMsg = '';
     $aMsgError = E::ModuleMessage()->GetError();
     $aMsgNotice = E::ModuleMessage()->GetNotice();
     if (count($aMsgError) > 0) {
         $bStateError = true;
         $sMsgTitle = $aMsgError[0]['title'];
         $sMsg = $aMsgError[0]['msg'];
     } elseif (count($aMsgNotice) > 0) {
         $sMsgTitle = $aMsgNotice[0]['title'];
         $sMsg = $aMsgNotice[0]['msg'];
     }
     $this->AssignAjax('sMsgTitle', $sMsgTitle);
     $this->AssignAjax('sMsg', $sMsg);
     $this->AssignAjax('bStateError', $bStateError);
     if ($sType == 'json') {
         $this->SetResponseHeader('Content-type', 'application/json; charset=utf-8');
         $sOutput = F::jsonEncode($this->aVarsAjax);
     } elseif ($sType == 'jsonIframe') {
         // Оборачивает json в тег <textarea>, это не дает браузеру выполнить HTML, который вернул iframe
         $this->SetResponseHeader('Content-type', 'application/json; charset=utf-8');
         // * Избавляемся от бага, когда в возвращаемом тексте есть &quot;
         $sOutput = '<textarea>' . htmlspecialchars(F::jsonEncode($this->aVarsAjax)) . '</textarea>';
     } elseif ($sType == 'jsonp') {
         $this->SetResponseHeader('Content-type', 'application/json; charset=utf-8');
         $sOutput = F::GetRequest('jsonpCallback', 'callback') . '(' . F::jsonEncode($this->aVarsAjax) . ');';
     }
     $this->Flush($sOutput);
     exit;
 }
Esempio n. 22
0
 /**
  * Проверка полей блога
  *
  * @param ModuleBlog_EntityBlog|null $oBlog
  *
  * @return bool
  */
 protected function checkBlogFields($oBlog = null)
 {
     $bOk = true;
     // * Проверяем есть ли название блога
     if (!F::CheckVal(F::GetRequestStr('blog_title'), 'text', 2, 200)) {
         E::ModuleMessage()->AddError(E::ModuleLang()->Get('blog_create_title_error'), E::ModuleLang()->Get('error'));
         $bOk = false;
     } else {
         // * Проверяем есть ли уже блог с таким названием
         if ($oBlogExists = E::ModuleBlog()->GetBlogByTitle(F::GetRequestStr('blog_title'))) {
             if (!$oBlog || $oBlog->getId() != $oBlogExists->getId()) {
                 E::ModuleMessage()->AddError(E::ModuleLang()->Get('blog_create_title_error_unique'), E::ModuleLang()->Get('error'));
                 $bOk = false;
             }
         }
     }
     return $bOk;
 }
Esempio n. 23
0
 /**
  * Изменение состояния подписки
  */
 protected function EventAjaxTrackToggle()
 {
     /**
      * Устанавливаем формат Ajax ответа
      */
     E::ModuleViewer()->SetResponseAjax('json');
     if (!$this->oUserCurrent) {
         E::ModuleMessage()->AddError(E::ModuleLang()->Get('need_authorization'), E::ModuleLang()->Get('error'));
         return;
     }
     /**
      * Получаем тип объекта подписки
      */
     $sTargetType = F::GetRequestStr('target_type');
     if (!E::ModuleSubscribe()->IsAllowTargetType($sTargetType)) {
         E::ModuleMessage()->AddError(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error'));
         return;
     }
     $sTargetId = F::GetRequestStr('target_id') ? F::GetRequestStr('target_id') : null;
     $iValue = F::GetRequest('value') ? 1 : 0;
     $oTrack = null;
     /**
      * Проверка объекта подписки
      */
     if (!E::ModuleSubscribe()->CheckTarget($sTargetType, $sTargetId, $iValue)) {
         E::ModuleMessage()->AddError(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error'));
         return;
     }
     /**
      * Если подписка еще не существовала, то создаем её
      */
     if ($oTrack = E::ModuleSubscribe()->AddTrackSimple($sTargetType, $sTargetId, $this->oUserCurrent->getId())) {
         $oTrack->setStatus($iValue);
         E::ModuleSubscribe()->UpdateTrack($oTrack);
         E::ModuleMessage()->AddNotice(E::ModuleLang()->Get('subscribe_change_ok'), E::ModuleLang()->Get('attention'));
         return;
     }
     E::ModuleMessage()->AddError(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error'));
     return;
 }
 /**
  * Редактирование поля контента
  *
  * @param ModuleTopic_EntityContentType $oContentType
  * @param ModuleTopic_EntityField $oField
  * @return bool
  */
 protected function SubmitEditField($oContentType, $oField)
 {
     // * Проверяем отправлена ли форма с данными
     if (!F::isPost('submit_field')) {
         return false;
     }
     // * Проверка корректности полей формы
     if (!$this->CheckFieldsField($oContentType)) {
         return false;
     }
     if (!E::ModuleTopic()->GetFieldValuesCount($oField->getFieldId())) {
         // Нет ещё ни одного значения этого поля, тогда можно сменить ещё и тип
         $oField->setFieldType(F::GetRequest('field_type'));
     }
     $oField->setFieldName(F::GetRequest('field_name'));
     $oField->setFieldDescription(F::GetRequest('field_description'));
     $oField->setFieldRequired(F::GetRequest('field_required'));
     if ($oField->getFieldType() == 'select') {
         $oField->setOptionValue('select', F::GetRequest('field_values'));
     }
     $sOldFieldUniqueName = $oField->getFieldUniqueName();
     if (F::GetRequest('field_unique_name_translit')) {
         $oField->setFieldUniqueName(F::TranslitUrl(F::GetRequest('field_name')));
     } else {
         $oField->setFieldUniqueName(F::TranslitUrl(F::GetRequest('field_unique_name')));
     }
     try {
         if (E::ModuleTopic()->UpdateContentField($oField)) {
             E::ModuleMessage()->AddNoticeSingle(E::ModuleLang()->Get('action.admin.contenttypes_success_fieldedit'), null, true);
             R::Location('admin/settings-contenttypes/edit/' . $oContentType->getContentId() . '/');
         }
     } catch (Exception $e) {
         // Если ошибка дублирования уникального ключа, то выводим соответствующее сообщение
         if (1062 == $e->getCode()) {
             $sNewFieldUniqueName = $oField->getFieldUniqueName();
             $oField->setFieldUniqueName($sOldFieldUniqueName);
             E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('plugin.contentfieldsx.error_field_unique_name_duplicate', array('unique_name' => htmlspecialchars($sNewFieldUniqueName))), null, false);
         }
     }
     return false;
 }
Esempio n. 25
0
 /**
  * Удаление/восстановление комментария
  *
  */
 protected function EventCommentDelete()
 {
     // * Комментарий существует?
     $idComment = F::GetRequestStr('idComment', null, 'post');
     if (!($oComment = E::ModuleComment()->GetCommentById($idComment))) {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error'));
         return;
     }
     // * Есть права на удаление комментария?
     if (!$oComment->isDeletable()) {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('not_access'), E::ModuleLang()->Get('error'));
         return;
     }
     // * Устанавливаем пометку о том, что комментарий удален
     $oComment->setDelete(($oComment->getDelete() + 1) % 2);
     E::ModuleHook()->Run('comment_delete_before', array('oComment' => $oComment));
     if (!E::ModuleComment()->UpdateCommentStatus($oComment)) {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error'));
         return;
     }
     E::ModuleHook()->Run('comment_delete_after', array('oComment' => $oComment));
     // * Формируем текст ответа
     if ($bState = (bool) $oComment->getDelete()) {
         $sMsg = E::ModuleLang()->Get('comment_delete_ok');
         $sTextToggle = E::ModuleLang()->Get('comment_repair');
     } else {
         $sMsg = E::ModuleLang()->Get('comment_repair_ok');
         $sTextToggle = E::ModuleLang()->Get('comment_delete');
     }
     // * Обновление события в ленте активности
     E::ModuleStream()->Write($oComment->getUserId(), 'add_comment', $oComment->getId(), !$oComment->getDelete());
     // * Показываем сообщение и передаем переменные в ajax ответ
     E::ModuleMessage()->AddNoticeSingle($sMsg, E::ModuleLang()->Get('attention'));
     E::ModuleViewer()->AssignAjax('bState', $bState);
     E::ModuleViewer()->AssignAjax('sTextToggle', $sTextToggle);
 }
Esempio n. 26
0
 /**
  * Метод выода ошибки
  */
 public function EventError()
 {
     // Запретим прямой доступ
     if (!($aError = E::ModuleApi()->GetLastError())) {
         $aError = E::ModuleApi()->ERROR_CODE_0002;
     }
     // Установим код ошики - Bad Request
     F::HttpResponseCode(400);
     // Отправим ошибку пользователю
     if ($this->bIsAjax) {
         E::ModuleMessage()->AddErrorSingle('error');
         E::ModuleViewer()->AssignAjax('result', json_encode(array('error' => $aError)));
     } else {
         E::ModuleViewer()->Assign('result', json_encode(array('error' => $aError)));
     }
     E::ModuleApi()->SetLastError(NULL);
     return FALSE;
 }
Esempio n. 27
0
 protected function _eventRecoveryRequest($sMail)
 {
     if ($oUser = E::ModuleUser()->GetUserByMail($sMail)) {
         // Формируем и отправляем ссылку на смену пароля
         /** @var ModuleUser_EntityReminder $oReminder */
         $oReminder = E::GetEntity('User_Reminder');
         $oReminder->setCode(F::RandomStr(32));
         $oReminder->setDateAdd(F::Now());
         $oReminder->setDateExpire(date('Y-m-d H:i:s', time() + Config::Val('module.user.pass_recovery_delay', 60 * 60 * 24 * 7)));
         $oReminder->setDateUsed(null);
         $oReminder->setIsUsed(0);
         $oReminder->setUserId($oUser->getId());
         if (E::ModuleUser()->AddReminder($oReminder)) {
             E::ModuleNotify()->SendReminderCode($oUser, $oReminder);
             E::ModuleMessage()->AddNotice(E::ModuleLang()->Get('password_reminder_send_link'));
             return true;
         }
     }
     return false;
 }
Esempio n. 28
0
 /**
  * Проверка полей формы
  *
  * @param $oTopic
  *
  * @return bool
  */
 protected function checkTopicFields($oTopic)
 {
     E::ModuleSecurity()->ValidateSendForm();
     $bOk = true;
     /**
      * Валидируем топик
      */
     if (!$oTopic->_Validate()) {
         E::ModuleMessage()->AddError($oTopic->_getValidateError(), E::ModuleLang()->Get('error'));
         $bOk = false;
     }
     /**
      * Выполнение хуков
      */
     E::ModuleHook()->Run('check_topic_fields', array('bOk' => &$bOk));
     return $bOk;
 }
Esempio n. 29
0
 /**
  * Обработка дополнительных полей топика
  *
  * @param ModuleTopic_EntityTopic $oTopic
  * @param string $sType
  *
  * @return bool
  */
 public function processTopicFields($oTopic, $sType = 'add')
 {
     /** @var ModuleTopic_EntityContentValues $aValues */
     $aValues = array();
     if ($sType == 'update') {
         // * Получаем существующие значения
         if ($aData = $this->GetTopicValuesByArrayId(array($oTopic->getId()))) {
             $aValues = $aData[$oTopic->getId()];
         }
         // * Чистим существующие значения
         E::ModuleTopic()->DeleteTopicValuesByTopicId($oTopic->getId());
     }
     if ($oType = E::ModuleTopic()->GetContentTypeByUrl($oTopic->getType())) {
         //получаем поля для данного типа
         if ($aFields = $oType->getFields()) {
             foreach ($aFields as $oField) {
                 $sData = null;
                 if (isset($_REQUEST['fields'][$oField->getFieldId()]) || isset($_FILES['fields_' . $oField->getFieldId()]) || $oField->getFieldType() == 'single-image-uploader') {
                     //текстовые поля
                     if (in_array($oField->getFieldType(), array('input', 'textarea', 'select'))) {
                         $sData = E::ModuleText()->Parser($_REQUEST['fields'][$oField->getFieldId()]);
                     }
                     //поле ссылки
                     if ($oField->getFieldType() == 'link') {
                         $sData = $_REQUEST['fields'][$oField->getFieldId()];
                     }
                     //поле даты
                     if ($oField->getFieldType() == 'date') {
                         if (isset($_REQUEST['fields'][$oField->getFieldId()])) {
                             if (F::CheckVal($_REQUEST['fields'][$oField->getFieldId()], 'text', 6, 10) && substr_count($_REQUEST['fields'][$oField->getFieldId()], '.') == 2) {
                                 list($d, $m, $y) = explode('.', $_REQUEST['fields'][$oField->getFieldId()]);
                                 if (@checkdate($m, $d, $y)) {
                                     $sData = $_REQUEST['fields'][$oField->getFieldId()];
                                 }
                             }
                         }
                     }
                     //поле с файлом
                     if ($oField->getFieldType() == 'file') {
                         //если указано удаление файла
                         if (F::GetRequest('topic_delete_file_' . $oField->getFieldId())) {
                             if ($oTopic->getFieldFile($oField->getFieldId())) {
                                 @unlink(Config::Get('path.root.dir') . $oTopic->getFieldFile($oField->getFieldId())->getFileUrl());
                                 //$oTopic->setValueField($oField->getFieldId(),'');
                                 $sData = null;
                             }
                         } else {
                             //если удаление файла не указано, уже ранее залит файл^ и нового файла не загружалось
                             if ($sType == 'update' && isset($aValues[$oField->getFieldId()])) {
                                 $sData = $aValues[$oField->getFieldId()]->getValueSource();
                             }
                         }
                         if (isset($_FILES['fields_' . $oField->getFieldId()]) && is_uploaded_file($_FILES['fields_' . $oField->getFieldId()]['tmp_name'])) {
                             $iMaxFileSize = F::MemSize2Int(Config::Get('module.uploader.files.default.file_maxsize'));
                             $aFileExtensions = Config::Get('module.uploader.files.default.file_extensions');
                             if (!$iMaxFileSize || filesize($_FILES['fields_' . $oField->getFieldId()]['tmp_name']) <= $iMaxFileSize) {
                                 $aPathInfo = pathinfo($_FILES['fields_' . $oField->getFieldId()]['name']);
                                 if (!$aFileExtensions || in_array(strtolower($aPathInfo['extension']), $aFileExtensions)) {
                                     $sFileTmp = $_FILES['fields_' . $oField->getFieldId()]['tmp_name'];
                                     $sDirSave = Config::Get('path.uploads.root') . '/files/' . E::ModuleUser()->GetUserCurrent()->getId() . '/' . F::RandomStr(16);
                                     mkdir(Config::Get('path.root.dir') . $sDirSave, 0777, true);
                                     if (is_dir(Config::Get('path.root.dir') . $sDirSave)) {
                                         $sFile = $sDirSave . '/' . F::RandomStr(10) . '.' . strtolower($aPathInfo['extension']);
                                         $sFileFullPath = Config::Get('path.root.dir') . $sFile;
                                         if (copy($sFileTmp, $sFileFullPath)) {
                                             //удаляем старый файл
                                             if ($oTopic->getFieldFile($oField->getFieldId())) {
                                                 $sOldFile = Config::Get('path.root.dir') . $oTopic->getFieldFile($oField->getFieldId())->getFileUrl();
                                                 F::File_Delete($sOldFile);
                                             }
                                             $aFileObj = array();
                                             $aFileObj['file_hash'] = F::RandomStr(32);
                                             $aFileObj['file_name'] = E::ModuleText()->Parser($_FILES['fields_' . $oField->getFieldId()]['name']);
                                             $aFileObj['file_url'] = $sFile;
                                             $aFileObj['file_size'] = $_FILES['fields_' . $oField->getFieldId()]['size'];
                                             $aFileObj['file_extension'] = $aPathInfo['extension'];
                                             $aFileObj['file_downloads'] = 0;
                                             $sData = serialize($aFileObj);
                                             F::File_Delete($sFileTmp);
                                         }
                                     }
                                 } else {
                                     $sTypes = implode(', ', $aFileExtensions);
                                     E::ModuleMessage()->AddError(E::ModuleLang()->Get('topic_field_file_upload_err_type', array('types' => $sTypes)), null, true);
                                 }
                             } else {
                                 E::ModuleMessage()->AddError(E::ModuleLang()->Get('topic_field_file_upload_err_size', array('size' => $iMaxFileSize)), null, true);
                             }
                             F::File_Delete($_FILES['fields_' . $oField->getFieldId()]['tmp_name']);
                         }
                     }
                     // Поле с изображением
                     if ($oField->getFieldType() == 'single-image-uploader') {
                         $sTargetType = $oField->getFieldType() . '-' . $oField->getFieldId();
                         $iTargetId = $oTopic->getId();
                         // 1. Удалить значение target_tmp
                         // Нужно затереть временный ключ в ресурсах, что бы в дальнейшем картнка не
                         // воспринималась как временная.
                         if ($sTargetTmp = E::ModuleSession()->GetCookie(ModuleUploader::COOKIE_TARGET_TMP)) {
                             // 2. Удалить куку.
                             // Если прозошло сохранение вновь созданного топика, то нужно
                             // удалить куку временной картинки. Если же сохранялся уже существующий топик,
                             // то удаление куки ни на что влиять не будет.
                             E::ModuleSession()->DelCookie(ModuleUploader::COOKIE_TARGET_TMP);
                             // 3. Переместить фото
                             $sNewPath = E::ModuleUploader()->GetUserImageDir(E::UserId(), true, false);
                             $aMresourceRel = E::ModuleMresource()->GetMresourcesRelByTargetAndUser($sTargetType, 0, E::UserId());
                             if ($aMresourceRel) {
                                 $oResource = array_shift($aMresourceRel);
                                 $sOldPath = $oResource->GetFile();
                                 $oStoredFile = E::ModuleUploader()->Store($sOldPath, $sNewPath);
                                 /** @var ModuleMresource_EntityMresource $oResource */
                                 $oResource = E::ModuleMresource()->GetMresourcesByUuid($oStoredFile->getUuid());
                                 if ($oResource) {
                                     $oResource->setUrl(E::ModuleMresource()->NormalizeUrl(E::ModuleUploader()->GetTargetUrl($sTargetType, $iTargetId)));
                                     $oResource->setType($sTargetType);
                                     $oResource->setUserId(E::UserId());
                                     // 4. В свойство поля записать адрес картинки
                                     $sData = $oResource->getMresourceId();
                                     $oResource = array($oResource);
                                     E::ModuleMresource()->UnlinkFile($sTargetType, 0, $oTopic->getUserId());
                                     E::ModuleMresource()->AddTargetRel($oResource, $sTargetType, $iTargetId);
                                 }
                             }
                         } else {
                             // Топик редактируется, просто обновим поле
                             $aMresourceRel = E::ModuleMresource()->GetMresourcesRelByTargetAndUser($sTargetType, $iTargetId, E::UserId());
                             if ($aMresourceRel) {
                                 $oResource = array_shift($aMresourceRel);
                                 $sData = $oResource->getMresourceId();
                             } else {
                                 $sData = false;
                                 //                                    $this->DeleteField($oField);
                             }
                         }
                     }
                     E::ModuleHook()->Run('content_field_proccess', array('sData' => &$sData, 'oField' => $oField, 'oTopic' => $oTopic, 'aValues' => $aValues, 'sType' => &$sType));
                     //Добавляем поле к топику.
                     if ($sData) {
                         /** @var ModuleTopic_EntityContentValues $oValue */
                         $oValue = E::GetEntity('Topic_ContentValues');
                         $oValue->setTargetId($oTopic->getId());
                         $oValue->setTargetType('topic');
                         $oValue->setFieldId($oField->getFieldId());
                         $oValue->setFieldType($oField->getFieldType());
                         $oValue->setValue($sData);
                         $oValue->setValueSource(in_array($oField->getFieldType(), array('file', 'single-image-uploader')) ? $sData : $_REQUEST['fields'][$oField->getFieldId()]);
                         $this->AddTopicValue($oValue);
                     }
                 }
             }
         }
     }
     return true;
 }
Esempio n. 30
0
 /**
  * Подключение/отключение к блогу
  *
  */
 protected function AjaxBlogJoin()
 {
     //  Устанавливаем формат Ajax ответа
     E::ModuleViewer()->SetResponseAjax('json');
     //  Пользователь авторизован?
     if (!$this->oUserCurrent) {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('need_authorization'), E::ModuleLang()->Get('error'));
         return;
     }
     //  Блог существует?
     $nBlogId = intval(F::GetRequestStr('idBlog', null, 'post'));
     if (!$nBlogId || !($oBlog = E::ModuleBlog()->GetBlogById($nBlogId))) {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error'));
         return;
     }
     $this->oCurrentBlog = $oBlog;
     // Type of the blog
     $oBlogType = $oBlog->getBlogType();
     // Current status of user in the blog
     /** @var ModuleBlog_EntityBlogUser $oBlogUser */
     $oBlogUser = E::ModuleBlog()->GetBlogUserByBlogIdAndUserId($oBlog->getId(), $this->oUserCurrent->getId());
     if (!$oBlogUser || $oBlogUser->getUserRole() < ModuleBlog::BLOG_USER_ROLE_GUEST && (!$oBlogType || $oBlogType->IsPrivate())) {
         // * Проверяем тип блога на возможность свободного вступления или вступления по запросу
         if ($oBlogType && !$oBlogType->GetMembership(ModuleBlog::BLOG_USER_JOIN_FREE) && !$oBlogType->GetMembership(ModuleBlog::BLOG_USER_JOIN_REQUEST)) {
             E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('blog_join_error_invite'), E::ModuleLang()->Get('error'));
             return;
         }
         if ($oBlog->getOwnerId() != $this->oUserCurrent->getId()) {
             // Subscribe user to the blog
             if ($oBlogType->GetMembership(ModuleBlog::BLOG_USER_JOIN_FREE)) {
                 $bResult = false;
                 if ($oBlogUser) {
                     $oBlogUser->setUserRole(ModuleBlog::BLOG_USER_ROLE_USER);
                     $bResult = E::ModuleBlog()->UpdateRelationBlogUser($oBlogUser);
                 } elseif ($oBlogType->GetMembership(ModuleBlog::BLOG_USER_JOIN_FREE)) {
                     // User can free subscribe to blog
                     /** @var ModuleBlog_EntityBlogUser $oBlogUserNew */
                     $oBlogUserNew = E::GetEntity('Blog_BlogUser');
                     $oBlogUserNew->setBlogId($oBlog->getId());
                     $oBlogUserNew->setUserId($this->oUserCurrent->getId());
                     $oBlogUserNew->setUserRole(ModuleBlog::BLOG_USER_ROLE_USER);
                     $bResult = E::ModuleBlog()->AddRelationBlogUser($oBlogUserNew);
                 }
                 if ($bResult) {
                     E::ModuleMessage()->AddNoticeSingle(E::ModuleLang()->Get('blog_join_ok'), E::ModuleLang()->Get('attention'));
                     E::ModuleViewer()->AssignAjax('bState', true);
                     //  Увеличиваем число читателей блога
                     $oBlog->setCountUser($oBlog->getCountUser() + 1);
                     E::ModuleBlog()->UpdateBlog($oBlog);
                     E::ModuleViewer()->AssignAjax('iCountUser', $oBlog->getCountUser());
                     //  Добавляем событие в ленту
                     E::ModuleStream()->Write($this->oUserCurrent->getId(), 'join_blog', $oBlog->getId());
                     //  Добавляем подписку на этот блог в ленту пользователя
                     E::ModuleUserfeed()->SubscribeUser($this->oUserCurrent->getId(), ModuleUserfeed::SUBSCRIBE_TYPE_BLOG, $oBlog->getId());
                 } else {
                     $sMsg = $oBlogType->IsPrivate() ? E::ModuleLang()->Get('blog_join_error_invite') : E::ModuleLang()->Get('system_error');
                     E::ModuleMessage()->AddErrorSingle($sMsg, E::ModuleLang()->Get('error'));
                     return;
                 }
             }
             // Подписываем по запросу
             if ($oBlogType->GetMembership(ModuleBlog::BLOG_USER_JOIN_REQUEST)) {
                 // Подписка уже была запрошена, но результатов пока нет
                 if ($oBlogUser && $oBlogUser->getUserRole() == ModuleBlog::BLOG_USER_ROLE_WISHES) {
                     E::ModuleMessage()->AddNoticeSingle(E::ModuleLang()->Get('blog_join_request_already'), E::ModuleLang()->Get('attention'));
                     E::ModuleViewer()->AssignAjax('bState', true);
                     return;
                 }
                 if ($oBlogUser) {
                     if (!in_array($oBlogUser->getUserRole(), array(ModuleBlog::BLOG_USER_ROLE_REJECT, ModuleBlog::BLOG_USER_ROLE_WISHES))) {
                         $sMessage = E::ModuleLang()->Get('blog_user_status_is') . ' "' . E::ModuleBlog()->GetBlogUserRoleName($oBlogUser->getUserRole()) . '"';
                         E::ModuleMessage()->AddNoticeSingle($sMessage, E::ModuleLang()->Get('attention'));
                         E::ModuleViewer()->AssignAjax('bState', true);
                         return;
                     } else {
                         $oBlogUser->setUserRole(ModuleBlog::BLOG_USER_ROLE_WISHES);
                         $bResult = E::ModuleBlog()->UpdateRelationBlogUser($oBlogUser);
                     }
                 } else {
                     // Подписки ещё не было - оформим ее
                     /** @var ModuleBlog_EntityBlogUser $oBlogUserNew */
                     $oBlogUserNew = E::GetEntity('Blog_BlogUser');
                     $oBlogUserNew->setBlogId($oBlog->getId());
                     $oBlogUserNew->setUserId($this->oUserCurrent->getId());
                     $oBlogUserNew->setUserRole(ModuleBlog::BLOG_USER_ROLE_WISHES);
                     $bResult = E::ModuleBlog()->AddRelationBlogUser($oBlogUserNew);
                 }
                 if ($bResult) {
                     // Отправим сообщение модераторам и администраторам блога о том, что
                     // этот пользоватлеь захотел присоединиться к нашему блогу
                     $aBlogUsersResult = E::ModuleBlog()->GetBlogUsersByBlogId($oBlog->getId(), array(ModuleBlog::BLOG_USER_ROLE_MODERATOR, ModuleBlog::BLOG_USER_ROLE_ADMINISTRATOR), null);
                     if ($aBlogUsersResult) {
                         /** @var ModuleUser_EntityUser[] $aBlogModerators */
                         $aBlogModerators = array();
                         /** @var ModuleBlog_EntityBlogUser $oCurrentBlogUser */
                         foreach ($aBlogUsersResult['collection'] as $oCurrentBlogUser) {
                             $aBlogModerators[] = $oCurrentBlogUser->getUser();
                         }
                         // Добавим владельца блога к списку
                         $aBlogModerators = array_merge($aBlogModerators, array($oBlog->getOwner()));
                         $this->SendBlogRequest($oBlog, $aBlogModerators, $this->oUserCurrent);
                     }
                     E::ModuleMessage()->AddNoticeSingle(E::ModuleLang()->Get('blog_join_request_send'), E::ModuleLang()->Get('attention'));
                     E::ModuleViewer()->AssignAjax('bState', true);
                     return;
                 }
             }
         } else {
             E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('blog_join_error_self'), E::ModuleLang()->Get('attention'));
             return;
         }
     }
     if ($oBlogUser && $oBlogUser->getUserRole() == ModuleBlog::BLOG_USER_ROLE_MEMBER) {
         // Unsubscribe user from the blog
         if (E::ModuleBlog()->DeleteRelationBlogUser($oBlogUser)) {
             E::ModuleMessage()->AddNoticeSingle(E::ModuleLang()->Get('blog_leave_ok'), E::ModuleLang()->Get('attention'));
             E::ModuleViewer()->AssignAjax('bState', false);
             //  Уменьшаем число читателей блога
             $oBlog->setCountUser($oBlog->getCountUser() - 1);
             E::ModuleBlog()->UpdateBlog($oBlog);
             E::ModuleViewer()->AssignAjax('iCountUser', $oBlog->getCountUser());
             //  Удаляем подписку на этот блог в ленте пользователя
             E::ModuleUserfeed()->UnsubscribeUser($this->oUserCurrent->getId(), ModuleUserfeed::SUBSCRIBE_TYPE_BLOG, $oBlog->getId());
             return;
         } else {
             E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error'));
             return;
         }
     }
     if ($oBlogUser && $oBlogUser->getUserRole() == ModuleBlog::BLOG_USER_ROLE_NOTMEMBER) {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('blog_user_request_no_accept'), E::ModuleLang()->Get('error'));
         return;
     }
     if ($oBlogUser && $oBlogUser->getUserRole() == ModuleBlog::BLOG_USER_ROLE_BAN) {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('blog_leave_error_banned'), E::ModuleLang()->Get('error'));
         return;
     }
     if ($oBlogUser && $oBlogUser->getUserRole() == ModuleBlog::BLOG_USER_ROLE_BAN_FOR_COMMENT) {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('blog_leave_error_banned'), E::ModuleLang()->Get('error'));
         return;
     }
     if ($oBlogUser && $oBlogUser->getUserRole() == ModuleBlog::BLOG_USER_ROLE_WISHES) {
         E::ModuleMessage()->AddNoticeSingle(E::ModuleLang()->Get('blog_join_request_leave'), E::ModuleLang()->Get('attention'));
         E::ModuleViewer()->AssignAjax('bState', true);
         return;
     }
 }