/** * Страница создания письма */ protected function EventAdd() { $this->sMenuSubItemSelect = 'add'; E::ModuleViewer()->AddHtmlTitle(E::ModuleLang()->Get('talk_menu_inbox_create')); // * Получаем список друзей $aUsersFriend = E::ModuleUser()->GetUsersFriend($this->oUserCurrent->getId()); if ($aUsersFriend['collection']) { E::ModuleViewer()->Assign('aUsersFriend', $aUsersFriend['collection']); } // * Проверяем отправлена ли форма с данными if (!F::isPost('submit_talk_add')) { return false; } // * Проверка корректности полей формы if (!$this->checkTalkFields()) { return false; } // * Проверяем разрешено ли отправлять инбокс по времени if (!E::ModuleACL()->CanSendTalkTime($this->oUserCurrent)) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('talk_time_limit'), E::ModuleLang()->Get('error')); return false; } // * Отправляем письмо if ($oTalk = E::ModuleTalk()->SendTalk(E::ModuleText()->Parser(strip_tags(F::GetRequestStr('talk_title'))), E::ModuleText()->Parser(F::GetRequestStr('talk_text')), $this->oUserCurrent, $this->aUsersId)) { E::ModuleMresource()->CheckTargetTextForImages('talk', $oTalk->getId(), $oTalk->getText()); R::Location(R::GetPath('talk') . 'read/' . $oTalk->getId() . '/'); } else { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error')); return R::Action('error'); } }
/** * Returns hash of original local image * If mresource isn't a local image then returns ordinary hash * * @return string */ public function GetOriginalHash() { $sPropKey = '-original-hash'; if (!$this->isProp($sPropKey)) { $sHash = $this->GetHash(); if (($sPathUrl = $this->GetPathUrl()) && ($sOriginalUrl = $this->GetOriginalPathUrl())) { if ($sOriginalUrl !== $sPathUrl) { $sHash = E::ModuleMresource()->CalcUrlHash($sOriginalUrl); } } $this->setProp($sPropKey, $sHash); } return $this->getProp($sPropKey); }
/** * @param string[] $aUrls * @param int|null $nUserId * * @return array */ public function GetMresourcesIdByUrl($aUrls, $nUserId = null) { if (!is_array($aUrls)) { $aUrls = array($aUrls); } else { $aUrls = array_unique($aUrls); } $aHash = array(); foreach ($aUrls as $sLink) { $aHash[] = md5(E::ModuleMresource()->NormalizeUrl($sLink)); } return $this->GetMresourcesIdByHashUrl($aHash, $nUserId); }
/** * Выводит изображение и прикрепляет его ко временному объекту * * @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 string $sTag * @param array $aParams * @param string $sContent * @param string $sText * * @return string */ public function CallbackCheckLinks($sTag, $aParams, $sContent, $sText) { if (isset($this->aCheckTagLinks[$sTag])) { if (isset($aParams[$this->aCheckTagLinks[$sTag]['link']])) { $sLinkAttr = $this->aCheckTagLinks[$sTag]['link']; $sLink = E::ModuleMresource()->NormalizeUrl($aParams[$sLinkAttr]); $nType = $this->aCheckTagLinks[$sTag]['type']; $this->aLinks[] = array('type' => $nType, 'link' => $sLink); $sText = '<' . $sTag . ' '; foreach ($aParams as $sKey => $sVal) { if ($sKey == $sLinkAttr && $this->aCheckTagLinks[$sTag]['restoreFunc']) { $sVal = call_user_func($this->aCheckTagLinks[$sTag]['restoreFunc'], $sLink); } $sText .= $sKey . '="' . $sVal . '" '; } if (is_null($sContent)) { $sText .= '/>'; } else { $sText .= '>' . $sContent . '</' . $sTag . '>'; } } } return $sText; }
/** * Меняет сортировку элементов фотосета */ 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')); }
/** * 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; }
/** * Возвращает html-код фотосета * * @param $aData * @return bool */ public function SnippetPhotoset($aData) { // Попытаемся определить откуда вызывается сниппет фотосета // поскольку нужно точно определить целевой объект и его ид // Редактируется топик. // Получим его ид. и по нему поднимем необходимый фотосет $aAdminMatches = array(); if (preg_match('~content\\/edit\\/(\\d+)\\/~', R::GetControllerPath(), $aMatches) || preg_match('~admin\\/content-pages\\/edit\\/(\\d+)\\/~', R::GetControllerPath(), $aAdminMatches)) { // Найдем топик, из которого будем брать фотосет $iTopicId = (int) isset($aData['params']['topic']) ? $aData['params']['topic'] : ($aAdminMatches ? FALSE : $aMatches[1]); // Странно, но топик не нашли - завернём сниппет if (!($oTopic = E::ModuleTopic()->GetTopicById($iTopicId))) { return FALSE; } // Проверим, можно ли пользователю читать этот топик, а то вдруг // он запросил картинки из топика закрытого блога - а так нельзя if (!E::ModuleACL()->IsAllowShowBlog($oTopic->getBlog(), E::User())) { return FALSE; } // Попытаемся найти фотосет /** @var ModuleMresource_EntityMresource[] $aPhotos */ if (!(($aPhotos = E::ModuleMresource()->GetMresourcesRelByTarget('photoset', $oTopic->getId())) && is_array($aPhotos) && count($aPhotos) > 0)) { return FALSE; } // Фотосет нашли, теперь из него нужно выбрать только те фото, // которые выбрал пользователь в параметрах from и to $iFrom = isset($aData['params']['from']) ? $aData['params']['from'] : 0; $iFrom = (int) str_replace(array('last', 'first'), array(count($aPhotos), 0), $iFrom); // Пользователи считают картинки с первой, а не с нулевой if ($iFrom) { $iFrom -= 1; } // Если указана длина, то правый предел игнорируем if ($iCount = (int) isset($aData['params']['count']) ? $aData['params']['count'] : FALSE) { $iTo = $iFrom + $iCount - 1; } else { $iTo = isset($aData['params']['to']) ? $aData['params']['to'] : count($aPhotos); $iTo = (int) str_replace(array('last', 'first'), array(count($aPhotos), 0), $iTo); if ($iTo) { $iTo -= 1; } } // Пользователь ошибочно указал диапазон. выдумывать ничего не будем, // просто не выведем фотосет if ($iTo - $iFrom < 0) { return FALSE; } // Сбросим ключи набора фото, так лучше считать диапазон $aPhotos = array_values($aPhotos); foreach ($aPhotos as $k => $v) { if ($k < $iFrom || $k > $iTo) { unset($aPhotos[$k]); } } if (!$aPhotos) { return FALSE; } $sPosition = $iTopicId = (int) isset($aData['params']['position']) ? $aData['params']['position'] : 'center'; if (!in_array($sPosition, array('left', 'right'))) { $sPosition = 'center'; } // Получим html-код сниппета $aVars = array('oTopic' => $oTopic, 'aPhotos' => $aPhotos, 'sPosition' => $sPosition, 'sPhotosetHash' => md5(serialize($aData['params']))); $aData['result'] = trim(E::ModuleViewer()->Fetch('tpls/snippets/snippet.photoset.tpl', $aVars)); return $aData['result']; } 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 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'); }
/** * Возвращает фотографии из фотосета топика * * @param int|null $iFromId ID с которого начинать выборку * @param int|null $iCount Количество * * @return ModuleTopic_EntityTopicPhoto[] */ public function getPhotosetPhotos($iFromId = null, $iCount = null) { $iPhotosCount = $this->getPhotosetCount(); if (!$iPhotosCount) { return array(); } $aPhotos = E::ModuleMresource()->GetMresourcesRelByTarget('photoset', $this->getId()); $aResult = array(); if ($aPhotos && ($iFromId || $iCount)) { $iCntSet = -1; // Сравнение должно идти по ид. ресурса, а не по ид. // картинки foreach ($aPhotos as $oPhoto) { if ($oPhoto->getMresourceId() >= $iFromId) { if (++$iCntSet >= $iCount) { break; } $aResult[$oPhoto->getMresourceId()] = $oPhoto; } } } else { $aResult = $aPhotos; } return $aResult; }
/** * Обновляет коммент * * @param ModuleComment_EntityComment $oComment Объект комментария * * @return bool */ public function UpdateComment(ModuleComment_EntityComment $oComment) { if ($this->oMapper->UpdateComment($oComment)) { // Освежим хранилище картинок E::ModuleMresource()->CheckTargetTextForImages($oComment->getTargetType() . '_comment', $oComment->getId(), $oComment->getText()); //чистим зависимые кеши E::ModuleCache()->CleanByTags(array("comment_update", "comment_update_{$oComment->getTargetType()}_{$oComment->getTargetId()}")); E::ModuleCache()->Delete("comment_{$oComment->getId()}"); return true; } return false; }
public function buildMresource() { $oMresource = E::GetEntity('Mresource_MresourceRel'); $oMresource->SetLink(false); $oMresource->SetType(ModuleMresource::TYPE_IMAGE | ModuleMresource::TYPE_PHOTO); $oMresource->SetUrl(E::ModuleMresource()->NormalizeUrl($this->GetPath())); return $oMresource; }
/** * Обработка завершения работу экшена */ 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); }
/** * Returns main photo in photoset * * @return ModuleTopic_EntityTopicPhoto|null */ public function getPhotosetMainPhoto($bFirst = FALSE) { // Топика ещё нет, вернём дефолтное значение (null) if (!$this->getId()) { return NULL; } $aResult = E::ModuleMresource()->GetMresourcesByFilter(array('target_type' => 'photoset', 'target_id' => $this->getId(), 'type' => ModuleMresource::TYPE_PHOTO_PRIMARY), 1, 1); if ($aResult && ($oMresource = array_shift($aResult['collection']))) { /** @var ModuleMresource_EntityMresource $oMresource */ return $oMresource; } return NULL; }
/** * Обработка редактирования топика * * @param ModuleTopic_EntityTopic $oTopic * * @return mixed */ protected function SubmitEdit($oTopic) { $oTopic->_setValidateScenario('topic'); // * Сохраняем старое значение идентификатора блога $iBlogIdOld = $oTopic->getBlogId(); // * Заполняем поля для валидации $iBlogId = F::GetRequestStr('blog_id'); // if blog_id is empty then save blog not changed if (is_numeric($iBlogId)) { $oTopic->setBlogId($iBlogId); } // issue 151 (https://github.com/altocms/altocms/issues/151) // Некорректная обработка названия блога // $oTopic->setTitle(strip_tags(F::GetRequestStr('topic_title'))); $oTopic->setTitle(E::ModuleTools()->RemoveAllTags(F::GetRequestStr('topic_title'))); $oTopic->setTextSource(F::GetRequestStr('topic_text')); if ($this->oContentType->isAllow('link')) { $oTopic->setSourceLink(F::GetRequestStr('topic_field_link')); } $oTopic->setTags(F::GetRequestStr('topic_field_tags')); $oTopic->setUserIp(F::GetUserIp()); if ($this->oUserCurrent && ($this->oUserCurrent->isAdministrator() || $this->oUserCurrent->isModerator())) { if (F::GetRequestStr('topic_url') && $oTopic->getTopicUrl() != F::GetRequestStr('topic_url')) { $sTopicUrl = E::ModuleTopic()->CorrectTopicUrl(F::TranslitUrl(F::GetRequestStr('topic_url'))); $oTopic->setTopicUrl($sTopicUrl); } } // * Проверка корректности полей формы if (!$this->checkTopicFields($oTopic)) { return false; } // * Определяем в какой блог делаем запись $nBlogId = $oTopic->getBlogId(); if ($nBlogId == 0) { $oBlog = E::ModuleBlog()->GetPersonalBlogByUserId($oTopic->getUserId()); } else { $oBlog = E::ModuleBlog()->GetBlogById($nBlogId); } // * Если блог не определен выдаем предупреждение if (!$oBlog) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('topic_create_blog_error_unknown'), E::ModuleLang()->Get('error')); return false; } // * Проверяем права на постинг в блог if (!E::ModuleACL()->IsAllowBlog($oBlog, $this->oUserCurrent)) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('topic_create_blog_error_noallow'), E::ModuleLang()->Get('error')); return false; } // * Проверяем разрешено ли постить топик по времени if (isPost('submit_topic_publish') && !$oTopic->getPublishDraft() && !E::ModuleACL()->CanPostTopicTime($this->oUserCurrent)) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('topic_time_limit'), E::ModuleLang()->Get('error')); return; } $oTopic->setBlogId($oBlog->getId()); // * Получаемый и устанавливаем разрезанный текст по тегу <cut> list($sTextShort, $sTextNew, $sTextCut) = E::ModuleText()->Cut($oTopic->getTextSource()); $oTopic->setCutText($sTextCut); $oTopic->setText(E::ModuleText()->Parser($sTextNew)); // Получаем ссылки, полученные при парсинге текста $oTopic->setTextLinks(E::ModuleText()->GetLinks()); $oTopic->setTextShort(E::ModuleText()->Parser($sTextShort)); // * Изменяем вопрос/ответы, только если еще никто не голосовал if ($this->oContentType->isAllow('poll') && F::GetRequestStr('topic_field_question') && F::GetRequest('topic_field_answers', array()) && $oTopic->getQuestionCountVote() == 0) { $oTopic->setQuestionTitle(strip_tags(F::GetRequestStr('topic_field_question'))); $oTopic->clearQuestionAnswer(); $aAnswers = F::GetRequest('topic_field_answers', array()); foreach ($aAnswers as $sAnswer) { $sAnswer = trim((string) $sAnswer); if ($sAnswer) { $oTopic->addQuestionAnswer($sAnswer); } } } $aPhotoSetData = E::ModuleMresource()->GetPhotosetData('photoset', $oTopic->getId()); $oTopic->setPhotosetCount($aPhotoSetData['count']); $oTopic->setPhotosetMainPhotoId($aPhotoSetData['cover']); // * Publish or save as a draft $bSendNotify = false; if (isset($_REQUEST['submit_topic_publish'])) { // If the topic has not been published then sets date of show (publication date) if (!$oTopic->getPublish() && !$oTopic->getDateShow()) { $oTopic->setDateShow(F::Now()); } $oTopic->setPublish(1); if ($oTopic->getPublishDraft() == 0) { $oTopic->setPublishDraft(1); $oTopic->setDateAdd(F::Now()); $bSendNotify = true; } } else { $oTopic->setPublish(0); } // * Принудительный вывод на главную if (E::ModuleACL()->IsAllowPublishIndex($this->oUserCurrent)) { if (F::GetRequest('topic_publish_index')) { $oTopic->setPublishIndex(1); } else { $oTopic->setPublishIndex(0); } } // * Запрет на комментарии к топику $oTopic->setForbidComment(F::GetRequest('topic_forbid_comment', 0)); // Если запрет на индексацию не устанавливался вручную, то задаем, как у блога $oBlogType = $oBlog->GetBlogType(); if ($oBlogType && !$oTopic->getIndexIgnoreLock()) { $oTopic->setTopicIndexIgnore($oBlogType->GetIndexIgnore()); } else { $oTopic->setTopicIndexIgnore(false); } $oTopic->setShowPhotoset(F::GetRequest('topic_show_photoset', 0)); E::ModuleHook()->Run('topic_edit_before', array('oTopic' => $oTopic, 'oBlog' => $oBlog)); // * Сохраняем топик if ($this->_updateTopic($oTopic)) { E::ModuleHook()->Run('topic_edit_after', array('oTopic' => $oTopic, 'oBlog' => $oBlog, 'bSendNotify' => &$bSendNotify)); // * Обновляем данные в комментариях, если топик был перенесен в новый блог if ($iBlogIdOld != $oTopic->getBlogId()) { E::ModuleComment()->UpdateTargetParentByTargetId($oTopic->getBlogId(), 'topic', $oTopic->getId()); E::ModuleComment()->UpdateTargetParentByTargetIdOnline($oTopic->getBlogId(), 'topic', $oTopic->getId()); } // * Обновляем количество топиков в блоге if ($iBlogIdOld != $oTopic->getBlogId()) { E::ModuleBlog()->RecalculateCountTopicByBlogId($iBlogIdOld); } E::ModuleBlog()->RecalculateCountTopicByBlogId($oTopic->getBlogId()); // * Добавляем событие в ленту E::ModuleStream()->Write($oTopic->getUserId(), 'add_topic', $oTopic->getId(), $oTopic->getPublish() && (!$oBlogType || !$oBlog->getBlogType()->IsPrivate())); // * Рассылаем о новом топике подписчикам блога if ($bSendNotify) { E::ModuleTopic()->SendNotifyTopicNew($oBlog, $oTopic, $oTopic->getUser()); } if (!$oTopic->getPublish() && !$this->oUserCurrent->isAdministrator() && !$this->oUserCurrent->isModerator() && $this->oUserCurrent->getId() != $oTopic->getUserId()) { R::Location($oBlog->getUrlFull()); } R::Location($oTopic->getUrl()); } else { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error')); F::SysWarning('System Error'); return R::Action('error'); } }
/** * @return bool */ protected function _eventMresourcesDelete() { if ($iMresourceId = $this->GetPost('mresource_id')) { if (E::ModuleMresource()->DeleteMresources($iMresourceId)) { E::ModuleMessage()->AddNotice(E::ModuleLang()->Get('action.admin.mresource_deleted')); return true; } } E::ModuleMessage()->AddError(E::ModuleLang()->Get('action.admin.mresource_not_deleted')); return false; }
/** * Удаляет аватар блога с сервера * * @param ModuleBlog_EntityBlog $oBlog Блог */ public function DeleteAvatar($oBlog) { if ($oBlog) { // * Если аватар есть, удаляем его и его рейсайзы (старая схема) if ($sUrl = $oBlog->getAvatar()) { E::ModuleImg()->Delete(E::ModuleUploader()->Url2Dir($sUrl)); } // Deletes blog avatar from media resources E::ModuleMresource()->DeleteMresourcesRelByTarget('blog_avatar', $oBlog->getid()); } }
/** * Учет ссылок в тексте * * @param string $sTag * @param array $aParams * @param string $sContent * @param string $sText * * @return string */ public function CallbackCheckLinks($sTag, $aParams, $sContent, $sText = null) { if (isset($this->aCheckTagLinks[$sTag])) { if (isset($aParams[$this->aCheckTagLinks[$sTag]['link']])) { $sLinkAttr = $this->aCheckTagLinks[$sTag]['link']; $sLink = E::ModuleMresource()->NormalizeUrl($aParams[$sLinkAttr]); $nType = $this->aCheckTagLinks[$sTag]['type']; $this->aLinks[] = array('type' => $nType, 'link' => $sLink); $sText = '<' . $sTag . ' '; if (F::File_LocalUrl($aParams[$sLinkAttr]) && isset($aParams['rel']) && $aParams['rel'] == 'nofollow') { unset($aParams['rel']); } foreach ($aParams as $sKey => $sVal) { if ($sKey == $sLinkAttr && $this->aCheckTagLinks[$sTag]['restoreFunc']) { $sVal = call_user_func($this->aCheckTagLinks[$sTag]['restoreFunc'], $sLink); } $sText .= $sKey . '="' . $sVal . '" '; } if (is_null($sContent) || empty($this->aCheckTagLinks[$sTag]['pairedTag'])) { $sText = trim($sText) . '>'; } else { $sText = trim($sText) . '>' . $sContent . '</' . $sTag . '>'; } } } return $sText; }
/** * @param $xUsers * @param $sTargetType * @param $xTargetId * * @return ModuleMresource_EntityMresourceRel[] */ public function GetImagesByUserAndTarget($xUsers, $sTargetType, $xTargetId = null) { $aUserIds = $this->_entitiesId($xUsers); $aMResourceRel = E::ModuleMresource()->GetMresourcesRelByTargetAndUser($sTargetType, $xTargetId, $aUserIds); $aResult = array_fill_keys($aUserIds, array()); if ($aMResourceRel) { foreach ($aMResourceRel as $oMResourseRel) { $aResult[$oMResourseRel->getUserId()][$oMResourseRel->getId()] = $oMResourseRel; } } return $aResult; }
/** * Обработчик формирования меню в режиме blogs * * @param string[] $aFillSet Набор элементов меню * @param array $aMenu Само меню * @return array */ public function ProcessInsertImageMode($aFillSet, $aMenu = NULL) { /** @var ModuleMenu_EntityItem[] $aItems */ $aItems = array(); // Только пользователь может смотреть своё дерево изображений // if (!E::IsUser()) { // return $aItems; // } $sTopicId = getRequestStr('topic_id', getRequestStr('target_id', FALSE)); if ($sTopicId && !E::ModuleTopic()->GetTopicById($sTopicId)) { $sTopicId = FALSE; } /** @var ModuleMresource_EntityMresourceCategory[] $aResources Категории объектов пользователя */ $aCategories = E::ModuleMresource()->GetImageCategoriesByUserId(isset($aMenu['uid']) ? $aMenu['uid'] : E::UserId(), $sTopicId); // Получим категорию топиков для пользователя if ($aTopicsCategory = E::ModuleMresource()->GetTopicsImageCategory(isset($aMenu['uid']) ? $aMenu['uid'] : E::UserId())) { foreach ($aTopicsCategory as $oTopicsCategory) { $aCategories[] = $oTopicsCategory; } } // Временные изображения // if ($oTmpTopicCategory = E::ModuleMresource()->GetCurrentTopicImageCategory(isset($aMenu['uid']) ? $aMenu['uid'] : E::UserId(), false)) { // $aCategories[] = $oTmpTopicCategory; // } if ($sTopicId && ($oCurrentTopicCategory = E::ModuleMresource()->GetCurrentTopicImageCategory(isset($aMenu['uid']) ? $aMenu['uid'] : E::UserId(), $sTopicId))) { $aCategories[] = $oCurrentTopicCategory; } if (!isset($aMenu['protect']) && (!isset($aMenu['uid']) || $aMenu['uid'] == E::UserId())) { if ($oTalksCategory = E::ModuleMresource()->GetTalksImageCategory(isset($aMenu['uid']) ? $aMenu['uid'] : E::UserId())) { $aCategories[] = $oTalksCategory; } } if ($oCommentsCategory = E::ModuleMresource()->GetCommentsImageCategory(isset($aMenu['uid']) ? $aMenu['uid'] : E::UserId())) { $aCategories[] = $oCommentsCategory; } if ($aCategories) { /** @var ModuleMresource_EntityMresourceCategory $oCategory */ foreach ($aCategories as $oCategory) { $aItems['menu_insert_' . $oCategory->getId()] = $this->CreateMenuItem('menu_insert_' . $oCategory->getId(), array('text' => $oCategory->getLabel() . '<span>' . $oCategory->getCount() . '</span>', 'link' => '#', 'active' => FALSE, 'submenu' => array(), 'display' => TRUE, 'options' => array('link_class' => '', 'link_url' => '#', 'class' => 'category-show category-show-' . $oCategory->getId(), 'link_data' => array('category' => $oCategory->getId())))); } } return $aItems; }
/** * Загрузка страницы картинок */ 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 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); }
/** * Выполняется при завершении работы экшена */ public function EventShutdown() { if (!$this->oUserProfile) { return; } /** * Загружаем в шаблон необходимые переменные */ $iCountTopicFavourite = E::ModuleTopic()->GetCountTopicsFavouriteByUserId($this->oUserProfile->getId()); $iCountTopicUser = E::ModuleTopic()->GetCountTopicsPersonalByUser($this->oUserProfile->getId(), 1); $iCountCommentUser = E::ModuleComment()->GetCountCommentsByUserId($this->oUserProfile->getId(), 'topic'); $iCountCommentFavourite = E::ModuleComment()->GetCountCommentsFavouriteByUserId($this->oUserProfile->getId()); $iCountNoteUser = E::ModuleUser()->GetCountUserNotesByUserId($this->oUserProfile->getId()); // Получим информацию об изображениях пользовтеля // И посчитаем общее количество картинок /** @var ModuleMresource_EntityMresourceCategory[] $aUserImagesInfo */ $aUserImagesInfo = E::ModuleMresource()->GetAllImageCategoriesByUserId($this->oUserProfile->getId()); $iPhotoCount = E::ModuleMresource()->GetCountImagesByUserId($this->oUserProfile->getId()); E::ModuleViewer()->Assign('oUserProfile', $this->oUserProfile); E::ModuleViewer()->Assign('iCountTopicUser', $iCountTopicUser); E::ModuleViewer()->Assign('iCountCommentUser', $iCountCommentUser); E::ModuleViewer()->Assign('iCountTopicFavourite', $iCountTopicFavourite); E::ModuleViewer()->Assign('iCountCommentFavourite', $iCountCommentFavourite); E::ModuleViewer()->Assign('iCountNoteUser', $iCountNoteUser); E::ModuleViewer()->Assign('iCountWallUser', E::ModuleWall()->GetCountWall(array('wall_user_id' => $this->oUserProfile->getId(), 'pid' => null))); E::ModuleViewer()->Assign('oUserImagesInfo', $aUserImagesInfo); E::ModuleViewer()->Assign('iPhotoCount', $iPhotoCount); /** * Общее число публикаций и избранного */ E::ModuleViewer()->Assign('iCountCreated', ($this->oUserCurrent && $this->oUserCurrent->getId() == $this->oUserProfile->getId() ? $iCountNoteUser : 0) + $iCountTopicUser + $iCountCommentUser + $iPhotoCount); E::ModuleViewer()->Assign('iCountFavourite', $iCountCommentFavourite + $iCountTopicFavourite); /** * Заметка текущего пользователя о юзере */ if ($this->oUserCurrent) { E::ModuleViewer()->Assign('oUserNote', $this->oUserProfile->getUserNote()); } E::ModuleViewer()->Assign('iCountFriendsUser', E::ModuleUser()->GetCountUsersFriend($this->oUserProfile->getId())); E::ModuleViewer()->Assign('sMenuSubItemSelect', $this->sMenuSubItemSelect); E::ModuleViewer()->Assign('sMenuHeadItemSelect', $this->sMenuHeadItemSelect); E::ModuleViewer()->Assign('USER_FRIEND_NULL', ModuleUser::USER_FRIEND_NULL); E::ModuleViewer()->Assign('USER_FRIEND_OFFER', ModuleUser::USER_FRIEND_OFFER); E::ModuleViewer()->Assign('USER_FRIEND_ACCEPT', ModuleUser::USER_FRIEND_ACCEPT); E::ModuleViewer()->Assign('USER_FRIEND_REJECT', ModuleUser::USER_FRIEND_REJECT); E::ModuleViewer()->Assign('USER_FRIEND_DELETE', ModuleUser::USER_FRIEND_DELETE); }