/** * Saves file in storage * * @param string $sFile * @param string $sDestination * * @return bool|ModuleUploader_EntityItem */ public function Store($sFile, $sDestination = null) { if (!$sDestination) { $oUser = E::ModuleUser()->GetUserCurrent(); if (!$oUser) { return false; } $sDestination = E::ModuleUploader()->GetUserFileDir($oUser->getId()); } if ($sDestination) { $sMimeType = ModuleImg::MimeType($sFile); $bIsImage = strpos($sMimeType, 'image/') === 0; $iUserId = E::UserId(); $sExtension = F::File_GetExtension($sFile, true); if (substr($sDestination, -1) == '/') { $sDestinationDir = $sDestination; } else { $sDestinationDir = dirname($sDestination) . '/'; } $sUuid = ModuleMresource::CreateUuid('file', $sFile, md5_file($sFile), $iUserId); $sDestination = $sDestinationDir . $sUuid . '.' . $sExtension; if ($sStoredFile = E::ModuleUploader()->Move($sFile, $sDestination, true)) { $oStoredItem = E::GetEntity('Uploader_Item', array('storage' => 'file', 'uuid' => $sUuid, 'original_filename' => basename($sFile), 'url' => $this->Dir2Url($sStoredFile), 'file' => $sStoredFile, 'user_id' => $iUserId, 'mime_type' => $sMimeType, 'is_image' => $bIsImage)); return $oStoredItem; } } return false; }
/** * @param int $iPageNum * @param int $iPageSize * * @return array */ public function getList($iPageNum, $iPageSize) { $aFilter = array('user_id' => E::UserId()); $aTalks = E::ModuleTalk()->GetTalksByFilter($aFilter, $iPageNum, $iPageSize); $aResult = array('total' => $aTalks['count'], 'list' => array()); /** @var PluginAltoApi_ModuleApiTalks_EntityTalk $oTalk */ foreach ($aTalks['collection'] as $oTalk) { $aResult['list'][] = $oTalk->getApiData(); } return $aResult; }
/** * Компилирует тему * * @param array $aParams Передаваемые параметры * @return bool */ public function CompileTheme($aParams, $bDownload = FALSE) { if (!E::User()) { return FALSE; } $sCompiledStyle = E::ModuleLess()->CompileFile(array(C::Get('path.skins.dir') . 'experience-simple/themes/custom/less/theme.less' => C::Get('path.root.web')), __DIR__ . '/../../../cache/', C::Get('path.skins.dir') . 'experience-simple/themes/custom/css/theme.custom.css.map', $aParams, $bDownload); if ($sCompiledStyle) { if (!$bDownload || E::IsAdmin()) { F::File_PutContents(C::Get('path.skins.dir') . 'experience-simple/themes/custom/css/theme.custom.css', $sCompiledStyle); } else { $sPath = C::Get('plugin.estheme.path_for_download') . E::UserId() . '/theme.custom.css'; F::File_PutContents($sPath, $sCompiledStyle); } } }
public function EventEsTheme() { if (!E::User() || !C::Get('plugin.estheme.use_client')) { return R::Action('error'); } $aProcessData = $this->PluginEstheme_Estheme_GetProcessData(); if (getRequest('submit_estheme')) { $sCSSDownloadPath = F::File_Dir2Url(C::Get('plugin.estheme.path_for_download') . E::UserId() . '/theme.custom.css'); $aCompiledData = $this->_processConfig($aProcessData, TRUE); $this->PluginEstheme_Estheme_CompileTheme($aCompiledData, TRUE); } else { $sCSSDownloadPath = FALSE; $this->_processConfig($aProcessData, FALSE); } E::ModuleViewer()->Assign('sCSSDownloadPath', $sCSSDownloadPath); }
/** * Регистрируем хуки */ public function RegisterHook() { if (F::AjaxRequest()) { return; } $xShowStats = Config::Get('general.show.stats'); // if is null then show to admins only if (is_null($xShowStats) && E::IsAdmin() || $xShowStats === true || is_array($xShowStats) && in_array(E::UserId(), $xShowStats)) { $xShowStats = R::GetIsShowStats(); } else { $xShowStats = false; } if ($xShowStats) { $this->AddHook('template_layout_body_end', 'Statistics', __CLASS__, -1000); // LS-compatibility $this->AddHook('template_body_end', 'Statistics', __CLASS__, -1000); } }
/** * Обработка отправленого админу запроса на вступление в блог * * @return string|null */ protected function EventRequestBlog() { F::IncludeLib('XXTEA/encrypt.php'); // * Получаем код подтверждения из ревеста и дешефруем его $sCode = xxtea_decrypt(base64_decode(rawurldecode(F::GetRequestStr('code'))), Config::Get('module.blog.encrypt')); if (!$sCode) { return $this->EventNotFound(); } list($sBlogId, $sUserId) = explode('_', $sCode, 2); $sAction = $this->GetParam(0); // * Получаем текущего пользователя if (!E::ModuleUser()->IsAuthorization()) { return $this->EventNotFound(); } $this->oUserCurrent = E::ModuleUser()->GetUserCurrent(); // Получаем блог /** @var ModuleBlog_EntityBlog $oBlog */ $oBlog = E::ModuleBlog()->GetBlogById($sBlogId); if (!$oBlog || !$oBlog->getBlogType() || !($oBlog->getBlogType()->IsPrivate() || $oBlog->getBlogType()->IsReadOnly())) { return $this->EventNotFound(); } $this->oCurrentBlog = $oBlog; // Проверим, что текущий пользователь имеет право принимать решение if (!($oBlog->getUserIsAdministrator() || $oBlog->getUserIsModerator() || $oBlog->getOwnerId() == E::UserId())) { return $this->EventNotFound(); } // Получим пользователя, который запрашивает приглашение if (!($oGuestUser = E::ModuleUser()->GetUserById($sUserId))) { return $this->EventNotFound(); } // * Получаем связь "блог-пользователь" и проверяем, чтобы ее тип был REQUEST if (!($oBlogUser = E::ModuleBlog()->GetBlogUserByBlogIdAndUserId($oBlog->getId(), $oGuestUser->getId()))) { return $this->EventNotFound(); } // Пользователь уже принят в ряды if ($oBlogUser->getUserRole() >= ModuleBlog::BLOG_USER_ROLE_USER) { $sMessage = E::ModuleLang()->Get('blog_user_request_already_done'); E::ModuleMessage()->AddError($sMessage, E::ModuleLang()->Get('error'), true); R::Location(R::GetPath('talk')); return; } // У пользователя непонятный флаг if ($oBlogUser->getUserRole() != ModuleBlog::BLOG_USER_ROLE_WISHES) { return $this->EventNotFound(); } // * Обновляем роль пользователя до читателя $oBlogUser->setUserRole($sAction == 'accept' ? ModuleBlog::BLOG_USER_ROLE_USER : ModuleBlog::BLOG_USER_ROLE_NOTMEMBER); if (!E::ModuleBlog()->UpdateRelationBlogUser($oBlogUser)) { E::ModuleMessage()->AddError(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error'), true); R::Location(R::GetPath('talk')); return; } if ($sAction == 'accept') { // * Увеличиваем число читателей блога $oBlog->setCountUser($oBlog->getCountUser() + 1); E::ModuleBlog()->UpdateBlog($oBlog); $sMessage = E::ModuleLang()->Get('blog_user_request_accept'); // * Добавляем событие в ленту E::ModuleStream()->Write($oBlogUser->getUserId(), 'join_blog', $oBlog->getId()); } else { $sMessage = E::ModuleLang()->Get('blog_user_request_no_accept'); } E::ModuleMessage()->AddNotice($sMessage, E::ModuleLang()->Get('attention'), true); // * Перенаправляем на страницу личной почты R::Location(R::GetPath('talk')); }
/** * Returns IDs of similar topics by tags * * @param array $aTags * @param array $aExcludeTopics * @param null $iLimit * * @return array */ public function GetSimilarTopicsIdByTags($aTags, $aExcludeTopics = array(), $iLimit = null) { $iUserId = E::UserId(); $aFilter = array('exclude_blogs' => E::ModuleBlog()->GetInaccessibleBlogsByUser(E::User())); if ($aExcludeTopics) { $aFilter['exclude_topics'] = is_array($aExcludeTopics) ? $aExcludeTopics : array(intval($aExcludeTopics)); } if ($iLimit) { $aFilter['limit'] = $iLimit; } $sCacheKey = 'similar_topics_id_' . $iUserId . '_' . serialize($aFilter); if (false === ($aTopicsId = E::ModuleCache()->Get($sCacheKey))) { $aTopicsId = $this->oMapper->GetTopicsIdByTags($aTags, $aFilter); E::ModuleCache()->Set($aTopicsId, $sCacheKey, array('content_new', 'content_update', 'blog_new', 'blog_update'), 'P1D'); } return $aTopicsId; }
/** * Выводит изображение и прикрепляет его ко временному объекту * * @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; }
/** * Returns stats of user publications and favourites * * @param int|object $xUser * * @return int[] */ public function GetUserProfileStats($xUser) { if (is_object($xUser)) { $iUserId = $xUser->getId(); } else { $iUserId = intval($xUser); } $iCountTopicFavourite = E::ModuleTopic()->GetCountTopicsFavouriteByUserId($iUserId); $iCountCommentFavourite = E::ModuleComment()->GetCountCommentsFavouriteByUserId($iUserId); $iCountTopics = E::ModuleTopic()->GetCountTopicsPersonalByUser($iUserId, 1); $iCountComments = E::ModuleComment()->GetCountCommentsByUserId($iUserId, 'topic'); $iCountWallRecords = E::ModuleWall()->GetCountWall(array('wall_user_id' => $iUserId, 'pid' => null)); $iImageCount = E::ModuleMresource()->GetCountImagesByUserId($iUserId); $iCountUserNotes = $this->GetCountUserNotesByUserId($iUserId); $iCountUserFriends = $this->GetCountUsersFriend($iUserId); $aUserPublicationStats = array('favourite_topics' => $iCountTopicFavourite, 'favourite_comments' => $iCountCommentFavourite, 'count_topics' => $iCountTopics, 'count_comments' => $iCountComments, 'count_usernotes' => $iCountUserNotes, 'count_wallrecords' => $iCountWallRecords, 'count_images' => $iImageCount, 'count_friends' => $iCountUserFriends); $aUserPublicationStats['count_created'] = $aUserPublicationStats['count_topics'] + $aUserPublicationStats['count_comments'] + $aUserPublicationStats['count_images']; if ($iUserId == E::UserId()) { $aUserPublicationStats['count_created'] += $aUserPublicationStats['count_usernotes']; } $aUserPublicationStats['count_favourites'] = $aUserPublicationStats['favourite_topics'] + $aUserPublicationStats['favourite_comments']; return $aUserPublicationStats; }
/** * @param ModuleUser_EntityUser|int $xUser * @param array $aAdditionalOptions * * @return int */ public function GetCountTopicsSandboxNewByUser($xUser, $aAdditionalOptions = array()) { $iUserId = is_object($xUser) ? $xUser->getId() : intval($xUser); $sCacheKey = 'count_topics_sandbox_user_' . $iUserId . '_' . E::UserId(); if (FALSE === ($iCount = E::ModuleCache()->GetTmp($sCacheKey))) { $aOptions = array('accessible' => true, 'sandbox' => true, 'user_id' => $iUserId); if ($aAdditionalOptions && is_array($aAdditionalOptions)) { $aOptions = array_merge($aOptions, $aAdditionalOptions); } $aFilter = $this->GetNamedFilter('new', $aOptions); $iCount = $this->GetCountTopicsByFilter($aFilter); E::ModuleCache()->SetTmp($iCount, $sCacheKey); } return $iCount; }
public function isVoteInfoShow() { $bResult = $this->getVote() || E::UserId() == $this->getUserId() || strtotime($this->getDateAdd()) < time() - Config::Get('acl.vote.topic.limit_time'); return $bResult; }
/** * Загружаем картинку */ public function EventUploadImage() { // Устанавливаем формат 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; } $sTarget = F::GetRequest('target', FALSE); $sTargetId = F::GetRequest('target_id', FALSE); // Проверяем, целевой объект и права на его редактирование if (!($oTarget = E::ModuleUploader()->CheckAccessAndGetTarget($sTarget, $sTargetId))) { // Здесь два варианта, либо редактировать нельзя, либо можно, но топика еще нет if ($oTarget === TRUE) { // Будем делать временную картинку } else { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('not_access'), E::ModuleLang()->Get('error')); return; } } // Ошибок пока нет $sError = ''; // Загружаем временный файл $sTmpFile = E::ModuleUploader()->UploadLocal($aUploadedFile, $sTarget); // Вызовем хук перед началом загрузки картинки E::ModuleHook()->Run('uploader_upload_before', array('oTarget' => $oTarget, 'sTmpFile' => $sTmpFile, 'sTarget' => $sTarget, 'sTargetId' => $sTargetId)); // Если все ок, и по миме проходит, то if ($sTmpFile) { if (E::ModuleImg()->MimeType($sTmpFile)) { // Ресайзим и сохраняем уменьшенную копию // Храним две копии - мелкую для показа пользователю и крупную в качестве исходной для ресайза $sPreviewFile = E::ModuleUploader()->GetUserImageDir(E::UserId(), true, false) . '_preview.' . F::File_GetExtension($sTmpFile); if ($sPreviewFile = E::ModuleImg()->Copy($sTmpFile, $sPreviewFile, self::PREVIEW_RESIZE, self::PREVIEW_RESIZE)) { // * Сохраняем в сессии временный файл с изображением E::ModuleSession()->Set('sTarget', $sTarget); E::ModuleSession()->Set('sTargetId', $sTargetId); E::ModuleSession()->Set("sTmp-{$sTarget}-{$sTargetId}", $sTmpFile); E::ModuleSession()->Set("sPreview-{$sTarget}-{$sTargetId}", $sPreviewFile); E::ModuleViewer()->AssignAjax('sPreview', E::ModuleUploader()->Dir2Url($sPreviewFile)); if (getRequest('direct', FALSE)) { $this->EventDirectImage(); } return; } } else { $sError = E::ModuleLang()->Get('error_upload_wrong_image_type'); } // If anything wrong then deletes temp file F::File_Delete($sTmpFile); } 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); }
/** * Обработка завершения работу экшена */ public function EventShutdown() { if (!E::User()) { return; } $iCountTalkFavourite = E::ModuleTalk()->GetCountTalksFavouriteByUserId($this->oUserCurrent->getId()); E::ModuleViewer()->Assign('iCountTalkFavourite', $iCountTalkFavourite); $iUserId = E::UserId(); // Get stats of various user publications topics, comments, images, etc. and stats of favourites $aProfileStats = E::ModuleUser()->GetUserProfileStats($iUserId); // Получим информацию об изображениях пользователя /** @var ModuleMresource_EntityMresourceCategory[] $aUserImagesInfo */ $aUserImagesInfo = E::ModuleMresource()->GetAllImageCategoriesByUserId($iUserId); E::ModuleViewer()->Assign('oUserProfile', E::User()); E::ModuleViewer()->Assign('aProfileStats', $aProfileStats); E::ModuleViewer()->Assign('aUserImagesInfo', $aUserImagesInfo); // Old style skin compatibility E::ModuleViewer()->Assign('iCountTopicUser', $aProfileStats['count_topics']); E::ModuleViewer()->Assign('iCountCommentUser', $aProfileStats['count_comments']); E::ModuleViewer()->Assign('iCountTopicFavourite', $aProfileStats['favourite_topics']); E::ModuleViewer()->Assign('iCountCommentFavourite', $aProfileStats['favourite_comments']); E::ModuleViewer()->Assign('iCountNoteUser', $aProfileStats['count_usernotes']); E::ModuleViewer()->Assign('iCountWallUser', $aProfileStats['count_wallrecords']); E::ModuleViewer()->Assign('iPhotoCount', $aProfileStats['count_images']); E::ModuleViewer()->Assign('iCountCreated', $aProfileStats['count_created']); E::ModuleViewer()->Assign('iCountFavourite', $aProfileStats['count_favourites']); E::ModuleViewer()->Assign('iCountFriendsUser', $aProfileStats['count_friends']); E::ModuleViewer()->Assign('sMenuSubItemSelect', $this->sMenuSubItemSelect); E::ModuleViewer()->Assign('sMenuSubItemSelect', $this->sMenuSubItemSelect); // * Передаем константы состояний участников разговора E::ModuleViewer()->Assign('TALK_USER_ACTIVE', ModuleTalk::TALK_USER_ACTIVE); E::ModuleViewer()->Assign('TALK_USER_DELETE_BY_SELF', ModuleTalk::TALK_USER_DELETE_BY_SELF); E::ModuleViewer()->Assign('TALK_USER_DELETE_BY_AUTHOR', ModuleTalk::TALK_USER_DELETE_BY_AUTHOR); }
/** * User was deleted from friends list * * @return bool */ public function isDeleted() { return $this->getStatusFrom() == ModuleUser::USER_FRIEND_DELETE and $this->getUserFrom() == E::UserId(); }
protected function _filterBlogUsers($aBlogUsers) { if (!$aBlogUsers || E::IsAdmin() || E::UserId() == $this->oUserProfile->getId()) { return $aBlogUsers; } else { // Blog types for guest and all users $aBlogTypes = E::ModuleBlog()->GetOpenBlogTypes(); foreach ($aBlogUsers as $n => $oBlogUser) { if (!in_array($oBlogUser->getBlog()->getType(), $aBlogTypes)) { unset($aBlogUsers[$n]); } } } return $aBlogUsers; }
/** * Проверяет доступность того или иного целевого объекта, переопределяется * плагинами. По умолчанию всё грузить запрещено. * Если всё нормально и пользователю разрешено сюда загружать картинки, * то метод возвращает целевой объект, иначе значение FALSE. * * @param string $sTarget * @param int $iTargetId * * @return bool */ public function CheckAccessAndGetTarget($sTarget, $iTargetId = null) { // Проверяем право пользователя на прикрепление картинок к топику if (mb_strpos($sTarget, 'single-image-uploader') === 0 || $sTarget == 'photoset') { // Проверям, авторизован ли пользователь if (!E::IsUser()) { return FALSE; } // Топик редактируется if ($oTopic = E::ModuleTopic()->GetTopicById($iTargetId)) { if (!E::ModuleACL()->IsAllowEditTopic($oTopic, E::User())) { return FALSE; } return $oTopic; } return TRUE; } // Загружать аватарки можно только в свой профиль if ($sTarget == 'profile_avatar') { if ($iTargetId && E::IsUser() && $iTargetId == E::UserId()) { return E::User(); } return FALSE; } // Загружать аватарки можно только в свой профиль if ($sTarget == 'profile_photo') { if ($iTargetId && E::IsUser() && $iTargetId == E::UserId()) { return E::User(); } return FALSE; } if ($sTarget == 'blog_avatar') { /** @var ModuleBlog_EntityBlog $oBlog */ $oBlog = E::ModuleBlog()->GetBlogById($iTargetId); if (!E::IsUser()) { return false; } if (!$oBlog) { // Блог еще не создан return E::ModuleACL()->CanCreateBlog(E::User()) || E::IsAdminOrModerator(); } if ($oBlog && (E::ModuleACL()->CheckBlogEditBlog($oBlog, E::User()) || E::IsAdminOrModerator())) { return $oBlog; } return ''; } if ($sTarget == 'topic') { if (!E::IsUser()) { return false; } /** @var ModuleTopic_EntityTopic $oTopic */ $oTopic = E::ModuleTopic()->GetTopicById($iTargetId); if (!$oTopic) { // Топик еще не создан return TRUE; } if ($oTopic && (E::ModuleACL()->IsAllowEditTopic($oTopic, E::User()) || E::IsAdminOrModerator())) { return $oTopic; } return ''; } if ($sTarget == 'topic_comment') { if (!E::IsUser()) { return false; } /** @var ModuleComment_EntityComment $oComment */ $oComment = E::ModuleComment()->GetCommentById($iTargetId); if (!$oComment) { // Комментарий еще не создан return TRUE; } if ($oComment && (E::ModuleACL()->CanPostComment(E::User(), $oComment->getTarget()) && E::ModuleAcl()->CanPostCommentTime(E::User()) || E::IsAdminOrModerator())) { return $oComment; } return ''; } if ($sTarget == 'talk_comment') { if (!E::IsUser()) { return false; } /** @var ModuleComment_EntityComment $oComment */ $oComment = E::ModuleComment()->GetCommentById($iTargetId); if (!$oComment) { // Комментарий еще не создан return TRUE; } if ($oComment && (E::ModuleAcl()->CanPostTalkCommentTime(E::User()) || E::IsAdminOrModerator())) { return $oComment; } return ''; } if ($sTarget == 'talk') { if (!E::IsUser()) { return false; } /** @var ModuleComment_EntityComment $oTalk */ $oTalk = E::ModuleTalk()->GetTalkById($iTargetId); if (!$oTalk) { // Комментарий еще не создан return TRUE; } if ($oTalk && (E::ModuleAcl()->CanSendTalkTime(E::User()) || E::IsAdminOrModerator())) { return $oTalk; } return ''; } return FALSE; }
/** * Загрузка страницы картинок */ protected function EventImageManagerLoadImages() { E::ModuleSecurity()->ValidateSendForm(); // Менеджер изображений может запускаться в том числе и из админки // Если передано название скина админки, то используем его, если же // нет, то ту тему, которая установлена для сайта if (($sAdminTheme = F::GetRequest('admin')) && E::IsAdmin()) { C::Set('view.skin', $sAdminTheme); } // Получим идентификатор пользователя, изображения которого нужно загрузить $iUserId = (int) F::GetRequest('profile', FALSE); if ($iUserId && E::ModuleUser()->GetUserById($iUserId)) { C::Set('menu.data.profile_images.uid', $iUserId); } else { // Только пользователь может смотреть своё дерево изображений if (!E::IsUser()) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error')); return; } $iUserId = E::UserId(); } $sCategory = F::GetRequestStr('category', FALSE); $iPage = intval(F::GetRequestStr('page', '1')); $sTopicId = F::GetRequestStr('topic_id', FALSE); $sTargetType = F::GetRequestStr('target'); if (!$sCategory) { return; } $aTplVariables = array('sTargetType' => $sTargetType, 'sTargetId' => $sTopicId); // Страница загрузки картинки с компьютера if ($sCategory == 'insert-from-pc') { $sImages = E::ModuleViewer()->Fetch('modals/insert_img/inject.pc.tpl', $aTplVariables); E::ModuleViewer()->AssignAjax('images', $sImages); return; } // Страница загрузки из интернета if ($sCategory == 'insert-from-link') { $sImages = E::ModuleViewer()->Fetch('modals/insert_img/inject.link.tpl', $aTplVariables); E::ModuleViewer()->AssignAjax('images', $sImages); return; } $sTemplateName = 'inject.images.tpl'; $aResources = array('collection' => array()); $iPagesCount = 0; if ($sCategory == 'user') { //ок // * Аватар и фото пользователя $aResources = E::ModuleMresource()->GetMresourcesByFilter(array('target_type' => array('profile_avatar', 'profile_photo'), 'user_id' => $iUserId), $iPage, Config::Get('module.topic.images_per_page')); $sTemplateName = 'inject.images.user.tpl'; $iPagesCount = 0; } elseif ($sCategory == '_topic') { // * Конкретный топик $oTopic = E::ModuleTopic()->GetTopicById($sTopicId); if ($oTopic && ($oTopic->isPublished() || $oTopic->getUserId() == E::UserId()) && E::ModuleACL()->IsAllowShowBlog($oTopic->getBlog(), E::User())) { $aResourcesId = E::ModuleMresource()->GetCurrentTopicResourcesId($iUserId, $sTopicId); if ($aResourcesId) { $aResources = E::ModuleMresource()->GetMresourcesByFilter(array('user_id' => $iUserId, 'mresource_id' => $aResourcesId), $iPage, Config::Get('module.topic.images_per_page')); $aResources['count'] = count($aResourcesId); $iPagesCount = ceil($aResources['count'] / Config::Get('module.topic.images_per_page')); $aTplVariables['oTopic'] = $oTopic; } } $sTemplateName = 'inject.images.tpl'; } elseif ($sCategory == 'talk') { // * Письмо /** @var ModuleTalk_EntityTalk $oTopic */ $oTopic = E::ModuleTalk()->GetTalkById($sTopicId); if ($oTopic && E::ModuleTalk()->GetTalkUser($sTopicId, $iUserId)) { $aResources = E::ModuleMresource()->GetMresourcesByFilter(array('user_id' => $iUserId, 'target_type' => 'talk', 'target_id' => $sTopicId), $iPage, Config::Get('module.topic.images_per_page')); $aResources['count'] = E::ModuleMresource()->GetMresourcesCountByTargetIdAndUserId('talk', $sTopicId, $iUserId); $iPagesCount = ceil($aResources['count'] / Config::Get('module.topic.images_per_page')); $aTplVariables['oTopic'] = $oTopic; } $sTemplateName = 'inject.images.tpl'; } elseif ($sCategory == 'comments') { // * Комментарии $aResources = E::ModuleMresource()->GetMresourcesByFilter(array('user_id' => $iUserId, 'target_type' => array('talk_comment', 'topic_comment')), $iPage, Config::Get('module.topic.images_per_page')); $aResources['count'] = E::ModuleMresource()->GetMresourcesCountByTargetAndUserId(array('talk_comment', 'topic_comment'), $iUserId); $iPagesCount = ceil($aResources['count'] / Config::Get('module.topic.images_per_page')); $sTemplateName = 'inject.images.tpl'; } elseif ($sCategory == 'current') { //ок // * Картинки текущего топика (текст, фотосет, одиночные картинки) $aResourcesId = E::ModuleMresource()->GetCurrentTopicResourcesId($iUserId, $sTopicId); if ($aResourcesId) { $aResources = E::ModuleMresource()->GetMresourcesByFilter(array('user_id' => $iUserId, 'mresource_id' => $aResourcesId), $iPage, Config::Get('module.topic.images_per_page')); $aResources['count'] = count($aResourcesId); $iPagesCount = ceil($aResources['count'] / Config::Get('module.topic.images_per_page')); } $sTemplateName = 'inject.images.tpl'; } elseif ($sCategory == 'blog_avatar') { // ок // * Аватары созданных блогов $aResources = E::ModuleMresource()->GetMresourcesByFilter(array('target_type' => 'blog_avatar', 'user_id' => $iUserId), $iPage, Config::Get('module.topic.group_images_per_page')); $aResources['count'] = E::ModuleMresource()->GetMresourcesCountByTargetAndUserId('blog_avatar', $iUserId); // Получим блоги $aBlogsId = array(); foreach ($aResources['collection'] as $oResource) { $aBlogsId[] = $oResource->getTargetId(); } if ($aBlogsId) { $aBlogs = E::ModuleBlog()->GetBlogsAdditionalData($aBlogsId); $aTplVariables['aBlogs'] = $aBlogs; } $sTemplateName = 'inject.images.blog.tpl'; $iPagesCount = ceil($aResources['count'] / Config::Get('module.topic.group_images_per_page')); } elseif ($sCategory == 'topics') { // ок // * Страница топиков $aTopicsData = E::ModuleMresource()->GetTopicsPage($iUserId, $iPage, Config::Get('module.topic.group_images_per_page')); $aTplVariables['aTopics'] = $aTopicsData['collection']; $sTemplateName = 'inject.images.topic.tpl'; $iPagesCount = ceil($aTopicsData['count'] / Config::Get('module.topic.group_images_per_page')); $aResources = array('collection' => array()); } elseif (in_array($sCategory, E::ModuleTopic()->GetTopicTypes())) { // ок // * Страница топиков $aTopicsData = E::ModuleMresource()->GetTopicsPageByType($iUserId, $sCategory, $iPage, Config::Get('module.topic.group_images_per_page')); $aTplVariables['aTopics'] = $aTopicsData['collection']; $sTemplateName = 'inject.images.topic.tpl'; $iPagesCount = ceil($aTopicsData['count'] / Config::Get('module.topic.group_images_per_page')); $aResources = array('collection' => array()); } elseif ($sCategory == 'talks') { // ок // * Страница писем $aTalksData = E::ModuleMresource()->GetTalksPage($iUserId, $iPage, Config::Get('module.topic.group_images_per_page')); $aTplVariables['aTalks'] = $aTalksData['collection']; $sTemplateName = 'inject.images.talk.tpl'; $iPagesCount = ceil($aTalksData['count'] / Config::Get('module.topic.group_images_per_page')); $aResources = array('collection' => array()); } else { // * Прочие изображения $aResources = E::ModuleMresource()->GetMresourcesByFilter(array('target_type' => $sCategory, 'user_id' => $iUserId), $iPage, Config::Get('module.topic.images_per_page')); $iPagesCount = ceil($aResources['count'] / Config::Get('module.topic.images_per_page')); } $aTplVariables['aResources'] = $aResources['collection']; $sPath = F::GetRequest('profile', FALSE) ? 'actions/profile/created_photos/' : 'modals/insert_img/'; $sImages = E::ModuleViewer()->GetLocalViewer()->Fetch($sPath . $sTemplateName, $aTplVariables); E::ModuleViewer()->AssignAjax('images', $sImages); E::ModuleViewer()->AssignAjax('category', $sCategory); E::ModuleViewer()->AssignAjax('page', $iPage); E::ModuleViewer()->AssignAjax('pages', $iPagesCount); }
/** * Получает число новых тем и комментов где есть юзер * * @param int $iUserId ID пользователя * * @return int */ public function GetCountTrackNew($iUserId) { $iUserId = (int) $iUserId; if (!$iUserId) { return false; } $sCacheKey = E::ModuleCache()->Key('track_count_new_user_', $iUserId); if (false === ($data = E::ModuleCache()->Get($sCacheKey, 'tmp,'))) { $data = $this->oMapper->GetCountTrackNew($iUserId); if ($iUserId == E::UserId()) { $sCacheType = ',tmp'; } else { $sCacheType = null; } E::ModuleCache()->Set($data, $sCacheKey, array('topic_update', 'topic_new', "topic_read_user_{$iUserId}"), 'P1D', $sCacheType); } return $data; }
/** * Прикрепляет временный ресурс к вновь созданному объекту * * @param string $sTargetType * @param string $sTargetId * @param $sTargetTmp * * @return bool|ModuleMresource_EntityMresource */ public function LinkTempResource($sTargetType, $sTargetId, $sTargetTmp) { if ($sTargetTmp && E::IsUser()) { $sNewPath = E::ModuleUploader()->GetUserImageDir(E::UserId(), true, false); $aMresourceRel = $this->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 = $this->GetMresourcesByUuid($oStoredFile->getUuid()); if ($oResource) { $oResource->setUrl($this->NormalizeUrl(E::ModuleUploader()->GetTargetUrl($sTargetType, $sTargetId))); $oResource->setType($sTargetType); $oResource->setUserId(E::UserId()); // 4. В свойство поля записать адрес картинки $this->UnlinkFile($sTargetType, 0, E::UserId()); $this->AddTargetRel($oResource, $sTargetType, $sTargetId); return $oResource; } } } return false; }
/** * Выполняется при завершении работы экшена * */ public function EventShutdown() { $iUserId = E::UserId(); // Get stats of various user publications topics, comments, images, etc. and stats of favourites $aProfileStats = E::ModuleUser()->GetUserProfileStats($iUserId); // Получим информацию об изображениях пользователя /** @var ModuleMresource_EntityMresourceCategory[] $aUserImagesInfo */ $aUserImagesInfo = E::ModuleMresource()->GetAllImageCategoriesByUserId($iUserId); E::ModuleViewer()->Assign('oUserProfile', E::User()); E::ModuleViewer()->Assign('aProfileStats', $aProfileStats); E::ModuleViewer()->Assign('aUserImagesInfo', $aUserImagesInfo); // Old style skin compatibility E::ModuleViewer()->Assign('iCountTopicUser', $aProfileStats['count_topics']); E::ModuleViewer()->Assign('iCountCommentUser', $aProfileStats['count_comments']); E::ModuleViewer()->Assign('iCountTopicFavourite', $aProfileStats['favourite_topics']); E::ModuleViewer()->Assign('iCountCommentFavourite', $aProfileStats['favourite_comments']); E::ModuleViewer()->Assign('iCountNoteUser', $aProfileStats['count_usernotes']); E::ModuleViewer()->Assign('iCountWallUser', $aProfileStats['count_wallrecords']); E::ModuleViewer()->Assign('iPhotoCount', $aProfileStats['count_images']); E::ModuleViewer()->Assign('iCountCreated', $aProfileStats['count_created']); E::ModuleViewer()->Assign('iCountFavourite', $aProfileStats['count_favourites']); E::ModuleViewer()->Assign('iCountFriendsUser', $aProfileStats['count_friends']); // * Загружаем в шаблон необходимые переменные E::ModuleViewer()->Assign('sMenuItemSelect', $this->sMenuItemSelect); E::ModuleViewer()->Assign('sMenuSubItemSelect', $this->sMenuSubItemSelect); E::ModuleHook()->Run('action_shutdown_settings'); }
protected function _eventUsersCmdBan($aUsersId, $nDays, $sComment) { if ($aUsersId) { if (in_array(E::UserId(), $aUsersId)) { E::ModuleMessage()->AddError(E::ModuleLang()->Get('action.admin.cannot_ban_self'), null, true); return false; } if (in_array(1, $aUsersId)) { E::ModuleMessage()->AddError(E::ModuleLang()->Get('action.admin.cannot_ban_admin'), null, true); return false; } $aUsers = E::ModuleUser()->GetUsersByArrayId($aUsersId); foreach ($aUsers as $oUser) { if ($oUser->isAdministrator()) { E::ModuleMessage()->AddError(E::ModuleLang()->Get('action.admin.cannot_ban_admin'), null, true); return false; } } if (E::ModuleAdmin()->BanUsers($aUsersId, $nDays, $sComment)) { E::ModuleMessage()->AddNotice(E::ModuleLang()->Get('action.admin.action_ok'), null, true); return true; } else { E::ModuleMessage()->AddError(E::ModuleLang()->Get('action.admin.action_err'), null, true); } } return false; }
/** * Выводит изображение и прикрепляет его ко временному объекту * * @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 EventRemoveImage() { // * Устанавливаем формат 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; } // * Удаляем картинку E::ModuleMresource()->UnlinkFile($sTargetType, $sTargetId, E::UserId()); // Запускаем хук на действия после загрузки картинки E::ModuleHook()->Run('uploader_remove_image_after', array('sTargetId' => $sTargetId, 'sTarget' => $sTargetType, 'oTarget' => $oTarget)); // * Возвращает дефолтную аватарку E::ModuleViewer()->AssignAjax('sTitleUpload', E::ModuleLang()->Get('uploader_upload_success')); }
/** * Прямая загрузка изображения без открытия окна ресайза * * @return bool */ public function EventDirectImage() { // * Устанавливаем формат Ajax ответа E::ModuleViewer()->SetResponseAjax('json'); // * Достаем из сессии временный файл $sTarget = E::ModuleSession()->Get('sTarget'); $sTargetId = E::ModuleSession()->Get('sTargetId'); $sTmpFile = E::ModuleSession()->Get("sTmp-{$sTarget}-{$sTargetId}"); $sPreviewFile = E::ModuleSession()->Get("sPreview-{$sTarget}-{$sTargetId}"); if ($sTargetId == '0') { if (!E::ModuleSession()->GetCookie(ModuleUploader::COOKIE_TARGET_TMP)) { return FALSE; } } if (!F::File_Exists($sTmpFile)) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error')); return false; } // Проверяем, целевой объект и права на его редактирование if (!($oTarget = E::ModuleUploader()->CheckAccessAndGetTarget($sTarget, $sTargetId))) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('not_access'), E::ModuleLang()->Get('error')); return false; } E::ModuleMresource()->UnlinkFile($sTarget, $sTargetId, E::UserId()); $oImg = E::ModuleImg()->Read($sTmpFile); $sExtension = strtolower(pathinfo($sTmpFile, PATHINFO_EXTENSION)); // Сохраняем фото во временный файл if ($sTmpFile = $oImg->Save(F::File_UploadUniqname($sExtension))) { // Окончательная запись файла только через модуль Uploader if ($oStoredFile = E::ModuleUploader()->StoreImage($sTmpFile, $sTarget, $sTargetId)) { $sFile = $oStoredFile->GetUrl(); $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('sFile', $sFile); E::ModuleViewer()->AssignAjax('sFilePreview', $sFilePreview); // Чистим $sTmpFile = E::ModuleSession()->Get("sTmp-{$sTarget}-{$sTargetId}"); $sPreviewFile = E::ModuleSession()->Get("sPreview-{$sTarget}-{$sTargetId}"); E::ModuleImg()->Delete($sTmpFile); E::ModuleImg()->Delete($sPreviewFile); // * Удаляем из сессии E::ModuleSession()->Drop('sTarget'); E::ModuleSession()->Drop('sTargetId'); E::ModuleSession()->Drop("sTmp-{$sTarget}-{$sTargetId}"); E::ModuleSession()->Drop("sPreview-{$sTarget}-{$sTargetId}"); return true; } } // * В случае ошибки, возвращаем false E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error')); return false; }
/** * Возвращает количество сообщений для пользователя * * @param bool $sTemplate * @return int|mixed|string */ public function CountMessages($sTemplate = false) { if (!E::IsUser()) { return ''; } $sKeyString = 'menu_count_messages_' . E::UserId() . '_' . (string) $sTemplate; if (FALSE === ($sData = E::ModuleCache()->GetTmp($sKeyString))) { $iValue = (int) $this->CountTrack() + (int) $this->NewTalk(); if ($sTemplate && $iValue) { $sData = str_replace('{{count_messages}}', $iValue, $sTemplate); } else { $sData = $iValue ? $iValue : ''; } E::ModuleCache()->SetTmp($sData, $sKeyString); } return $sData; }
/** * Returns types of blogs which user cannot read (without personal subscriptions/membership) * * @param ModuleUser_EntityUser $oUser * * @return array */ public function GetCloseBlogTypes($oUser = null) { if (is_null($oUser)) { $iUserId = E::UserId(); } else { $iUserId = is_object($oUser) ? $oUser->getId() : intval($oUser); } $sCacheKey = 'blog_types_close_' . ($iUserId ? 'user' : 'guest'); if (false === ($aBlogTypes = E::ModuleCache()->Get($sCacheKey, 'tmp'))) { if ($this->oUserCurrent) { $aFilter = array('acl_read' => ModuleBlog::BLOG_USER_ACL_MEMBER); } else { $aFilter = array('acl_read' => ModuleBlog::BLOG_USER_ACL_USER | ModuleBlog::BLOG_USER_ACL_MEMBER); } // Blog types for guest and all users $aBlogTypes = $this->GetBlogTypes($aFilter, true); E::ModuleCache()->Set($aBlogTypes, $sCacheKey, array('blog_update', 'blog_new'), 'P30D', 'tmp'); } return $aBlogTypes; }
/** * Обработка дополнительных полей топика * * @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; }
/** * Сколько секунд осталось до конца редактирования * * @param bool $bFormat * * @return int */ public function getEditTime($bFormat = false) { $xEditTime = C::Get('module.comment.edit.enable'); if (!$xEditTime) { return 0; } if ($xEditTime && E::User() && E::UserId() == $this->getUserId()) { $sNow = date('Y-m-d H:i:s'); if ($xEditTime === true) { $sDateTime = F::DateTimeAdd($sNow, '10 minutes'); } else { $sDateTime = F::DateTimeAdd($this->getDate(), $xEditTime); } if ($sNow < $sDateTime) { $nRest = F::DateDiffSeconds($sNow, $sDateTime); if (!$bFormat) { return $nRest; } if ($nRest < 60) { return sprintf('%2d sec', $nRest); } $nS = $nRest % 60; $nM = ($nRest - $nS) / 60; if ($nM < 60) { return sprintf('%2d:%02d', $nM, $nS); } $nRest = $nM; $nM = $nRest % 60; $nH = ($nRest - $nM) / 60; if ($nH < 24) { return sprintf('%2d:%02d:%02d', $nH, $nM, $nS); } $nRest = $nH; $nH = $nRest % 24; $nD = ($nRest - $nH) / 24; return sprintf('%3d, %2d:%02d:%02d', $nD, $nH, $nM, $nS); } } return 0; }