1
0
Fork 0
mirror of https://github.com/Oreolek/ifhub.club.git synced 2024-06-28 20:45:00 +03:00
ifhub.club/application/classes/actions/ActionAjax.class.php

2121 lines
82 KiB
PHP
Raw Normal View History

<?php
2014-10-08 08:20:29 +03:00
/*
* LiveStreet CMS
* Copyright © 2013 OOO "ЛС-СОФТ"
*
* ------------------------------------------------------
*
* Official site: www.livestreetcms.com
* Contact e-mail: office@livestreetcms.com
*
* GNU General Public License, version 2:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
* ------------------------------------------------------
*
* @link http://www.livestreetcms.com
* @copyright 2013 OOO "ЛС-СОФТ"
* @author Maxim Mzhelskiy <rus.engine@gmail.com>
*
*/
/**
* Экшен обработки ajax запросов
* Ответ отдает в JSON фомате
*
2014-10-08 08:20:29 +03:00
* @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('/^infobox$/i', '/^info$/', '/^blog$/', 'EventInfoboxInfoBlog');
$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();
// Получаем переменные
2015-09-02 12:06:50 +03:00
$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('В этом опросе уже нельзя голосовать');
return;
}
/**
* Пользователь уже голосовал?
*/
if ($this->Poll_CheckUserAlreadyVote($oPoll, $this->oUserCurrent)) {
$this->Message_AddErrorSingle('Вы уже голосовали');
return;
}
$aAnswerIds = array();
$aAnswerItems = array();
if (!getRequest('abstain')) {
/**
* Проверяем варианты ответов
*/
if (!$aAnswer = (array)getRequest('answers')) {
$this->Message_AddErrorSingle('Необходимо выбрать вариант');
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('Максимум можно выбрать вариантов: ' . $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('Этот опрос уже нельзя удалить');
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();
2016-03-01 18:08:01 +02:00
$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,
2015-09-02 12:06:50 +03:00
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());
2015-01-26 13:49:42 +02:00
}
} else {
/**
2016-05-02 14:11:51 +03:00
* Получаем все медиа, созданные пользователем без учета временных
*/
$aResult = $this->Media_GetMediaItemsByFilter(array(
2016-05-02 14:11:51 +03:00
'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;
}
2015-01-26 13:49:42 +02:00
if (!($aMediaItems = $this->Media_GetAllowMediaItemsById($aIds))) {
$this->Message_AddError('Необходимо выбрать элементы');
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('Необходимо выбрать элементы');
return false;
}
$aItems = array();
foreach ($aMediaItems as $oMedia) {
$aItems[] = $oMedia->getId();
}
$sTextResult = '<gallery items="' . join(',', $aItems) . '"';
if (getRequest('use_thumbs')) {
$sTextResult .= ' nav="thumbs" ';
}
if (getRequest('show_caption')) {
$sTextResult .= ' caption="1" ';
}
$sTextResult .= ' />';
$this->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,
2015-09-02 12:06:50 +03:00
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 EventInfoboxInfoBlog()
{
/**
* Если блог существует и он не персональный
*/
if (!is_string(getRequest('iBlogId'))) {
return $this->EventErrorDebug();
}
if (!($oBlog = $this->Blog_GetBlogById(getRequest('iBlogId'))) or $oBlog->getType() == 'personal') {
return $this->EventErrorDebug();
}
/**
* Получаем локальный вьюер для рендеринга шаблона
*/
$oViewer = $this->Viewer_GetLocalViewer();
$oViewer->Assign('oBlog', $oBlog);
if ($oBlog->getType() != 'close' or $oBlog->getUserIsJoin()) {
/**
* Получаем последний топик
*/
$aResult = $this->Topic_GetTopicsByFilter(array('blog_id' => $oBlog->getId(), 'topic_publish' => 1), 1, 1);
$oViewer->Assign('oTopicLast', reset($aResult['collection']));
}
$oViewer->Assign('oUserCurrent', $this->oUserCurrent);
/**
* Устанавливаем переменные для ajax ответа
*/
$this->Viewer_AssignAjax('sText', $oViewer->Fetch("actions/ActionBlogs/popover.blog.info.tpl"));
}
/**
* Получение информации о голосовании за топик
*/
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);
2014-12-25 12:37:38 +02:00
$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;
}
2015-09-02 12:06:50 +03:00
$bReturnExtended = getRequest('extended') ?: false;
$aItems = array();
/**
* Формируем список пользователей
*/
$aUsers = $this->User_GetUsersByLoginLike($sValue, 10);
foreach ($aUsers as $oUser) {
if ($bReturnExtended) {
$aItems[] = array(
'value' => $oUser->getId(),
2016-10-12 13:11:04 +03:00
'label' => $oUser->getDisplayName(),
);
} else {
2016-10-12 13:11:04 +03:00
$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());
}
}
}