* */ /** * Экшен обработки ajax запросов * Ответ отдает в JSON фомате * * @package application.actions * @since 1.0 */ class ActionAjax extends Action { /** * Текущий пользователь * * @var ModuleUser_EntityUser|null */ protected $oUserCurrent = null; /** * Инициализация */ public function Init() { /** * Устанавливаем формат ответа */ $this->Viewer_SetResponseAjax('json'); /** * Получаем текущего пользователя */ $this->oUserCurrent = $this->User_GetUserCurrent(); } /** * Регистрация евентов */ protected function RegisterEvent() { $this->AddEventPreg('/^vote$/i', '/^comment$/', 'EventVoteComment'); $this->AddEventPreg('/^vote$/i', '/^topic$/', 'EventVoteTopic'); $this->AddEventPreg('/^vote$/i', '/^get$/', '/^info$/', '/^topic$/', 'EventVoteGetInfoTopic'); $this->AddEventPreg('/^favourite$/i', '/^save-tags/', 'EventFavouriteSaveTags'); $this->AddEventPreg('/^favourite$/i', '/^topic$/', 'EventFavouriteTopic'); $this->AddEventPreg('/^favourite$/i', '/^comment$/', 'EventFavouriteComment'); $this->AddEventPreg('/^favourite$/i', '/^talk$/', 'EventFavouriteTalk'); $this->AddEventPreg('/^stream$/i', '/^comment$/', 'EventStreamComment'); $this->AddEventPreg('/^stream$/i', '/^topic$/', 'EventStreamTopic'); $this->AddEventPreg('/^blogs$/i', '/^top$/', 'EventBlogsTop'); $this->AddEventPreg('/^blogs$/i', '/^self$/', 'EventBlogsSelf'); $this->AddEventPreg('/^blogs$/i', '/^join$/', 'EventBlogsJoin'); $this->AddEventPreg('/^blogs$/i', '/^get-by-category$/', 'EventBlogsGetByCategory'); $this->AddEventPreg('/^preview$/i', '/^text$/', 'EventPreviewText'); $this->AddEventPreg('/^autocompleter$/i', '/^tag$/', 'EventAutocompleterTag'); $this->AddEventPreg('/^autocompleter$/i', '/^user$/', 'EventAutocompleterUser'); $this->AddEventPreg('/^comment$/i', '/^delete$/', 'EventCommentDelete'); $this->AddEventPreg('/^comment$/i', '/^load$/', 'EventCommentLoad'); $this->AddEventPreg('/^comment$/i', '/^update$/', 'EventCommentUpdate'); $this->AddEventPreg('/^geo$/i', '/^get/', '/^regions$/', 'EventGeoGetRegions'); $this->AddEventPreg('/^geo$/i', '/^get/', '/^cities$/', 'EventGeoGetCities'); $this->AddEventPreg('/^media$/i', '/^upload$/', '/^$/', 'EventMediaUpload'); $this->AddEventPreg('/^media$/i', '/^upload-link$/', '/^$/', 'EventMediaUploadLink'); $this->AddEventPreg('/^media$/i', '/^generate-target-tmp$/', '/^$/', 'EventMediaGenerateTargetTmp'); $this->AddEventPreg('/^media$/i', '/^submit-insert$/', '/^$/', 'EventMediaSubmitInsert'); $this->AddEventPreg('/^media$/i', '/^submit-create-photoset$/', '/^$/', 'EventMediaSubmitCreatePhotoset'); $this->AddEventPreg('/^media$/i', '/^load-gallery$/', '/^$/', 'EventMediaLoadGallery'); $this->AddEventPreg('/^media$/i', '/^remove-file$/', '/^$/', 'EventMediaRemoveFile'); $this->AddEventPreg('/^media$/i', '/^create-preview-file$/', '/^$/', 'EventMediaCreatePreviewFile'); $this->AddEventPreg('/^media$/i', '/^remove-preview-file$/', '/^$/', 'EventMediaRemovePreviewFile'); $this->AddEventPreg('/^media$/i', '/^load-preview-items$/', '/^$/', 'EventMediaLoadPreviewItems'); $this->AddEventPreg('/^media$/i', '/^save-data-file$/', '/^$/', 'EventMediaSaveDataFile'); $this->AddEventPreg('/^property$/i', '/^tags$/', '/^autocompleter$/', '/^$/', 'EventPropertyTagsAutocompleter'); $this->AddEventPreg('/^captcha$/i', '/^$/', 'EventCaptcha'); $this->AddEventPreg('/^captcha$/i', '/^validate$/', '/^$/', 'EventCaptchaValidate'); $this->AddEventPreg('/^poll$/i', '/^modal-create$/', '/^$/', 'EventPollModalCreate'); $this->AddEventPreg('/^poll$/i', '/^modal-update/', '/^$/', 'EventPollModalUpdate'); $this->AddEventPreg('/^poll$/i', '/^create$/', '/^$/', 'EventPollCreate'); $this->AddEventPreg('/^poll$/i', '/^update$/', '/^$/', 'EventPollUpdate'); $this->AddEventPreg('/^poll$/i', '/^remove$/', '/^$/', 'EventPollRemove'); $this->AddEventPreg('/^poll$/i', '/^vote$/', '/^$/', 'EventPollVote'); $this->AddEvent('modal-friend-list', 'EventModalFriendList'); $this->AddEventPreg('/^modal$/i', '/^image-crop$/', '/^$/', 'EventModalImageCrop'); /** * Стена */ // Добавление поста/комментария $this->AddEventPreg('/^wall$/i', '/^add$/', 'EventWallAdd'); // Удаление поста/комментария $this->AddEventPreg('/^wall$/i', '/^remove$/', 'EventWallRemove'); // Подгрузка постов $this->AddEventPreg('/^wall$/i', '/^load$/', 'EventWallLoad'); // Подгрузка комментариев $this->AddEventPreg('/^wall$/i', '/^load-comments$/', 'EventWallLoadComments'); } /********************************************************************************** ************************ РЕАЛИЗАЦИЯ ЭКШЕНА *************************************** ********************************************************************************** */ /** * Показывает модальное окно с друзьями */ protected function EventModalFriendList() { if (!$this->oUserCurrent) { return parent::EventNotFound(); } $oViewer = $this->Viewer_GetLocalViewer(); // Получаем переменные $bSelectable = (bool)getRequest('selectable'); // Получаем список друзей $aUsersFriend = $this->User_GetUsersFriend($this->oUserCurrent->getId()); if ($aUsersFriend['collection']) { $oViewer->Assign('users', $aUsersFriend['collection'], true); } $oViewer->Assign('selectable', $bSelectable, true); $this->Viewer_AssignAjax('sText', $oViewer->Fetch("component@user.modal.user-list")); } /** * Показывает модальное окно с функцией кропа изображения */ protected function EventModalImageCrop() { $oViewer = $this->Viewer_GetLocalViewer(); $oViewer->Assign('usePreview', (bool)getRequest('use_preview'), true); $oViewer->Assign('image', getRequestStr('image_src'), true); $oViewer->Assign('originalWidth', (int)getRequest('original_width'), true); $oViewer->Assign('originalHeight', (int)getRequest('original_height'), true); $oViewer->Assign('width', (int)getRequest('width'), true); $oViewer->Assign('height', (int)getRequest('height'), true); $oViewer->Assign('title', getRequestStr('title'), true); $oViewer->Assign('desc', getRequestStr('desc'), true); $this->Viewer_AssignAjax('sText', $oViewer->Fetch("component@crop.crop")); } protected function EventPollVote() { if (!$oPoll = $this->Poll_GetPollById(getRequestStr('id'))) { return $this->EventErrorDebug(); } if (!$this->oUserCurrent and !$oPoll->getIsGuestAllow()) { return $this->EventErrorDebug(); } /** * Истекло время голосования? */ if (!$oPoll->isAllowVote()) { $this->Message_AddErrorSingle($this->Lang_Get('poll.notices.error_not_allow_vote')); return; } /** * Пользователь уже голосовал? */ if ($this->Poll_CheckUserAlreadyVote($oPoll, $this->oUserCurrent)) { $this->Message_AddErrorSingle($this->Lang_Get('poll.notices.error_already_vote')); return; } $aAnswerIds = array(); $aAnswerItems = array(); if (!getRequest('abstain')) { /** * Проверяем варианты ответов */ if (!$aAnswer = (array)getRequest('answers')) { $this->Message_AddErrorSingle($this->Lang_Get('poll.notices.error_no_answers')); return; } foreach ($aAnswer as $iAnswerId) { if (!is_numeric($iAnswerId)) { return $this->EventErrorDebug(); } $aAnswerIds[] = $iAnswerId; } /** * Корректность ID вариантов */ $aAnswerItems = $this->Poll_GetAnswerItemsByFilter(array( 'id in' => $aAnswerIds, 'poll_id' => $oPoll->getId() )); if (count($aAnswerItems) != count($aAnswerIds)) { return $this->EventErrorDebug(); } /** * Ограничение на максимальное число ответов */ if (count($aAnswerIds) > $oPoll->getCountAnswerMax()) { $this->Message_AddErrorSingle($this->Lang_Get('poll.notices.error_answers_max', array('count' => $oPoll->getCountAnswerMax()))); return; } } /** * Голосуем */ $oVote = Engine::GetEntity('ModulePoll_EntityVote'); $oVote->setPollId($oPoll->getId()); $oVote->setPoll($oPoll); // для быстродействия/оптимизации $oVote->setUserId($this->oUserCurrent ? $this->oUserCurrent->getId() : null); $oVote->setGuestKey($this->oUserCurrent ? null : func_generator(32)); $oVote->setAnswers($aAnswerIds); $oVote->setAnswersObject($aAnswerItems); // передаем для быстродействия, чтобы не запрашивать варианты еще раз после сохранения голоса if ($oVote->Add()) { /** * Устанавливаем куку */ if ($oVote->getGuestKey()) { $this->Session_SetCookie($this->Poll_GetCookieVoteName($oPoll), $oVote->getGuestKey(), time() + 60 * 60 * 24 * 90); } $oViewer = $this->Viewer_GetLocalViewer(); $oViewer->Assign('poll', $oPoll); $this->Viewer_AssignAjax('sText', $oViewer->Fetch("component@poll.result")); } else { return $this->EventErrorDebug(); } } protected function EventPollCreate() { if (!$this->oUserCurrent) { return $this->EventErrorDebug(); } /** * Создаем */ $oPoll = Engine::GetEntity('ModulePoll_EntityPoll'); $oPoll->_setValidateScenario('create'); $oPoll->_setDataSafe(getRequest('poll')); $oPoll->setAnswersRaw(getRequest('answers')); $oPoll->setTargetRaw(getRequest('target')); $oPoll->setUserId($this->oUserCurrent->getId()); if ($oPoll->_Validate()) { if ($oPoll->Add()) { $oViewer = $this->Viewer_GetLocalViewer(); $oViewer->Assign('poll', $oPoll); $this->Viewer_AssignAjax('item', $oViewer->Fetch("component@poll.manage.item")); return true; } else { $this->Message_AddError($this->Lang_Get('common.error.save'), $this->Lang_Get('common.error.error')); } } else { $this->Message_AddError($oPoll->_getValidateError(), $this->Lang_Get('common.error.error')); } } protected function EventPollUpdate() { if (!$this->oUserCurrent) { return $this->EventErrorDebug(); } if (!$oPoll = $this->Poll_GetPollById(getRequestStr('poll_id'))) { return $this->EventErrorDebug(); } /** * Проверяем корректность target'а */ if ($oPoll->getTargetId()) { if (!$this->Poll_CheckTarget($oPoll->getTargetType(), $oPoll->getTargetId())) { return $this->EventErrorDebug(); } } else { $sTarget = isset($_REQUEST['target']['tmp']) ? $_REQUEST['target']['tmp'] : ''; if (!$this->Poll_IsAllowTargetType($oPoll->getTargetType()) or $oPoll->getTargetTmp() != $sTarget) { return $this->EventErrorDebug(); } } /** * Обновляем */ $oPoll->_setValidateScenario('update'); $oPoll->_setDataSafe(getRequest('poll')); $oPoll->setAnswersRaw(getRequest('answers')); if ($oPoll->_Validate()) { if ($oPoll->Update()) { $oViewer = $this->Viewer_GetLocalViewer(); $oViewer->Assign('poll', $oPoll); $this->Viewer_AssignAjax('item', $oViewer->Fetch("component@poll.manage.item")); $this->Viewer_AssignAjax('id', $oPoll->getId()); return true; } else { $this->Message_AddError($this->Lang_Get('common.error.save'), $this->Lang_Get('common.error.error')); } } else { $this->Message_AddError($oPoll->_getValidateError(), $this->Lang_Get('common.error.error')); } } protected function EventPollRemove() { if (!$this->oUserCurrent) { return $this->EventErrorDebug(); } if (!$oPoll = $this->Poll_GetPollById(getRequestStr('id'))) { return $this->EventErrorDebug(); } /** * Проверяем корректность target'а */ if ($oPoll->getTargetId()) { if (!$this->Poll_CheckTarget($oPoll->getTargetType(), $oPoll->getTargetId())) { return $this->EventErrorDebug(); } } else { if (!$this->Poll_IsAllowTargetType($oPoll->getTargetType()) or $oPoll->getTargetTmp() != getRequestStr('tmp')) { return $this->EventErrorDebug(); } } if (!$oPoll->isAllowRemove()) { $this->Message_AddError($this->Lang_Get('poll.notices.error_not_allow_remove')); return; } /** * Удаляем */ if ($oPoll->Delete()) { return true; } else { $this->Message_AddError($this->Lang_Get('common.error.save'), $this->Lang_Get('common.error.error')); } } protected function EventPollModalCreate() { if (!$this->oUserCurrent) { return $this->EventErrorDebug(); } /** * Проверяем корректность target'а */ $sTargetType = getRequestStr('target_type'); $sTargetId = getRequestStr('target_id'); $sTargetTmp = $this->Session_GetCookie('poll_target_tmp_' . $sTargetType) ? $this->Session_GetCookie('poll_target_tmp_' . $sTargetType) : getRequestStr('target_tmp'); if ($sTargetId) { $sTargetTmp = null; if (!$this->Poll_CheckTarget($sTargetType, $sTargetId)) { return $this->EventErrorDebug(); } } else { $sTargetId = null; if (!$this->Poll_IsAllowTargetType($sTargetType)) { return $this->EventErrorDebug(); } if (!$sTargetTmp) { $sTargetTmp = func_generator(); $this->Session_SetCookie('poll_target_tmp_' . $sTargetType, $sTargetTmp, time() + 24 * 3600); } } $oViewer = $this->Viewer_GetLocalViewer(); $oViewer->Assign('sTargetType', $sTargetType); $oViewer->Assign('sTargetId', $sTargetId); $oViewer->Assign('sTargetTmp', $sTargetTmp); $this->Viewer_AssignAjax('sText', $oViewer->Fetch("component@poll.modal.create")); } protected function EventPollModalUpdate() { if (!$this->oUserCurrent) { return $this->EventErrorDebug(); } if (!$oPoll = $this->Poll_GetPollById(getRequestStr('id'))) { return $this->EventErrorDebug(); } /** * Проверяем корректность target'а */ if ($oPoll->getTargetId()) { if (!$this->Poll_CheckTarget($oPoll->getTargetType(), $oPoll->getTargetId())) { return $this->EventErrorDebug(); } } else { if (!$this->Poll_IsAllowTargetType($oPoll->getTargetType()) or $oPoll->getTargetTmp() != getRequestStr('target_tmp')) { return $this->EventErrorDebug(); } } $oViewer = $this->Viewer_GetLocalViewer(); $oViewer->Assign('poll', $oPoll); $oViewer->Assign('sTargetTmp', getRequestStr('target_tmp')); $this->Viewer_AssignAjax('sText', $oViewer->Fetch("component@poll.modal.create")); } /** * Отображение каптчи */ protected function EventCaptcha() { $this->Viewer_SetResponseAjax(null); /** * Подключаем каптчу */ require_once(Config::Get('path.framework.libs_vendor.server') . '/kcaptcha/kcaptcha.php'); /** * Определяем уникальное название (возможность нескольких каптч на одной странице) */ $sName = ''; if (isset($_GET['name']) and is_string($_GET['name']) and $_GET['name']) { $sName = $_GET['name']; } /** * Генерируем каптчу и сохраняем код в сессию */ $oCaptcha = new KCAPTCHA(); $this->Session_Set('captcha_keystring' . ($sName ? '_' . $sName : ''), $oCaptcha->getKeyString()); $this->SetTemplate(false); } /** * Ajax валидация каптчи * * @apiParam {String} name Уникальное название каптчи * @apiParam {String} captcha Значение каптчи для проверки */ protected function EventCaptchaValidate() { $sName = isset($_REQUEST['name']) ? $_REQUEST['name'] : ''; $sValue = isset($_REQUEST['captcha']) ? $_REQUEST['captcha'] : ''; $sCaptchaValidateType = func_camelize('captcha_' . Config::Get('sys.captcha.type')); if (!$this->Validate_Validate($sCaptchaValidateType, $sValue, array('name' => $sName))) { $aErrors = $this->Validate_GetErrors(); $this->Viewer_AssignAjax('errors', array('captcha' => array(reset($aErrors)))); } } protected function EventPropertyTagsAutocompleter() { /** * Первые буквы тега переданы? */ if (!($sValue = getRequest('value', null, 'post')) or !is_string($sValue)) { return; } $aItems = array(); /** * Формируем список тегов */ $aTags = $this->Property_GetPropertyTagsByLike($sValue, getRequestStr('property_id'), 10); foreach ($aTags as $oTag) { $aItems[] = $oTag->getText(); } /** * Передаем результат в ajax ответ */ $this->Viewer_AssignAjax('aItems', $aItems); } protected function EventMediaUploadLink() { /** * Пользователь авторизован? */ if (!$this->oUserCurrent) { $this->Message_AddErrorSingle($this->Lang_Get('common.error.need_authorization'), $this->Lang_Get('common.error.error')); return; } /** * URL передали? */ if (!($sUrl = getRequestStr('url'))) { return $this->EventErrorDebug(); } /** * Необходимо выполнить загрузку файла */ if (getRequest('upload')) { /** * Проверяем корректность target'а */ $sTargetType = getRequestStr('target_type'); $sTargetId = getRequestStr('target_id'); $sTargetTmp = $this->Session_GetCookie('media_target_tmp_' . $sTargetType) ? $this->Session_GetCookie('media_target_tmp_' . $sTargetType) : getRequestStr('target_tmp'); if ($sTargetId) { $sTargetTmp = null; if (true !== $res = $this->Media_CheckTarget($sTargetType, $sTargetId, ModuleMedia::TYPE_CHECK_ALLOW_ADD, array('user' => $this->oUserCurrent)) ) { $this->Message_AddError(is_string($res) ? $res : $this->Lang_Get('common.error.system.base'), $this->Lang_Get('common.error.error')); return false; } } else { $sTargetId = null; if (!$sTargetTmp) { return $this->EventErrorDebug(); } if (true !== $res = $this->Media_CheckTarget($sTargetType, null, ModuleMedia::TYPE_CHECK_ALLOW_ADD, array('user' => $this->oUserCurrent), $sTargetTmp) ) { $this->Message_AddError(is_string($res) ? $res : $this->Lang_Get('common.error.system.base'), $this->Lang_Get('common.error.error')); return false; } } /** * Выполняем загрузку файла */ if ($mResult = $this->Media_UploadUrl($sUrl, $sTargetType, $sTargetId, $sTargetTmp) and is_object($mResult) ) { $aParams = array( 'align' => getRequestStr('align'), 'title' => getRequestStr('title') ); $this->Viewer_AssignAjax('sText', $this->Media_BuildCodeForEditor($mResult, $aParams)); } else { $this->Message_AddError(is_string($mResult) ? $mResult : $this->Lang_Get('common.error.system.base'), $this->Lang_Get('common.error.error')); } } else { /** * Формируем параметры для билдера HTML */ $aParams = array( 'align' => getRequestStr('align'), 'title' => getRequestStr('title'), 'image_url' => $sUrl ); $this->Viewer_AssignAjax('sText', $this->Media_BuildImageCodeForEditor($aParams)); } } protected function EventMediaSaveDataFile() { /** * Пользователь авторизован? */ if (!$this->oUserCurrent) { $this->Message_AddErrorSingle($this->Lang_Get('common.error.need_authorization'), $this->Lang_Get('common.error.error')); return; } $aAllowData = array('title'); $sName = getRequestStr('name'); $sValue = getRequestStr('value'); if (!in_array($sName, $aAllowData)) { return $this->EventErrorDebug(); } $sId = getRequestStr('id'); if (!$oMedia = $this->Media_GetMediaById($sId)) { return $this->EventErrorDebug(); } if (true === $res = $this->Media_CheckTarget($oMedia->getTargetType(), null, ModuleMedia::TYPE_CHECK_ALLOW_UPDATE, array('media' => $oMedia, 'user' => $this->oUserCurrent)) ) { $oMedia->setDataOne($sName, $sValue); $oMedia->Update(); } else { $this->Message_AddErrorSingle(is_string($res) ? $res : $this->Lang_Get('common.error.system.base')); } } protected function EventMediaRemoveFile() { /** * Пользователь авторизован? */ if (!$this->oUserCurrent) { $this->Message_AddErrorSingle($this->Lang_Get('common.error.need_authorization'), $this->Lang_Get('common.error.error')); return; } $sId = getRequestStr('id'); if (!$oMedia = $this->Media_GetMediaById($sId)) { return $this->EventErrorDebug(); } if (true === $res = $this->Media_CheckTarget($oMedia->getTargetType(), null, ModuleMedia::TYPE_CHECK_ALLOW_REMOVE, array('media' => $oMedia, 'user' => $this->oUserCurrent)) ) { $oMedia->Delete(); } else { $this->Message_AddErrorSingle(is_string($res) ? $res : $this->Lang_Get('common.error.system.base')); } } protected function EventMediaCreatePreviewFile() { /** * Пользователь авторизован? */ if (!$this->oUserCurrent) { $this->Message_AddErrorSingle($this->Lang_Get('common.error.need_authorization'), $this->Lang_Get('common.error.error')); return; } $sId = getRequestStr('id'); if (!$oMedia = $this->Media_GetMediaById($sId)) { return $this->EventErrorDebug(); } $sTargetType = getRequestStr('target_type'); $sTargetId = getRequestStr('target_id') ?: null; $sTargetTmp = getRequestStr('target_tmp') ?: null; /** * Доступ к файлу медиа */ if (!$this->Media_GetAllowMediaItemsById(array($oMedia->getId()))) { return $this->EventErrorDebug(); } /** * Проверяем доступ к этому объекту медиа */ if (true !== $res = $this->Media_CheckTarget($sTargetType, $sTargetId, ModuleMedia::TYPE_CHECK_ALLOW_PREVIEW, array('media' => $oMedia, 'user' => $this->oUserCurrent)) ) { $this->Message_AddErrorSingle(is_string($res) ? $res : $this->Lang_Get('common.error.system.base')); } /** * Получаем объект связи */ $aFilter = array('media_id' => $oMedia->getId(), 'target_type' => $sTargetType); if ($sTargetTmp) { $aFilter['target_tmp'] = $sTargetTmp; } else { $aFilter['target_id'] = $sTargetId; } if (!$oTarget = $this->Media_GetTargetByFilter($aFilter)) { /** * Попытка добавить в качестве превью ранее загруженный файл для другого объекта * Делаем новую связь медиа с текущим объектом */ if (!($oTarget = $this->Media_AttachMediaToTarget($oMedia, $sTargetType, $sTargetId, $sTargetTmp))) { return $this->EventErrorDebug(); } } /** * Удаляем все текущие превью */ $this->Media_RemoveAllPreviewByTarget($oTarget->getTargetType(), $oTarget->getTargetId(), $oTarget->getTargetTmp()); if (true === $res2 = $this->Media_CreateFilePreview($oMedia, $oTarget)) { $this->Viewer_AssignAjax('bUnsetOther', true); } else { $this->Message_AddErrorSingle(is_string($res2) ? $res2 : $this->Lang_Get('common.error.system.base')); } } protected function EventMediaRemovePreviewFile() { /** * Пользователь авторизован? */ if (!$this->oUserCurrent) { $this->Message_AddErrorSingle($this->Lang_Get('common.error.need_authorization'), $this->Lang_Get('common.error.error')); return; } $sId = getRequestStr('id'); if (!$oMedia = $this->Media_GetMediaById($sId)) { return $this->EventErrorDebug(); } $sTargetType = getRequestStr('target_type'); $sTargetId = getRequestStr('target_id'); $sTargetTmp = getRequestStr('target_tmp'); /** * Получаем объект связи */ $aFilter = array('media_id' => $oMedia->getId(), 'target_type' => $sTargetType); if ($sTargetTmp) { $aFilter['target_tmp'] = $sTargetTmp; } else { $aFilter['target_id'] = $sTargetId; } if (!$oTarget = $this->Media_GetTargetByFilter($aFilter)) { return $this->EventErrorDebug(); } if (!$oTarget->getIsPreview()) { return $this->EventErrorDebug(); } /** * Проверяем доступ к этому медиа */ if (true === $res = $this->Media_CheckTarget($oTarget->getTargetType(), $oTarget->getTargetId(), ModuleMedia::TYPE_CHECK_ALLOW_PREVIEW, array('media' => $oMedia, 'user' => $this->oUserCurrent)) ) { /** * Удаляем превью */ $this->Media_RemoveFilePreview($oMedia, $oTarget); } else { $this->Message_AddErrorSingle(is_string($res) ? $res : $this->Lang_Get('common.error.system.base')); } } protected function EventMediaLoadGallery() { /** * Пользователь авторизован? */ if (!$this->oUserCurrent) { $this->Message_AddErrorSingle($this->Lang_Get('common.error.need_authorization'), $this->Lang_Get('common.error.error')); return; } $sType = getRequestStr('target_type'); $sId = getRequestStr('target_id'); $sTmp = getRequestStr('target_tmp'); $iPage = (int)getRequestStr('page'); $iPage = $iPage < 1 ? 1 : $iPage; $aMediaItems = array(); if ($sType) { /** * Получаем медиа для конкретного объекта */ if ($sId) { if (!$this->Media_CheckTarget($sType, $sId, ModuleMedia::TYPE_CHECK_ALLOW_VIEW_LIST)) { $this->Message_AddErrorSingle($this->Lang_Get('common.error.not_access'), $this->Lang_Get('common.error.error')); return; } $aMediaItems = $this->Media_GetMediaByTarget($sType, $sId); } elseif ($sTmp) { $aMediaItems = $this->Media_GetMediaByTargetTmp($sTmp, $this->oUserCurrent->getId()); } } else { /** * Получаем все медиа, созданные пользователем без учета временных */ $aResult = $this->Media_GetMediaItemsByFilter(array( 'user_id' => $this->oUserCurrent->getId(), 'mt.target_tmp' => null, '#page' => array($iPage, 20), '#join' => array( 'LEFT JOIN ' . Config::Get('db.table.media_target') . ' mt ON ( t.id = mt.media_id and mt.target_tmp IS NOT NULL ) ' => array(), ), '#group' => 'id', '#order' => array('id' => 'desc') )); $aPaging = $this->Viewer_MakePaging($aResult['count'], $iPage, 20, Config::Get('pagination.pages.count'), null); $aMediaItems = $aResult['collection']; $this->Viewer_AssignAjax('pagination', $aPaging); } $oViewer = $this->Viewer_GetLocalViewer(); $sTemplate = ''; foreach ($aMediaItems as $oMediaItem) { $oViewer->Assign('oMediaItem', $oMediaItem); $sTemplate .= $oViewer->Fetch('component@uploader.file'); } $this->Viewer_AssignAjax('html', $sTemplate); $this->Viewer_AssignAjax('count_loaded', count($aMediaItems)); $this->Viewer_AssignAjax('page', count($aMediaItems) > 0 ? $iPage + 1 : $iPage); } protected function EventMediaLoadPreviewItems() { /** * Пользователь авторизован? */ if (!$this->oUserCurrent) { $this->Message_AddErrorSingle($this->Lang_Get('common.error.need_authorization'), $this->Lang_Get('common.error.error')); return; } $sType = getRequestStr('target_type'); $sId = getRequestStr('target_id'); $sTmp = getRequestStr('target_tmp'); $aFilter = array( 'target_type' => $sType, 'is_preview' => 1, ); if ($sId) { $aFilter['target_id'] = $sId; } else { $aFilter['target_tmp'] = $sTmp; } $aTargetItems = $this->Media_GetTargetItemsByFilter($aFilter); $oViewer = $this->Viewer_GetLocalViewer(); $oViewer->Assign('imagePreviewItems', $aTargetItems); $this->Viewer_AssignAjax('sTemplatePreview', $oViewer->Fetch('component@field.image-ajax-items')); } protected function EventMediaSubmitInsert() { $aIds = array(0); foreach ((array)getRequest('ids') as $iId) { $aIds[] = (int)$iId; } if (!($aMediaItems = $this->Media_GetAllowMediaItemsById($aIds))) { $this->Message_AddError($this->Lang_Get('media.error.need_choose_items')); return false; } $aParams = array( 'align' => getRequestStr('align'), 'size' => getRequestStr('size'), 'relative_web' => true ); /** * Если изображений несколько, то генерируем идентификатор группы для лайтбокса */ if (count($aMediaItems) > 1) { $aParams['lbx_group'] = rand(1, 100); } $sTextResult = ''; foreach ($aMediaItems as $oMedia) { $sTextResult .= $this->Media_BuildCodeForEditor($oMedia, $aParams) . "\r\n"; } $this->Viewer_AssignAjax('sTextResult', $sTextResult); } protected function EventMediaSubmitCreatePhotoset() { $aMediaItems = $this->Media_GetAllowMediaItemsById(getRequest('ids')); if (!$aMediaItems) { $this->Message_AddError($this->Lang_Get('media.error.need_choose_items')); return false; } $aItems = array(); foreach ($aMediaItems as $oMedia) { $aItems[] = $oMedia->getId(); } $sTextResult = 'Viewer_AssignAjax('sTextResult', $sTextResult); } protected function EventMediaGenerateTargetTmp() { $sType = getRequestStr('type'); if ($this->Media_IsAllowTargetType($sType)) { $sTmp = func_generator(); $this->Session_SetCookie('media_target_tmp_' . $sType, $sTmp, time() + 24 * 3600); $this->Viewer_AssignAjax('sTmpKey', $sTmp); } } protected function EventMediaUpload() { if (getRequest('is_iframe')) { $this->Viewer_SetResponseAjax('jsonIframe', false); } else { $this->Viewer_SetResponseAjax('json'); } /** * Пользователь авторизован? */ if (!$this->oUserCurrent) { $this->Message_AddErrorSingle($this->Lang_Get('common.error.need_authorization'), $this->Lang_Get('common.error.error')); return; } /** * Файл был загружен? */ if (!isset($_FILES['filedata']['tmp_name'])) { return $this->EventErrorDebug(); } /** * Проверяем корректность target'а */ $sTargetType = getRequestStr('target_type'); $sTargetId = getRequestStr('target_id'); $sTargetTmp = $this->Session_GetCookie('media_target_tmp_' . $sTargetType) ? $this->Session_GetCookie('media_target_tmp_' . $sTargetType) : getRequestStr('target_tmp'); if ($sTargetId) { $sTargetTmp = null; if (true !== $res = $this->Media_CheckTarget($sTargetType, $sTargetId, ModuleMedia::TYPE_CHECK_ALLOW_ADD, array('user' => $this->oUserCurrent)) ) { $this->Message_AddError(is_string($res) ? $res : $this->Lang_Get('common.error.system.base'), $this->Lang_Get('common.error.error')); return false; } } else { $sTargetId = null; if (!$sTargetTmp) { return $this->EventErrorDebug(); } if (true !== $res = $this->Media_CheckTarget($sTargetType, null, ModuleMedia::TYPE_CHECK_ALLOW_ADD, array('user' => $this->oUserCurrent), $sTargetTmp) ) { $this->Message_AddError(is_string($res) ? $res : $this->Lang_Get('common.error.system.base'), $this->Lang_Get('common.error.error')); return false; } } /** * TODO: необходима проверка на максимальное общее количество файлов, на максимальный размер файла * Эти настройки можно хранить в конфиге: module.media.type.topic.max_file_count=30 и т.п. */ /** * Выполняем загрузку файла */ if ($mResult = $this->Media_Upload($_FILES['filedata'], $sTargetType, $sTargetId, $sTargetTmp) and is_object($mResult) ) { $oViewer = $this->Viewer_GetLocalViewer(); $oViewer->Assign('oMediaItem', $mResult); $sTemplateFile = $oViewer->Fetch('component@uploader.file'); $this->Viewer_AssignAjax('sTemplateFile', $sTemplateFile); } else { $this->Message_AddError(is_string($mResult) ? $mResult : $this->Lang_Get('common.error.system.base'), $this->Lang_Get('common.error.error')); } } /** * Получение информации о голосовании за топик */ protected function EventVoteGetInfoTopic() { if (!($oTopic = $this->Topic_GetTopicById(getRequestStr('iTargetId', null, 'post')))) { return $this->EventErrorDebug(); } if (!$oTopic->getVote() && ($this->oUserCurrent && $oTopic->getUserId() != $this->oUserCurrent->getId()) && (strtotime($oTopic->getDatePublish()) + Config::Get('acl.vote.topic.limit_time') > time())) { return $this->EventErrorDebug(); } $oViewer = $this->Viewer_GetLocalViewer(); $oViewer->Assign('target', $oTopic, true); $oViewer->Assign('oUserCurrent', $this->oUserCurrent); $this->Viewer_AssignAjax('sText', $oViewer->Fetch("component@vote.info")); } /** * Получение списка регионов по стране */ protected function EventGeoGetRegions() { $iCountryId = getRequestStr('country'); $iLimit = 200; if (is_numeric(getRequest('limit')) and getRequest('limit') > 0) { $iLimit = getRequest('limit'); } /** * Находим страну */ if (!($oCountry = $this->Geo_GetGeoObject('country', $iCountryId))) { return $this->EventErrorDebug(); } /** * Получаем список регионов */ if ($sTargetType = getRequestStr('target_type') and $this->Geo_IsAllowTargetType($sTargetType)) { $aRegions = $this->Geo_GetRegionsUsedByTargetType($oCountry->getId(), $sTargetType); } else { $aRegions = $this->Geo_GetRegions(array('country_id' => $oCountry->getId()), array('sort' => 'asc'), 1, $iLimit); $aRegions = $aRegions['collection']; } /** * Формируем ответ */ $aReturn = array(); foreach ($aRegions as $oObject) { $aReturn[] = array( 'id' => $oObject->getId(), 'name' => $oObject->getName(), ); } /** * Устанавливаем переменные для ajax ответа */ $this->Viewer_AssignAjax('aRegions', $aReturn); } /** * Получение списка городов по региону */ protected function EventGeoGetCities() { $iRegionId = getRequestStr('region'); $iLimit = 500; if (is_numeric(getRequest('limit')) and getRequest('limit') > 0) { $iLimit = getRequest('limit'); } /** * Находим регион */ if (!($oRegion = $this->Geo_GetGeoObject('region', $iRegionId))) { return $this->EventErrorDebug(); } /** * Получаем города */ if ($sTargetType = getRequestStr('target_type') and $this->Geo_IsAllowTargetType($sTargetType)) { $aCities = $this->Geo_GetCitiesUsedByTargetType($oRegion->getId(), $sTargetType); } else { $aCities = $this->Geo_GetCities(array('region_id' => $oRegion->getId()), array('sort' => 'asc'), 1, $iLimit); $aCities = $aCities['collection']; } /** * Формируем ответ */ $aReturn = array(); foreach ($aCities as $oObject) { $aReturn[] = array( 'id' => $oObject->getId(), 'name' => $oObject->getName(), ); } /** * Устанавливаем переменные для ajax ответа */ $this->Viewer_AssignAjax('aCities', $aReturn); } /** * Голосование за комментарий * */ protected function EventVoteComment() { /** * Пользователь авторизован? */ if (!$this->oUserCurrent) { $this->Message_AddErrorSingle($this->Lang_Get('common.error.need_authorization'), $this->Lang_Get('common.error.error')); return; } /** * Комментарий существует? */ if (!($oComment = $this->Comment_GetCommentById(getRequestStr('iTargetId', null, 'post')))) { return $this->EventErrorDebug(); } /** * Проверка типа комментария */ if (!in_array($oComment->getTargetType(), (array)Config::Get('module.comment.vote_target_allow'))) { return $this->EventErrorDebug(); } if ($oComment->getTargetType() == 'topic') { /** * Проверяем права на просмотр топика */ if (!$this->ACL_IsAllowShowTopic($oComment->getTarget(), $this->oUserCurrent)) { return parent::EventNotFound(); } } /** * Пользователь имеет право голоса? */ if (!$this->ACL_CanVoteComment($this->oUserCurrent, $oComment)) { $this->Message_AddErrorSingle($this->Rbac_GetMsgLast()); return; } /** * Как именно голосует пользователь */ $iValue = getRequestStr('value', null, 'post'); if (!in_array($iValue, array('1', '-1'))) { return $this->EventErrorDebug(); } /** * Голосуем */ $oTopicCommentVote = Engine::GetEntity('Vote'); $oTopicCommentVote->setTargetId($oComment->getId()); $oTopicCommentVote->setTargetType('comment'); $oTopicCommentVote->setVoterId($this->oUserCurrent->getId()); $oTopicCommentVote->setDirection($iValue); $oTopicCommentVote->setDate(date("Y-m-d H:i:s")); $iVal = (float)$this->Rating_VoteComment($this->oUserCurrent, $oComment, $iValue); $oTopicCommentVote->setValue($iVal); $oComment->setCountVote($oComment->getCountVote() + 1); $this->Hook_Run("vote_{$oTopicCommentVote->getTargetType()}_before", array('oTarget' => $oComment, 'oVote' => $oTopicCommentVote, 'iValue' => $iValue)); if ($this->Vote_AddVote($oTopicCommentVote) and $this->Comment_UpdateComment($oComment)) { $this->Hook_Run("vote_{$oTopicCommentVote->getTargetType()}_after", array('oTarget' => $oComment, 'oVote' => $oTopicCommentVote, 'iValue' => $iValue)); $this->Message_AddNoticeSingle($this->Lang_Get('vote.notices.success'), $this->Lang_Get('common.attention')); $this->Viewer_AssignAjax('iRating', $oComment->getRating()); /** * Добавляем событие в ленту */ $this->Stream_Write($oTopicCommentVote->getVoterId(), 'vote_comment_' . $oComment->getTargetType(), $oComment->getId()); } else { return $this->EventErrorDebug(); } } /** * Голосование за топик * */ protected function EventVoteTopic() { /** * Пользователь авторизован? */ if (!$this->oUserCurrent) { $this->Message_AddErrorSingle($this->Lang_Get('common.error.need_authorization'), $this->Lang_Get('common.error.error')); return; } /** * Топик существует? */ if (!($oTopic = $this->Topic_GetTopicById(getRequestStr('iTargetId', null, 'post')))) { return $this->EventErrorDebug(); } /** * Проверяем права на просмотр топика */ if (!$this->ACL_IsAllowShowTopic($oTopic, $this->oUserCurrent)) { return parent::EventNotFound(); } /** * Как проголосовал пользователь */ $iValue = getRequestStr('value', null, 'post'); if (!in_array($iValue, array('1', '-1', '0'))) { return $this->EventErrorDebug(); } /** * Права на голосование */ if (!$this->ACL_CanVoteTopic($this->oUserCurrent, $oTopic, $iValue)) { $this->Message_AddErrorSingle($this->Rbac_GetMsgLast()); return; } /** * Голосуем */ $oTopicVote = Engine::GetEntity('Vote'); $oTopicVote->setTargetId($oTopic->getId()); $oTopicVote->setTargetType('topic'); $oTopicVote->setVoterId($this->oUserCurrent->getId()); $oTopicVote->setDirection($iValue); $oTopicVote->setDate(date("Y-m-d H:i:s")); $iVal = 0; if ($iValue != 0) { $iVal = (float)$this->Rating_VoteTopic($this->oUserCurrent, $oTopic, $iValue); } $oTopicVote->setValue($iVal); $oTopic->setCountVote($oTopic->getCountVote() + 1); if ($iValue == 1) { $oTopic->setCountVoteUp($oTopic->getCountVoteUp() + 1); } elseif ($iValue == -1) { $oTopic->setCountVoteDown($oTopic->getCountVoteDown() + 1); } elseif ($iValue == 0) { $oTopic->setCountVoteAbstain($oTopic->getCountVoteAbstain() + 1); } $this->Hook_Run("vote_{$oTopicVote->getTargetType()}_before", array('oTarget' => $oTopic, 'oVote' => $oTopicVote, 'iValue' => $iValue)); if ($this->Vote_AddVote($oTopicVote) and $this->Topic_UpdateTopic($oTopic)) { $this->Hook_Run("vote_{$oTopicVote->getTargetType()}_after", array('oTarget' => $oTopic, 'oVote' => $oTopicVote, 'iValue' => $iValue)); if ($iValue) { $this->Message_AddNoticeSingle($this->Lang_Get('vote.notices.success'), $this->Lang_Get('common.attention')); } else { $this->Message_AddNoticeSingle($this->Lang_Get('vote.notices.success_abstain'), $this->Lang_Get('common.attention')); } $this->Viewer_AssignAjax('iRating', $oTopic->getRating()); /** * Добавляем событие в ленту */ $this->Stream_write($oTopicVote->getVoterId(), 'vote_topic', $oTopic->getId()); } else { $this->Message_AddErrorSingle($this->Lang_Get('common.error.system.base'), $this->Lang_Get('common.error.error')); return; } } /** * Сохраняет теги для избранного * */ protected function EventFavouriteSaveTags() { /** * Пользователь авторизован? */ if (!$this->oUserCurrent) { $this->Message_AddErrorSingle($this->Lang_Get('common.error.need_authorization'), $this->Lang_Get('common.error.error')); return; } /** * Объект уже должен быть в избранном */ if ($oFavourite = $this->Favourite_GetFavourite(getRequestStr('target_id'), getRequestStr('target_type'), $this->oUserCurrent->getId()) ) { /** * Обрабатываем теги */ $aTags = explode(',', trim(getRequestStr('tags'), "\r\n\t\0\x0B .")); $aTagsNew = array(); $aTagsNewLow = array(); $aTagsReturn = array(); foreach ($aTags as $sTag) { $sTag = trim($sTag); if (func_check($sTag, 'text', 2, 50) and !in_array(mb_strtolower($sTag, 'UTF-8'), $aTagsNewLow)) { $sTagEsc = htmlspecialchars($sTag); $aTagsNew[] = $sTag; $aTagsReturn[] = array( 'tag' => $sTagEsc, 'url' => $this->oUserCurrent->getUserWebPath() . 'favourites/' . $oFavourite->getTargetType() . 's/tag/' . $sTagEsc . '/', // костыль для URL с множественным числом ); $aTagsNewLow[] = mb_strtolower($sTag, 'UTF-8'); } } if (!count($aTagsNew)) { $oFavourite->setTags(''); } else { $oFavourite->setTags(join(',', $aTagsNew)); } $this->Viewer_AssignAjax('tags', $aTagsReturn); $this->Favourite_UpdateFavourite($oFavourite); return; } return $this->EventErrorDebug(); } /** * Обработка избранного - топик * */ protected function EventFavouriteTopic() { /** * Пользователь авторизован? */ if (!$this->oUserCurrent) { $this->Message_AddErrorSingle($this->Lang_Get('common.error.need_authorization'), $this->Lang_Get('common.error.error')); return; } /** * Можно только добавить или удалить из избранного */ $iType = getRequestStr('type', null, 'post'); if (!in_array($iType, array('1', '0'))) { return $this->EventErrorDebug(); } /** * Топик существует? */ if (!($oTopic = $this->Topic_GetTopicById(getRequestStr('iTargetId', null, 'post')))) { return $this->EventErrorDebug(); } /** * Есть доступ к комментариям этого топика? Закрытый блог? */ if (!$this->ACL_IsAllowShowBlog($oTopic->getBlog(), $this->oUserCurrent)) { return $this->EventErrorDebug(); } /** * Пропускаем топик из черновиков */ if (!$oTopic->getPublish()) { $this->Message_AddErrorSingle($this->Lang_Get('topic.add.notices.error_favourite_draft'), $this->Lang_Get('common.error.error')); return; } /** * Топик уже в избранном? */ $oFavouriteTopic = $this->Topic_GetFavouriteTopic($oTopic->getId(), $this->oUserCurrent->getId()); if (!$oFavouriteTopic and $iType) { $oFavouriteTopicNew = Engine::GetEntity('Favourite', array( 'target_id' => $oTopic->getId(), 'user_id' => $this->oUserCurrent->getId(), 'target_type' => 'topic', 'target_publish' => $oTopic->getPublish() ) ); $oTopic->setCountFavourite($oTopic->getCountFavourite() + 1); if ($this->Topic_AddFavouriteTopic($oFavouriteTopicNew) and $this->Topic_UpdateTopic($oTopic)) { $this->Message_AddNoticeSingle($this->Lang_Get('favourite.notices.add_success'), $this->Lang_Get('common.attention')); $this->Viewer_AssignAjax('bState', true); $this->Viewer_AssignAjax('iCount', $oTopic->getCountFavourite()); } else { return $this->EventErrorDebug(); } } if (!$oFavouriteTopic and !$iType) { $this->Message_AddErrorSingle($this->Lang_Get('favourite.notices.already_removed'), $this->Lang_Get('common.error.error')); return; } if ($oFavouriteTopic and $iType) { $this->Message_AddErrorSingle($this->Lang_Get('favourite.notices.already_added'), $this->Lang_Get('common.error.error')); return; } if ($oFavouriteTopic and !$iType) { $oTopic->setCountFavourite($oTopic->getCountFavourite() - 1); if ($this->Topic_DeleteFavouriteTopic($oFavouriteTopic) and $this->Topic_UpdateTopic($oTopic)) { $this->Message_AddNoticeSingle($this->Lang_Get('favourite.notices.remove_success'), $this->Lang_Get('common.attention')); $this->Viewer_AssignAjax('bState', false); $this->Viewer_AssignAjax('iCount', $oTopic->getCountFavourite()); } else { return $this->EventErrorDebug(); } } } /** * Обработка избранного - комментарий * */ protected function EventFavouriteComment() { /** * Пользователь авторизован? */ if (!$this->oUserCurrent) { $this->Message_AddErrorSingle($this->Lang_Get('common.error.need_authorization'), $this->Lang_Get('common.error.error')); return; } /** * Можно только добавить или удалить из избранного */ $iType = getRequestStr('type', null, 'post'); if (!in_array($iType, array('1', '0'))) { return $this->EventErrorDebug(); } /** * Комментарий существует? */ if (!($oComment = $this->Comment_GetCommentById(getRequestStr('iTargetId', null, 'post')))) { return $this->EventErrorDebug(); } /** * Есть права? */ if (!$this->ACL_IsAllowFavouriteComment($oComment, $this->oUserCurrent)) { $this->Message_AddErrorSingle($this->Rbac_GetMsgLast()); return; } /** * Комментарий уже в избранном? */ $oFavouriteComment = $this->Comment_GetFavouriteComment($oComment->getId(), $this->oUserCurrent->getId()); if (!$oFavouriteComment and $iType) { $oFavouriteCommentNew = Engine::GetEntity('Favourite', array( 'target_id' => $oComment->getId(), 'target_type' => 'comment', 'user_id' => $this->oUserCurrent->getId(), 'target_publish' => $oComment->getPublish() ) ); $oComment->setCountFavourite($oComment->getCountFavourite() + 1); if ($this->Comment_AddFavouriteComment($oFavouriteCommentNew) and $this->Comment_UpdateComment($oComment)) { $this->Message_AddNoticeSingle($this->Lang_Get('favourite.notices.add_success'), $this->Lang_Get('common.attention')); $this->Viewer_AssignAjax('bState', true); $this->Viewer_AssignAjax('iCount', $oComment->getCountFavourite()); } else { return $this->EventErrorDebug(); } } if (!$oFavouriteComment and !$iType) { return $this->EventErrorDebug(); } if ($oFavouriteComment and $iType) { return $this->EventErrorDebug(); } if ($oFavouriteComment and !$iType) { $oComment->setCountFavourite($oComment->getCountFavourite() - 1); if ($this->Comment_DeleteFavouriteComment($oFavouriteComment) and $this->Comment_UpdateComment($oComment)) { $this->Message_AddNoticeSingle($this->Lang_Get('favourite.notices.remove_success'), $this->Lang_Get('common.attention')); $this->Viewer_AssignAjax('bState', false); $this->Viewer_AssignAjax('iCount', $oComment->getCountFavourite()); } else { return $this->EventErrorDebug(); } } } /** * Обработка избранного - личное сообщение * */ protected function EventFavouriteTalk() { /** * Пользователь авторизован? */ if (!$this->oUserCurrent) { $this->Message_AddErrorSingle($this->Lang_Get('common.error.need_authorization'), $this->Lang_Get('common.error.error')); return; } /** * Можно только добавить или удалить из избранного */ $iType = getRequestStr('type', null, 'post'); if (!in_array($iType, array('1', '0'))) { return $this->EventErrorDebug(); } /** * Сообщение существует? */ if (!($oTalk = $this->Talk_GetTalkById(getRequestStr('iTargetId', null, 'post')))) { return $this->EventErrorDebug(); } /** * Есть доступ? */ if (!($oTalkUser = $this->Talk_GetTalkUser($oTalk->getId(), $this->oUserCurrent->getId()))) { return $this->EventErrorDebug(); } /** * Сообщение уже в избранном? */ $oFavouriteTalk = $this->Talk_GetFavouriteTalk($oTalk->getId(), $this->oUserCurrent->getId()); if (!$oFavouriteTalk and $iType) { $oFavouriteTalkNew = Engine::GetEntity('Favourite', array( 'target_id' => $oTalk->getId(), 'target_type' => 'talk', 'user_id' => $this->oUserCurrent->getId(), 'target_publish' => '1' ) ); if ($this->Talk_AddFavouriteTalk($oFavouriteTalkNew)) { $this->Message_AddNoticeSingle($this->Lang_Get('favourite.notices.add_success'), $this->Lang_Get('common.attention')); $this->Viewer_AssignAjax('bState', true); } else { return $this->EventErrorDebug(); } } // Этого письма нет в вашем избранном if (!$oFavouriteTalk and !$iType) { return $this->EventErrorDebug(); } // Это письмо уже есть в вашем избранном if ($oFavouriteTalk and $iType) { return $this->EventErrorDebug(); } if ($oFavouriteTalk and !$iType) { if ($this->Talk_DeleteFavouriteTalk($oFavouriteTalk)) { $this->Message_AddNoticeSingle($this->Lang_Get('favourite.notices.remove_success'), $this->Lang_Get('common.attention')); $this->Viewer_AssignAjax('bState', false); } else { return $this->EventErrorDebug(); } } } /** * Обработка получения последних комментов * Используется в блоке "Прямой эфир" * */ protected function EventStreamComment() { if ($aComments = $this->Comment_GetCommentsOnline('topic', Config::Get('block.stream.row'))) { $oViewer = $this->Viewer_GetLocalViewer(); $oViewer->Assign('comments', $aComments, true); $sTextResult = $oViewer->Fetch("component@activity.recent-comments"); $this->Viewer_AssignAjax('sText', $sTextResult); } else { $this->Message_AddErrorSingle($this->Lang_Get('activity.block_recent.comments_empty'), $this->Lang_Get('common.attention')); return; } } /** * Обработка получения последних топиков * Используется в блоке "Прямой эфир" * */ protected function EventStreamTopic() { if ($oTopics = $this->Topic_GetTopicsLast(Config::Get('block.stream.row'))) { $oViewer = $this->Viewer_GetLocalViewer(); $oViewer->Assign('topics', $oTopics, true); $sTextResult = $oViewer->Fetch("component@activity.recent-topics"); $this->Viewer_AssignAjax('sText', $sTextResult); } else { $this->Message_AddErrorSingle($this->Lang_Get('activity.block_recent.topics_empty'), $this->Lang_Get('common.attention')); return; } } /** * Обработка получения TOP блогов * Используется в блоке "TOP блогов" * */ protected function EventBlogsTop() { /** * Получаем список блогов и формируем ответ */ if ($aResult = $this->Blog_GetBlogsRating(1, Config::Get('block.blogs.row'))) { $aBlogs = $aResult['collection']; $oViewer = $this->Viewer_GetLocalViewer(); $oViewer->Assign('aBlogs', $aBlogs); $sTextResult = $oViewer->Fetch("component@blog.top"); $this->Viewer_AssignAjax('sText', $sTextResult); } else { $this->Message_AddErrorSingle($this->Lang_Get('common.error.system.base'), $this->Lang_Get('common.error.error')); return; } } /** * Обработка получения своих блогов * Используется в блоке "TOP блогов" * */ protected function EventBlogsSelf() { /** * Пользователь авторизован? */ if (!$this->oUserCurrent) { $this->Message_AddErrorSingle($this->Lang_Get('common.error.need_authorization'), $this->Lang_Get('common.error.error')); return; } /** * Получаем список блогов и формируем ответ */ if ($aBlogs = $this->Blog_GetBlogsRatingSelf($this->oUserCurrent->getId(), Config::Get('block.blogs.row'))) { $oViewer = $this->Viewer_GetLocalViewer(); $oViewer->Assign('aBlogs', $aBlogs); $sTextResult = $oViewer->Fetch("component@blog.top"); $this->Viewer_AssignAjax('sText', $sTextResult); } else { $this->Message_AddErrorSingle($this->Lang_Get('blog.blocks.blogs.self_empty'), $this->Lang_Get('common.attention')); return; } } /** * Обработка получения подключенных блогов * Используется в блоке "TOP блогов" * */ protected function EventBlogsJoin() { /** * Пользователь авторизован? */ if (!$this->oUserCurrent) { $this->Message_AddErrorSingle($this->Lang_Get('common.error.need_authorization'), $this->Lang_Get('common.error.error')); return; } /** * Получаем список блогов и формируем ответ */ if ($aBlogs = $this->Blog_GetBlogsRatingJoin($this->oUserCurrent->getId(), Config::Get('block.blogs.row'))) { $oViewer = $this->Viewer_GetLocalViewer(); $oViewer->Assign('aBlogs', $aBlogs); $sTextResult = $oViewer->Fetch("component@blog.top"); $this->Viewer_AssignAjax('sText', $sTextResult); } else { $this->Message_AddErrorSingle($this->Lang_Get('blog.blocks.blogs.joined_empty'), $this->Lang_Get('common.attention')); return; } } /** * Загружает список блогов конкретной категории */ protected function EventBlogsGetByCategory() { if (!($oCategory = $this->Category_GetCategoryById(getRequestStr('id')))) { return $this->EventErrorDebug(); } /** * Список ID блогов по категории */ $aBlogIds = $this->Blog_GetTargetIdsByCategory($oCategory, 1, 1000, true); /** * Формируем фильтр для получения списка блогов */ $aFilter = array( 'exclude_type' => 'personal', 'id' => $aBlogIds ? $aBlogIds : array(0) ); /** * Получаем список блогов(все по фильтру) */ $aResult = $this->Blog_GetBlogsByFilter($aFilter, array('blog_title' => 'asc'), 1, PHP_INT_MAX); $aBlogs = $aResult['collection']; /** * Получаем список блогов и формируем ответ */ if ($aBlogs) { $aResult = array(); foreach ($aBlogs as $oBlog) { $aResult[] = array( 'id' => $oBlog->getId(), 'title' => htmlspecialchars($oBlog->getTitle()), 'type' => $oBlog->getType(), 'rating' => $oBlog->getRating(), 'url' => $oBlog->getUrl(), 'url_full' => $oBlog->getUrlFull(), ); } $this->Viewer_AssignAjax('aBlogs', $aResult); } else { $this->Message_AddErrorSingle($this->Lang_Get('blog.blocks.navigator.empty'), $this->Lang_Get('common.attention')); return; } } /** * Предпросмотр текста * */ protected function EventPreviewText() { $sText = getRequestStr('text', null, 'post'); $bSave = getRequest('save', null, 'post'); /** * Экранировать или нет HTML теги */ if ($bSave) { $sTextResult = htmlspecialchars($sText); } else { $sTextResult = $this->Text_Parser($sText); } /** * Передаем результат в ajax ответ */ $this->Viewer_AssignAjax('sText', $sTextResult); } /** * Автоподставновка тегов * */ protected function EventAutocompleterTag() { /** * Первые буквы тега переданы? */ if (!($sValue = getRequest('value', null, 'post')) or !is_string($sValue)) { return; } $aItems = array(); /** * Формируем список тегов */ $aTags = $this->Topic_GetTopicTagsByLike($sValue, 10); foreach ($aTags as $oTag) { $aItems[] = $oTag->getText(); } /** * Передаем результат в ajax ответ */ $this->Viewer_AssignAjax('aItems', $aItems); } /** * Автоподставновка пользователей * */ protected function EventAutocompleterUser() { /** * Первые буквы логина переданы? */ if (!($sValue = getRequest('value', null, 'post')) or !is_string($sValue)) { return; } $bReturnExtended = getRequest('extended') ?: false; $aItems = array(); /** * Формируем список пользователей */ $aUsers = $this->User_GetUsersByLoginLike($sValue, 10); foreach ($aUsers as $oUser) { if ($bReturnExtended) { $aItems[] = array( 'value' => $oUser->getId(), 'label' => $oUser->getDisplayName(), ); } else { $aItems[] = $oUser->getDisplayName(); } } /** * Передаем результат в ajax ответ */ $this->Viewer_AssignAjax('aItems', $aItems); } /** * Удаление/восстановление комментария * */ protected function EventCommentDelete() { /** * Есть права на удаление комментария? */ if (!$this->ACL_CanDeleteComment($this->oUserCurrent)) { $this->Message_AddErrorSingle($this->Lang_Get('common.error.not_access'), $this->Lang_Get('common.error.error')); return; } /** * Комментарий существует? */ $idComment = getRequestStr('comment_id', null, 'post'); if (!($oComment = $this->Comment_GetCommentById($idComment))) { return $this->EventErrorDebug(); } /** * Устанавливаем пометку о том, что комментарий удален */ $oComment->setDelete(($oComment->getDelete() + 1) % 2); $this->Hook_Run('comment_delete_before', array('oComment' => $oComment)); if (!$this->Comment_UpdateCommentStatus($oComment)) { $this->Message_AddErrorSingle($this->Lang_Get('common.error.system.base'), $this->Lang_Get('common.error.error')); return; } $this->Hook_Run('comment_delete_after', array('oComment' => $oComment)); /** * Формируем текст ответа */ if ($bState = (bool)$oComment->getDelete()) { $sMsg = $this->Lang_Get('common.success.remove'); $sTextToggle = $this->Lang_Get('comments.comment.restore'); } else { $sMsg = $this->Lang_Get('comments.notices.success_restore'); $sTextToggle = $this->Lang_Get('common.remove'); } /** * Обновление события в ленте активности */ $this->Stream_write($oComment->getUserId(), 'add_comment', $oComment->getId(), !$oComment->getDelete()); /** * Показываем сообщение и передаем переменные в ajax ответ */ $this->Message_AddNoticeSingle($sMsg, $this->Lang_Get('common.attention')); $this->Viewer_AssignAjax('state', $bState); $this->Viewer_AssignAjax('toggle_text', $sTextToggle); } /** * Загрузка данных комментария для редактировоания * */ protected function EventCommentLoad() { /** * Комментарий существует? */ $idComment = getRequestStr('comment_id', null, 'post'); if (!($oComment = $this->Comment_GetCommentById($idComment))) { return $this->EventErrorDebug(); } if (!$oComment->isAllowEdit()) { $this->Message_AddErrorSingle($this->Lang_Get('common.error.not_access'), $this->Lang_Get('common.error.error')); return; } $sText = $oComment->getTextSource() ? $oComment->getTextSource() : $oComment->getText(); $this->Viewer_AssignAjax('text', $sText); } /** * Редактирование комментария * */ protected function EventCommentUpdate() { /** * Комментарий существует? */ $idComment = getRequestStr('reply', null, 'post'); if (!($oComment = $this->Comment_GetCommentById($idComment))) { return $this->EventErrorDebug(); } if (!$oComment->isAllowEdit()) { $this->Message_AddErrorSingle($this->Lang_Get('common.error.not_access'), $this->Lang_Get('common.error.error')); return; } $sText = getRequestStr('comment_text'); /** * Проверяем текст комментария */ if (!$this->Validate_Validate('string', $sText, array('min' => 2, 'max' => 10000, 'allowEmpty' => false))) { $this->Message_AddErrorSingle($this->Lang_Get('topic.comments.notices.error_text'), $this->Lang_Get('common.error.error')); return; } $oComment->setText($this->Text_Parser($sText)); $oComment->setTextSource($sText); $oComment->setDateEdit(date('Y-m-d H:i:s')); $oComment->setCountEdit($oComment->getCountEdit() + 1); if ($this->Comment_UpdateComment($oComment)) { $oViewerLocal = $this->Viewer_GetLocalViewer(); $oViewerLocal->Assign('oUserCurrent', $this->oUserCurrent); $oViewerLocal->Assign('oneComment', true, true); $oViewerLocal->Assign('useEdit', true, true); if ($oComment->getTargetType() == 'topic') { $oViewerLocal->Assign('useFavourite', true, true); $oViewerLocal->Assign('useVote', true, true); } $oViewerLocal->Assign('comment', $oComment, true); $sHtml = $oViewerLocal->Fetch($this->Comment_GetTemplateCommentByTarget($oComment->getTargetId(), $oComment->getTargetType())); $this->Viewer_AssignAjax('html', $sHtml); } else { return $this->EventErrorDebug(); } } /** * Проверка корректности профиля */ protected function WallCheckUserProfile() { if (!($this->oUserProfile = $this->User_GetUserById((int)getRequestStr('user_id')))) { return false; } return true; } /** * Добавление записи на стену */ public function EventWallAdd() { $this->Viewer_SetResponseAjax('json'); if (!$this->oUserCurrent) { return $this->EventErrorDebug(); } if (!$this->WallCheckUserProfile()) { return $this->EventErrorDebug(); } // Создаем запись $oWall = Engine::GetEntity('Wall'); $oWall->_setValidateScenario('add'); $oWall->setWallUserId($this->oUserProfile->getId()); $oWall->setUserId($this->oUserCurrent->getId()); $oWall->setText(getRequestStr('text')); $oWall->setPid(getRequestStr('pid')); $this->Hook_Run('wall_add_validate_before', array('oWall' => $oWall)); if ($oWall->_Validate()) { // Экранируем текст и добавляем запись в БД $oWall->setText($this->Text_Parser($oWall->getText())); $this->Hook_Run('wall_add_before', array('oWall' => $oWall)); if ($this->Wall_AddWall($oWall)) { $this->Hook_Run('wall_add_after', array('oWall' => $oWall)); // Отправляем уведомления if ($oWall->getWallUserId() != $oWall->getUserId()) { $this->Wall_SendNotifyWallNew($oWall, $this->oUserCurrent); } if ($oWallParent = $oWall->GetPidWall() and $oWallParent->getUserId() != $oWall->getUserId()) { $this->Wall_SendNotifyWallReply($oWallParent, $oWall, $this->oUserCurrent); } // Добавляем событие в ленту $this->Stream_Write($oWall->getUserId(), 'add_wall', $oWall->getId()); } else { $this->Message_AddError($this->Lang_Get('common.error.add'), $this->Lang_Get('common.error.error')); } } else { $this->Message_AddError($oWall->_getValidateError(), $this->Lang_Get('common.error.error')); } } /** * Удаление записи со стены */ public function EventWallRemove() { $this->Viewer_SetResponseAjax('json'); if (!$this->oUserCurrent) { return $this->EventErrorDebug(); } if (!$this->WallCheckUserProfile()) { return $this->EventErrorDebug(); } // Получаем запись if (!($oWall = $this->Wall_GetWallById(getRequestStr('id')))) { return $this->EventErrorDebug(); } // Если разрешено удаление - удаляем if ($oWall->isAllowDelete()) { $this->Wall_DeleteWall($oWall); return; } return $this->EventErrorDebug(); } /** * Ajax подгрузка сообщений стены */ public function EventWallLoad() { $this->Viewer_SetResponseAjax('json'); if (!$this->WallCheckUserProfile()) { return $this->EventErrorDebug(); } // Формируем фильтр для запроса к БД $aFilter = array( 'wall_user_id' => $this->oUserProfile->getId(), 'pid' => null ); if (is_numeric(getRequest('last_id'))) { $aFilter['id_less'] = getRequest('last_id'); } else { if (is_numeric(getRequest('first_id'))) { $aFilter['id_more'] = getRequest('first_id'); } else { return $this->EventErrorDebug(); } } // Получаем сообщения и формируем ответ $aWall = $this->Wall_GetWall($aFilter, array('id' => 'desc'), 1, Config::Get('module.wall.per_page')); $this->Viewer_Assign('posts', $aWall['collection'], true); $this->Viewer_Assign('oUserCurrent', $this->oUserCurrent); // хак, т.к. к этому моменту текущий юзер не загружен в шаблон $this->Viewer_AssignAjax('html', $this->Viewer_Fetch('component@wall.posts')); $this->Viewer_AssignAjax('count_loaded', count($aWall['collection'])); if (count($aWall['collection'])) { $this->Viewer_AssignAjax('last_id', end($aWall['collection'])->getId()); } } /** * Подгрузка комментариев */ public function EventWallLoadComments() { $this->Viewer_SetResponseAjax('json'); if (!$this->WallCheckUserProfile()) { return $this->EventErrorDebug(); } if (!($oWall = $this->Wall_GetWallById(getRequestStr('target_id'))) or $oWall->getPid()) { return $this->EventErrorDebug(); } // Формируем фильтр для запроса к БД $aFilter = array( 'wall_user_id' => $this->oUserProfile->getId(), 'pid' => $oWall->getId() ); if (is_numeric(getRequest('last_id'))) { $aFilter['id_less'] = getRequest('last_id'); } else { if (is_numeric(getRequest('first_id'))) { $aFilter['id_more'] = getRequest('first_id'); } else { return $this->EventErrorDebug(); } } // Получаем сообщения и формируем ответ // Необходимо вернуть все ответы, но ставим "разумное" ограничение $aWall = $this->Wall_GetWall($aFilter, array('id' => 'asc'), 1, 300); // Передаем переменные $this->Viewer_Assign('comments', $aWall['collection'], true); $this->Viewer_Assign('oUserCurrent', $this->oUserCurrent); // хак, т.к. к этому моменту текущий юзер не загружен в шаблон $this->Viewer_AssignAjax('html', $this->Viewer_Fetch('component@wall.comments')); $this->Viewer_AssignAjax('count_loaded', count($aWall['collection'])); if (count($aWall['collection'])) { $this->Viewer_AssignAjax('last_id', end($aWall['collection'])->getId()); } } }