/** * @param string $sKeyString * @param string $sKeyName * * @return int */ public function Verify($sKeyString, $sKeyName = null) { $iResult = 0; if (empty($sKeyString)) { $iResult = static::ERR_KEYSTRING_EMPTY; } elseif (!is_string($sKeyString)) { $iResult = static::ERR_KEYSTRING_NOT_STR; } else { if (!$sKeyName) { $sKeyName = $this->sKeyName; } $sSavedString = E::ModuleSession()->Get($sKeyName); // issue#342. При регистрации метод вызывается несколько раз в том // числе и при проверки формы аяксом при первой проверке значение // капчи сбрасывается и в дальнейшем проверка не проходит. Сброс капчи // теперь происходит только после успешной регистрации // E::ModuleSession()->Drop($sKeyName); if (empty($sSavedString) || !is_string($sSavedString)) { $iResult = static::ERR_KEYSTRING_NOT_DEFINED; } elseif ($sSavedString != $sKeyString) { $iResult = static::ERR_KEYSTRING_NOT_VALID; } } return $iResult; }
/** * Инициализация * */ public function Init() { // Устанавливаем title страницы E::ModuleViewer()->AddHtmlTitle(E::ModuleLang()->Get('people')); if (!E::ModuleSession()->GetCookie('view') && F::GetRequestStr('view')) { E::ModuleSession()->DelCookie('view'); } E::ModuleSession()->SetCookie('view', F::GetRequestStr('view', '2'), 60 * 60 * 24 * 365); }
/** * При завершении работы модуля передаем списки сообщений в шаблоны Smarty * */ public function Shutdown() { /** * Добавляем в сессию те сообщения, которые были отмечены для сессионного использования */ E::ModuleSession()->Set('message_notice_session', $this->GetNoticeSession()); E::ModuleSession()->Set('message_error_session', $this->GetErrorSession()); E::ModuleViewer()->Assign('aMsgNotice', $this->GetNotice()); E::ModuleViewer()->Assign('aMsgError', $this->GetError()); }
/** * Assign messages to template variables and save special messages to session * (they will be shown in the next page) * */ public function Shutdown() { // Save messages in session if ($aMessages = $this->GetNoticeSession()) { E::ModuleSession()->Set('message_notice_session', $aMessages); } if ($aMessages = $this->GetErrorSession()) { E::ModuleSession()->Set('message_error_session', $aMessages); } E::ModuleViewer()->Assign('aMsgNotice', $this->GetNotice()); E::ModuleViewer()->Assign('aMsgError', $this->GetError()); }
/** * Инициализация экшена * */ public function Init() { /** * issue #104, {@see https://github.com/altocms/altocms/issues/104} * Проверим, не пришли ли мы в ошибку с логаута, если да, то перейдем на главную, * поскольку страница на самом деле есть, но только когда мы авторизованы. */ if (isset($_SERVER['HTTP_REFERER']) && E::ModuleSession()->GetCookie('lgp') === md5(F::RealUrl($_SERVER['HTTP_REFERER']) . 'logout')) { return R::Location((string) Config::Get('module.user.logout.redirect')); } /** * Устанавливаем дефолтный евент */ $this->SetDefaultEvent('index'); /** * Запрешаем отображать статистику выполнения */ R::SetIsShowStats(false); }
/** * @param array $aUsers * @param int $nDays * @param string $sComment * * @return bool */ public function BanUsers($aUsers, $nDays = null, $sComment = null) { $aUserIds = $this->_entitiesId($aUsers); $bOk = true; if ($aUserIds) { // для все юзеров, добавляемых в бан, закрываются сессии foreach ($aUserIds as $nUserId) { if ($nUserId) { E::ModuleSession()->Drop($nUserId); E::ModuleUser()->CloseAllSessions($nUserId); } } if (!$nDays) { $nUnlim = 1; $dDate = null; } else { $nUnlim = 0; $dDate = date('Y-m-d H:i:s', time() + 3600 * 24 * $nDays); } $bOk = $this->oMapper->BanUsers($aUserIds, $dDate, $nUnlim, $sComment); E::ModuleCache()->CleanByTags(array('user_update')); } return $bOk; }
/** * @param ModuleTopic_EntityTopic $oTopic * @param null $sTargetTmp * @return bool */ public function AttachTmpPhotoToTopic($oTopic, $sTargetTmp = null) { if (is_null($sTargetTmp)) { $sTargetTmp = E::ModuleSession()->GetCookie(ModuleUploader::COOKIE_TARGET_TMP); } E::ModuleMresource()->ResetTmpRelById($sTargetTmp, $oTopic->getId()); return $this->oMapper->attachTmpPhotoToTopic($oTopic, $sTargetTmp); }
/** * Обрабатываем процесс разлогинивания * */ protected function EventExit() { E::ModuleSecurity()->ValidateSendForm(); E::ModuleUser()->Logout(); $iShowTime = Config::Val('module.user.logout.show_exit', 3); $sRedirect = Config::Get('module.user.logout.redirect'); if (!$sRedirect) { if (isset($_SERVER['HTTP_REFERER']) && F::File_IsLocalUrl($_SERVER['HTTP_REFERER'])) { $sRedirect = $_SERVER['HTTP_REFERER']; } } /** * issue #104, {@see https://github.com/altocms/altocms/issues/104} * Установим в lgp (last_good_page) хэш имени страницы с постфиксом "logout". Такая * кука будет означать, что на этой странице пользователь вышел с сайта. Время 60 - * заранее достаточное время, что бы произошел редирект на страницу HTTP_REFERER. Если * же эта страница выпадет в 404 то в экшене ActionError уйдем на главную, поскольку * эта страница недоступна стала после выхода с сайта, а до этого была вполне ничего. */ if ($iShowTime) { $sUrl = F::RealUrl($sRedirect); $sReferrer = Config::Get('path.root.web') . R::GetAction() . "/" . R::GetActionEvent() . '/?security_key=' . F::GetRequest('security_key', ''); E::ModuleSession()->SetCookie('lgp', md5($sReferrer . 'logout'), 60); E::ModuleViewer()->SetHtmlHeadTag('meta', array('http-equiv' => 'Refresh', 'Content' => $iShowTime . '; url=' . $sUrl)); } elseif ($sRedirect) { // Если установлена пользовтаельская страница выхода, то считаем, // что она без ошибки и смело не нее редиректим, в других случаях // возможна 404 if (!Config::Get('module.user.logout.redirect')) { E::ModuleSession()->SetCookie('lgp', md5(F::RealUrl($sRedirect) . 'logout'), 60); } R::Location($sRedirect); exit; } else { // E::ModuleViewer()->Assign('bRefreshToHome', true); // Время показа страницы выхода не задано, поэтому просто редирект R::Location(Config::Get('path.root.web')); exit; } }
/** * Выводит изображение и прикрепляет его ко временному объекту * * @param $aParams * @param Smarty $oSmarty * @return string */ function smarty_function_img($aParams, &$oSmarty = NULL) { // Пропущен тип объекта if (!isset($aParams['attr']['target-type'])) { trigger_error("img: missing 'target-type' parameter", E_USER_WARNING); return ''; } // Пропущен идентификатор объекта if (!isset($aParams['attr']['target-id'])) { trigger_error("img: missing 'target-id' parameter", E_USER_WARNING); return ''; } // Получим тип объекта $sTargetType = $aParams['attr']['target-type']; unset($aParams['attr']['target-type']); // Получим ид объекта $iTargetId = intval($aParams['attr']['target-id']); unset($aParams['attr']['target-id']); // Получим ид объекта $sCrop = isset($aParams['attr']['crop']) ? $aParams['attr']['crop'] : FALSE; unset($aParams['attr']['crop']); // Получим изображение по временному ключу, или создадим этот ключ if (($sTargetTmp = E::ModuleSession()->GetCookie(ModuleUploader::COOKIE_TARGET_TMP)) && E::IsUser()) { // Продлим куку E::ModuleSession()->SetCookie(ModuleUploader::COOKIE_TARGET_TMP, $sTargetTmp, 'P1D', FALSE); // Получим предыдущее изображение и если оно было, установим в качестве текущего // Получим и удалим все ресурсы $aMresourceRel = E::ModuleMresource()->GetMresourcesRelByTargetAndUser($sTargetType, $iTargetId, E::UserId()); if ($aMresourceRel) { /** @var ModuleMresource_EntityMresource $oResource */ $oMresource = array_shift($aMresourceRel); if ($oMresource) { if ($sCrop) { $aParams['attr']['src'] = E::ModuleUploader()->ResizeTargetImage($oMresource->GetUrl(), $sCrop); } else { $aParams['attr']['src'] = $oMresource->GetUrl(); } $oSmarty->assign("bImageIsTemporary", TRUE); } } } else { // Куки нет, это значит, что пользователь первый раз создает этот тип // и старой картинки просто нет if ($iTargetId == '0') { E::ModuleSession()->SetCookie(ModuleUploader::COOKIE_TARGET_TMP, F::RandomStr(), 'P1D', FALSE); } else { E::ModuleSession()->DelCookie(ModuleUploader::COOKIE_TARGET_TMP); $sImage = E::ModuleUploader()->GetTargetImageUrl($sTargetType, $iTargetId, $sCrop); if ($sImage) { $aParams['attr']['src'] = $sImage; $oSmarty->assign("bImageIsTemporary", TRUE); } } } // Формируем строку атрибутов изображения $sAttr = ''; if (isset($aParams['attr']) && is_array($aParams['attr'])) { foreach ($aParams['attr'] as $sAttrName => $sAttrValue) { $sAttr .= ' ' . $sAttrName . '="' . $sAttrValue . '"'; } } // Сформируем тег изображения $sImageTag = '<img ' . $sAttr . '/>'; return $sImageTag; }
/** * Выводит изображение и прикрепляет его ко временному объекту * * @param $aParams * @param Smarty $oSmarty * @return string */ function smarty_function_imgs($aParams, &$oSmarty = NULL) { // Пропущен тип объекта if (!isset($aParams['target-type'])) { trigger_error("img: missing 'target-type' parameter", E_USER_WARNING); return ''; } // Пропущен идентификатор объекта if (!isset($aParams['target-id'])) { trigger_error("img: missing 'target-id' parameter", E_USER_WARNING); return ''; } // Получим тип объекта $sTargetType = $aParams['target-type']; unset($aParams['target-type']); // Получим ид объекта $iTargetId = intval($aParams['target-id']); unset($aParams['target-id']); // Получим параметры обрезки объекта $sCrop = isset($aParams['crop']) ? $aParams['crop'] : FALSE; unset($aParams['crop']); // Получим ид объекта $sTemplate = isset($aParams['template']) ? $aParams['template'] : FALSE; unset($aParams['template']); // Получим изображение по временному ключу, или создадим этот ключ $aParams['src'] = array(); if (($sTargetTmp = E::ModuleSession()->GetCookie(ModuleUploader::COOKIE_TARGET_TMP)) && E::IsUser()) { // Продлим куку E::ModuleSession()->SetCookie(ModuleUploader::COOKIE_TARGET_TMP, $sTargetTmp, 'P1D', FALSE); } else { // Куки нет, это значит, что пользователь первый раз создает этот тип // и старой картинки просто нет if ($iTargetId == '0') { E::ModuleSession()->SetCookie(ModuleUploader::COOKIE_TARGET_TMP, F::RandomStr(), 'P1D', FALSE); } else { E::ModuleSession()->DelCookie(ModuleUploader::COOKIE_TARGET_TMP); } } // Получим предыдущее изображение и если оно было, установим в качестве текущего // Получим и удалим все ресурсы $aMresourceRel = E::ModuleMresource()->GetMresourcesRelByTargetAndUser($sTargetType, $iTargetId, E::UserId()); if ($aMresourceRel && is_array($aMresourceRel)) { /** @var ModuleMresource_EntityMresource $oResource */ foreach ($aMresourceRel as $oMresource) { if ($sCrop) { $aParams['src'][$oMresource->getMresourceId()] = array('url' => E::ModuleUploader()->ResizeTargetImage($oMresource->GetUrl(), $sCrop), 'cover' => $oMresource->IsCover()); } else { $aParams['src'][$oMresource->getMresourceId()] = array('url' => $oMresource->GetUrl(), 'cover' => $oMresource->IsCover()); } $oSmarty->assign("bHasImage", TRUE); } } // Создадим массив картинок $sItems = ''; if ($aParams['src']) { foreach ($aParams['src'] as $sID => $aData) { $sItems .= str_replace(array('ID', 'uploader_item_SRC', 'MARK_AS_PREVIEW'), array($sID, $aData['url'], $aData['cover'] ? E::ModuleLang()->Get('topic_photoset_is_preview') : E::ModuleLang()->Get('topic_photoset_mark_as_preview')), $sTemplate); } } return $sItems; }
/** * Разлогинивание * */ public function Logout() { if ($this->oSession) { // Обновляем сессию $this->oMapper->UpdateSession($this->oSession); } if ($this->oUserCurrent) { // Close current session of the current user $this->CloseSession(); } E::ModuleCache()->CleanByTags(array('user_session_update')); // * Удаляем из сессии E::ModuleSession()->Drop('user_id'); // * Удаляем куки E::ModuleSession()->DelCookie($this->GetKeyName()); E::ModuleSession()->DropSession(); $this->oUserCurrent = null; $this->oSession = null; }
/** * Протоколирование запросов * * @param array|null $aVars */ public function OutLog($aVars = null) { if (!$this->bLogEnable) { return; } if (!($sLogFile = Config::Get('module.search.logs.file'))) { $sLogFile = 'search.log'; } if (!$this->oUser) { if ($sUserId = E::ModuleSession()->Get('user_id')) { $this->oUser = E::ModuleUser()->GetUserById($sUserId); } } if (!$this->oUser) { $sUserLogin = '******'; } else { $sUserLogin = $this->oUser->GetLogin(); } $path = R::GetPathWebCurrent(); $uri = $_SERVER['REQUEST_URI']; $sStrLog = 'user=>"' . $sUserLogin . '" ip=>"' . $_SERVER['REMOTE_ADDR'] . '"' . "\n" . str_repeat(' ', 22) . 'path=>' . $path . '"' . "\n" . str_repeat(' ', 22) . 'uri=>' . $uri . '"'; if (is_array($aVars) && sizeof($aVars)) { foreach ($aVars as $key => $val) { $sStrLog .= "\n" . str_repeat(' ', 22) . $key . '=>"' . $val . '"'; } } E::ModuleLogger()->Dump($sLogFile, $sStrLog); }
/** * Returns current session of user * * @return ModuleUser_EntitySession|null */ public function getCurrentSession() { if (!$this->getProp('_current_session')) { $this->_aData['_current_session'] = E::ModuleUser()->GetSessionByUserId($this->getId(), E::ModuleSession()->GetKey()); } return $this->getProp('_current_session'); }
protected function EventReset() { $this->sMainMenuItem = 'tools'; $this->_setTitle(E::ModuleLang()->Get('action.admin.reset_title')); $this->SetTemplateAction('tools/reset'); $aSettings = array(); if ($this->GetPost('adm_reset_submit')) { $aConfig = array(); if ($this->GetPost('adm_cache_clear_data')) { E::ModuleCache()->Clean(); $aSettings['adm_cache_clear_data'] = 1; } if ($this->GetPost('adm_cache_clear_assets')) { E::ModuleViewer()->ClearAssetsFiles(); $aConfig['assets.version'] = time(); $aSettings['adm_cache_clear_assets'] = 1; } if ($this->GetPost('adm_cache_clear_smarty')) { E::ModuleViewer()->ClearSmartyFiles(); $aSettings['adm_cache_clear_smarty'] = 1; } if ($this->GetPost('adm_reset_config_data')) { $this->_eventResetCustomConfig(); $aSettings['adm_reset_config_data'] = 1; } if ($aConfig) { Config::WriteCustomConfig($aConfig); } E::ModuleMessage()->AddNotice(E::ModuleLang()->Get('action.admin.action_ok'), null, true); if ($aSettings) { E::ModuleSession()->SetCookie('adm_tools_reset', serialize($aSettings)); } else { E::ModuleSession()->DelCookie('adm_tools_reset'); } R::Location('admin/tools-reset/'); } if ($sSettings = E::ModuleSession()->GetCookie('adm_tools_reset')) { $aSettings = @unserialize($sSettings); if (is_array($aSettings)) { E::ModuleViewer()->Assign('aSettings', $aSettings); } } }
/** * Загружаем картинку */ public function EventMultiUpload() { // Устанавливаем формат Ajax ответа E::ModuleViewer()->SetResponseAjax('json', FALSE); E::ModuleSecurity()->ValidateSendForm(); // Проверяем, загружен ли файл if (!($aUploadedFile = $this->GetUploadedFile('uploader-upload-image'))) { E::ModuleMessage()->AddError(E::ModuleLang()->Get('error_upload_image'), E::ModuleLang()->Get('error')); return false; } $sTarget = F::GetRequest('target', FALSE); $sTargetId = F::GetRequest('target_id', FALSE); $oTarget = E::ModuleUploader()->CheckAccessAndGetTarget($sTarget, $sTargetId); $bTmp = F::GetRequest('tmp', FALSE); $bTmp = $bTmp == 'true' ? true : false; // Проверяем, целевой объект и права на его редактирование if (!$oTarget) { // Здесь два варианта, либо редактировать нельзя, либо можно, но топика еще нет if ($oTarget === TRUE) { // Будем делать временную картинку } else { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('not_access'), E::ModuleLang()->Get('error')); return false; } } // Ошибок пока нет $sError = ''; // Сделаем временный файд $sTmpFile = E::ModuleUploader()->UploadLocal($aUploadedFile); // Вызовем хук перед началом загрузки картинки E::ModuleHook()->Run('uploader_upload_before', array('oTarget' => $oTarget, 'sTmpFile' => $sTmpFile, 'sTarget' => $sTarget)); // Если все ок, и по миме проходит, то if ($sTmpFile && E::ModuleImg()->MimeType($sTmpFile)) { // Проверим, проходит ли по количеству if (!E::ModuleUploader()->GetAllowedCount($sTarget = F::GetRequest('target', FALSE), $sTargetId = F::GetRequest('target_id', FALSE))) { E::ModuleMessage()->AddError(E::ModuleLang()->Get('uploader_photoset_error_count_photos', array('MAX' => Config::Get('module.topic.photoset.count_photos_max'))), E::ModuleLang()->Get('error')); return FALSE; } // Определим, существует ли объект или он будет создан позже if (!($sTmpKey = E::ModuleSession()->GetCookie(ModuleUploader::COOKIE_TARGET_TMP)) && $sTargetId == '0' && $bTmp) { E::ModuleMessage()->AddError(E::ModuleLang()->Get('error_upload_image'), E::ModuleLang()->Get('error')); return FALSE; } // Пересохраним файл из кэша // Сохраняем фото во временный файл $oImg = E::ModuleImg()->Read($sTmpFile); $sExtension = strtolower(pathinfo($sTmpFile, PATHINFO_EXTENSION)); if (!($sTmpFile = $oImg->Save(F::File_UploadUniqname($sExtension)))) { E::ModuleMessage()->AddError(E::ModuleLang()->Get('error_upload_image'), E::ModuleLang()->Get('error')); return FALSE; } // Окончательная запись файла только через модуль Uploader if ($oStoredFile = E::ModuleUploader()->StoreImage($sTmpFile, $sTarget, $sTargetId, null, true)) { /** @var ModuleMresource_EntityMresource $oResource */ //$oResource = $this->AddUploadedFileRelationInfo($oStoredFile, $sTarget, $sTargetId, TRUE); $oResource = E::ModuleMresource()->GetMresourcesByUuid($oStoredFile->getUuid()); $sFile = $oStoredFile->GetUrl(); if ($oResource) { $oResource->setType(ModuleMresource::TYPE_PHOTO); E::ModuleMresource()->UpdateType($oResource); } $sFilePreview = $sFile; if ($sSize = F::GetRequest('crop_size', FALSE)) { $sFilePreview = E::ModuleUploader()->ResizeTargetImage($sFile, $sSize); } // Запускаем хук на действия после загрузки картинки E::ModuleHook()->Run('uploader_upload_image_after', array('sFile' => $sFile, 'sFilePreview' => $sFilePreview, 'sTargetId' => $sTargetId, 'sTarget' => $sTarget, 'oTarget' => $oTarget)); E::ModuleViewer()->AssignAjax('file', $sFilePreview); E::ModuleViewer()->AssignAjax('id', $oResource->getMresourceId()); // Чистим E::ModuleImg()->Delete($sTmpFile); return TRUE; } } else { // Ошибки загрузки картинки $sError = E::ModuleUploader()->GetErrorMsg(); if (!$sError) { $sError = E::ModuleLang()->Get('error_upload_image'); } } // Выведем ошибки пользователю E::ModuleMessage()->AddError($sError, E::ModuleLang()->Get('error')); // Удалим ранее загруженый файл F::File_Delete($sTmpFile); }
/** * Generates security key for the current session * * @return string */ protected function _generateSecurityKey() { // Сохраняем текущий ключ для ajax-запросов if (F::AjaxRequest() && ($sKey = E::ModuleSession()->Get($this->sSecurityKeyName))) { return $sKey; } if (Config::Get('module.security.randomkey')) { return F::RandomStr($this->sSecurityKeyLen); } else { //return md5(E::ModuleSession()->GetId().Config::Get('module.security.hash')); return md5($this->GetUniqKey() . $this->GetClientHash() . Config::Get('module.security.hash')); } }
/** * Инициализация модуля * */ public function Init() { E::ModuleHook()->Run('lang_init_start'); $this->sDefaultLang = Config::Get('lang.default'); $this->aLangPaths = F::File_NormPath(Config::Get('lang.paths')); $this->bDeleteUndefinedVars = Config::Get('module.lang.delete_undefined'); // Проверку на языки делаем, только если сайт мультиязычный if (Config::Get('lang.multilang')) { // Время хранение языка в куках $iSavePeriod = F::ToSeconds(Config::Get('lang.save')); $sLangKey = is_string(Config::Get('lang.in_get')) ? Config::Get('lang.in_get') : 'lang'; // Получаем язык, если он был задан в URL $this->sCurrentLang = R::GetLang(); // Проверка куки, если требуется if (!$this->sCurrentLang && $iSavePeriod) { $sLang = (string) E::ModuleSession()->GetCookie($sLangKey); if ($sLang) { $this->sCurrentLang = $sLang; } } if (!$this->sCurrentLang) { $this->sCurrentLang = Config::Get('lang.current'); } } else { $this->sCurrentLang = Config::Get('lang.current'); $iSavePeriod = 0; $sLangKey = null; } // Проверяем на случай старого обозначения языков $this->sDefaultLang = $this->_checkLang($this->sDefaultLang); $this->sCurrentLang = $this->_checkLang($this->sCurrentLang); if ($this->sCurrentLang && Config::Get('lang.multilang') && $iSavePeriod) { // Пишем в куки, если требуется E::ModuleSession()->SetCookie($sLangKey, $this->sCurrentLang, $iSavePeriod); } $this->InitLang(); }
/** * Добавляет связь между ресурсом и целевым объектом * * @param ModuleMresource_EntityMresource $oResource * @param string $sTargetType * @param string $sTargetId * @param bool $bMulti * * @return bool */ public function AddRelationResourceTarget($oResource, $sTargetType, $sTargetId, $bMulti = FALSE) { if ($oResource) { // Если одиночная загрузка, то предыдущий файл затрем // Иначе просто добавляем еще один. if (!$bMulti) { E::ModuleMresource()->UnlinkFile($sTargetType, $sTargetId, E::UserId()); } $oResource->setUrl(E::ModuleMresource()->NormalizeUrl($this->GetTargetUrl($sTargetType, $sTargetId))); $oResource->setType($sTargetType); $oResource->setUserId(E::UserId()); if ($sTargetId == '0') { $oResource->setTargetTmp(E::ModuleSession()->GetCookie(self::COOKIE_TARGET_TMP)); } $oResource = array($oResource); E::ModuleMresource()->AddTargetRel($oResource, $sTargetType, $sTargetId); return $oResource; } return FALSE; }
/** * Удаляет код приглашения из сессии */ protected function DropInviteRegister() { if (Config::Get('general.reg.invite')) { E::ModuleSession()->Drop('invite_code'); } }
/** * Добавляет блог * * @param ModuleBlog_EntityBlog $oBlog Блог * * @return ModuleBlog_EntityBlog|bool */ public function AddBlog(ModuleBlog_EntityBlog $oBlog) { if ($sId = $this->oMapper->AddBlog($oBlog)) { $oBlog->setId($sId); //чистим зависимые кеши E::ModuleCache()->CleanByTags(array('blog_new')); // 1. Удалить значение target_tmp // Нужно затереть временный ключ в ресурсах, что бы в дальнейшем картнка не // воспринималась как временная. if ($sTargetTmp = E::ModuleSession()->GetCookie(ModuleUploader::COOKIE_TARGET_TMP)) { // 2. Удалить куку. // Если прозошло сохранение вновь созданного топика, то нужно // удалить куку временной картинки. Если же сохранялся уже существующий топик, // то удаление куки ни на что влиять не будет. E::ModuleSession()->DelCookie(ModuleUploader::COOKIE_TARGET_TMP); // 3. Переместить фото $sTargetType = 'blog_avatar'; $sTargetId = $sId; $aMresourceRel = E::ModuleMresource()->GetMresourcesRelByTargetAndUser($sTargetType, 0, E::UserId()); if ($aMresourceRel) { $oResource = array_shift($aMresourceRel); $sOldPath = $oResource->GetFile(); //$oStoredFile = E::ModuleUploader()->Store($sOldPath, $sNewPath); $oStoredFile = E::ModuleUploader()->StoreImage($sOldPath, $sTargetType, $sTargetId); /** @var ModuleMresource_EntityMresource $oResource */ $oResource = E::ModuleMresource()->GetMresourcesByUuid($oStoredFile->getUuid()); if ($oResource) { $oResource->setUrl(E::ModuleMresource()->NormalizeUrl(E::ModuleUploader()->GetTargetUrl($sTargetType, $sTargetId))); $oResource->setType($sTargetType); $oResource->setUserId(E::UserId()); $oResource = array($oResource); E::ModuleMresource()->UnlinkFile($sTargetType, 0, E::UserId()); E::ModuleMresource()->AddTargetRel($oResource, $sTargetType, $sTargetId); // 4. Обновим сведения об аватаре у блога для обеспечения обратной // совместимости. Могут быть плагины которые берут картинку непосредственно // из свойства блога, а не через модуль uploader $oBlog->setAvatar($oBlog->getAvatar()); $this->UpdateBlog($oBlog); } } } return $oBlog; } return false; }
/** * AJAX загрузка изображения в фотосет * * @return bool */ protected function EventAjaxPhotoUpload() { // Устанавливаем формат Ajax ответа. Здесь всегда json, поскольку грузится // картинка с помощью flash E::ModuleViewer()->SetResponseAjax('json', false); // * Проверяем авторизован ли юзер if (!E::ModuleUser()->IsAuthorization()) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('not_access'), E::ModuleLang()->Get('error')); return false; } // * Файл был загружен? $aUploadedFile = $this->GetUploadedFile('Filedata'); if (!$aUploadedFile) { E::ModuleMessage()->AddError(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error')); F::SysWarning('System Error'); return false; } $iTopicId = intval(F::GetRequestStr('topic_id')); $sTargetId = null; // Если от сервера не пришёл ID топика, то пытаемся определить временный код для нового топика. // Если и его нет, то это ошибка if (!$iTopicId) { $sTargetId = E::ModuleSession()->GetCookie('ls_photoset_target_tmp'); if (!$sTargetId) { $sTargetId = F::GetRequestStr('ls_photoset_target_tmp'); } if (!$sTargetId) { E::ModuleMessage()->AddError(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error')); F::SysWarning('System Error'); return false; } $iCountPhotos = E::ModuleTopic()->GetCountPhotosByTargetTmp($sTargetId); } else { // * Загрузка фото к уже существующему топику $oTopic = E::ModuleTopic()->GetTopicById($iTopicId); if (!$oTopic || !E::ModuleACL()->IsAllowEditTopic($oTopic, $this->oUserCurrent)) { E::ModuleMessage()->AddError(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error')); F::SysWarning('System Error'); return false; } $iCountPhotos = E::ModuleTopic()->GetCountPhotosByTopicId($iTopicId); } // * Максимальное количество фото в топике if (Config::Get('module.topic.photoset.count_photos_max') && $iCountPhotos >= Config::Get('module.topic.photoset.count_photos_max')) { E::ModuleMessage()->AddError(E::ModuleLang()->Get('topic_photoset_error_too_much_photos', array('MAX' => Config::Get('module.topic.photoset.count_photos_max'))), E::ModuleLang()->Get('error')); return false; } // * Максимальный размер фото if (filesize($aUploadedFile['tmp_name']) > Config::Get('module.topic.photoset.photo_max_size') * 1024) { E::ModuleMessage()->AddError(E::ModuleLang()->Get('topic_photoset_error_bad_filesize', array('MAX' => Config::Get('module.topic.photoset.photo_max_size'))), E::ModuleLang()->Get('error')); return false; } // * Загружаем файл $sFile = E::ModuleTopic()->UploadTopicPhoto($aUploadedFile); if ($sFile) { // * Создаем фото $oPhoto = E::GetEntity('Topic_TopicPhoto'); $oPhoto->setPath($sFile); if ($iTopicId) { $oPhoto->setTopicId($iTopicId); } else { $oPhoto->setTargetTmp($sTargetId); } if ($oPhoto = E::ModuleTopic()->AddTopicPhoto($oPhoto)) { // * Если топик уже существует (редактирование), то обновляем число фотографий в нём if (isset($oTopic)) { $oTopic->setPhotosetCount($oTopic->getPhotosetCount() + 1); E::ModuleTopic()->UpdateTopic($oTopic); } E::ModuleViewer()->AssignAjax('file', $oPhoto->getWebPath('100crop')); E::ModuleViewer()->AssignAjax('id', $oPhoto->getId()); E::ModuleMessage()->AddNotice(E::ModuleLang()->Get('topic_photoset_photo_added'), E::ModuleLang()->Get('attention')); return true; } else { E::ModuleMessage()->AddError(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error')); F::SysWarning('System Error'); } } else { $sMsg = E::ModuleTopic()->UploadPhotoError(); if (!$sMsg) { $sMsg = E::ModuleLang()->Get('system_error'); } E::ModuleMessage()->AddError($sMsg, E::ModuleLang()->Get('error')); } return false; }
/** * Запускает весь процесс :) * */ public function Exec() { $this->ParseUrl(); $this->DefineActionClass(); // Для возможности ДО инициализации модулей определить какой action/event запрошен $this->oEngine = E::getInstance(); $this->oEngine->Init(); // Подгружаем предыдущий URL, если он был $sData = E::ModuleSession()->GetCookie(static::BACKWARD_COOKIE); if ($sData) { $aData = F::Unserialize($sData); if (is_array($aData)) { $this->aBackwardUrl = $aData; } } // И сохраняем текущий, если это не ajax-запрос if (!F::AjaxRequest()) { E::ModuleSession()->SetCookie(static::BACKWARD_COOKIE, F::Serialize($this->aCurrentUrl, true)); } $this->ExecAction(); $this->Shutdown(false); }