/** * Подготовка запроса на поиск * * @return array */ protected function PrepareRequest() { $aReq['q'] = F::GetRequestStr('q'); if (!F::CheckVal($aReq['q'], 'text', 2, 255)) { /* * Если запрос слишком короткий перенаправляем на начальную страницу поиска * Хотя тут лучше показывать юзеру в чем он виноват */ Router::Location(Router::GetPath('search')); } $aReq['sType'] = strtolower(Router::GetActionEvent()); // * Определяем текущую страницу вывода результата $aReq['iPage'] = intval(preg_replace('#^page([1-9]\\d{0,5})$#', '\\1', $this->getParam(0))); if (!$aReq['iPage']) { $aReq['iPage'] = 1; } // * Передача данных в шаблонизатор E::ModuleViewer()->Assign('aReq', $aReq); return $aReq; }
/** * Обработка кода приглашения при включеном режиме инвайтов * */ protected function EventInvite() { if (!Config::Get('general.reg.invite')) { return parent::EventNotFound(); } // Обработка отправки формы с кодом приглашения if (F::isPost('submit_invite')) { // проверяем код приглашения на валидность if ($this->CheckInviteRegister()) { $sInviteCode = $this->GetInviteRegister(); } else { $sInviteCode = trim(F::GetRequestStr('invite_code')); } $oInvite = E::ModuleUser()->GetInviteByCode($sInviteCode); if ($oInvite) { if (!$this->CheckInviteRegister()) { E::ModuleSession()->Set('invite_code', $oInvite->getCode()); } return R::Action('registration'); } else { E::ModuleMessage()->AddError(E::ModuleLang()->Get('registration_invite_code_error'), E::ModuleLang()->Get('error')); } } }
/** * Удаление/восстановление комментария * */ protected function EventCommentDelete() { // * Комментарий существует? $idComment = F::GetRequestStr('idComment', null, 'post'); if (!($oComment = E::ModuleComment()->GetCommentById($idComment))) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error')); return; } // * Есть права на удаление комментария? if (!$oComment->isDeletable()) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('not_access'), E::ModuleLang()->Get('error')); return; } // * Устанавливаем пометку о том, что комментарий удален $oComment->setDelete(($oComment->getDelete() + 1) % 2); E::ModuleHook()->Run('comment_delete_before', array('oComment' => $oComment)); if (!E::ModuleComment()->UpdateCommentStatus($oComment)) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error')); return; } E::ModuleHook()->Run('comment_delete_after', array('oComment' => $oComment)); // * Формируем текст ответа if ($bState = (bool) $oComment->getDelete()) { $sMsg = E::ModuleLang()->Get('comment_delete_ok'); $sTextToggle = E::ModuleLang()->Get('comment_repair'); } else { $sMsg = E::ModuleLang()->Get('comment_repair_ok'); $sTextToggle = E::ModuleLang()->Get('comment_delete'); } // * Обновление события в ленте активности E::ModuleStream()->Write($oComment->getUserId(), 'add_comment', $oComment->getId(), !$oComment->getDelete()); // * Показываем сообщение и передаем переменные в ajax ответ E::ModuleMessage()->AddNoticeSingle($sMsg, E::ModuleLang()->Get('attention')); E::ModuleViewer()->AssignAjax('bState', $bState); E::ModuleViewer()->AssignAjax('sTextToggle', $sTextToggle); }
/** * Отображение списка персональных блогов */ protected function EventShowBlogsPersonal() { // * По какому полю сортировать $sOrder = F::GetRequestStr('order', 'blog_title'); // * В каком направлении сортировать $sOrderWay = F::GetRequestStr('order_way', 'desc'); // * Фильтр поиска блогов $aFilter = array('include_type' => 'personal'); // * Передан ли номер страницы $iPage = preg_match('/^\\d+$/i', $this->GetParamEventMatch(0, 2)) ? $this->GetParamEventMatch(0, 2) : 1; // * Получаем список блогов $aResult = E::ModuleBlog()->GetBlogsByFilter($aFilter, array($sOrder => $sOrderWay), $iPage, Config::Get('module.blog.per_page')); $aBlogs = $aResult['collection']; // * Формируем постраничность $aPaging = E::ModuleViewer()->MakePaging($aResult['count'], $iPage, Config::Get('module.blog.per_page'), Config::Get('pagination.pages.count'), R::GetPath('blogs') . 'personal/', array('order' => $sOrder, 'order_way' => $sOrderWay)); // * Загружаем переменные в шаблон E::ModuleViewer()->Assign('aPaging', $aPaging); E::ModuleViewer()->Assign('aBlogs', $aBlogs); E::ModuleViewer()->Assign('sBlogOrder', htmlspecialchars($sOrder)); E::ModuleViewer()->Assign('sBlogOrderWay', htmlspecialchars($sOrderWay)); E::ModuleViewer()->Assign('sBlogOrderWayNext', $sOrderWay == 'desc' ? 'asc' : 'desc'); E::ModuleViewer()->Assign('sShow', 'personal'); E::ModuleViewer()->Assign('sBlogsRootPage', R::GetPath('blogs') . 'personal/'); // * Устанавливаем title страницы E::ModuleViewer()->AddHtmlTitle(E::ModuleLang()->Get('blog_menu_all_list')); // * Устанавливаем шаблон вывода $this->SetTemplateAction('index'); }
/** * Отписка от пользователя * */ protected function EventUnsubscribe() { /** * Устанавливаем формат Ajax ответа */ E::ModuleViewer()->SetResponseAjax('json'); /** * Пользователь авторизован? */ if (!$this->oUserCurrent) { parent::EventNotFound(); } /** * Пользователь с таким ID существует? */ if (!E::ModuleUser()->GetUserById(F::GetRequestStr('id'))) { E::ModuleMessage()->AddError(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error')); } /** * Отписываем */ E::ModuleStream()->UnsubscribeUser($this->oUserCurrent->getId(), F::GetRequestStr('id')); E::ModuleMessage()->AddNotice(E::ModuleLang()->Get('stream_subscribes_updated'), E::ModuleLang()->Get('attention')); }
/** * Проверка поля пользователя на корректность из реквеста * * @return bool */ public function checkUserField() { if (!F::GetRequestStr('title')) { E::ModuleMessage()->AddError(E::ModuleLang()->Get('user_field_error_add_no_title'), E::ModuleLang()->Get('error')); return false; } if (!F::GetRequestStr('name')) { E::ModuleMessage()->AddError(E::ModuleLang()->Get('user_field_error_add_no_name'), E::ModuleLang()->Get('error')); return false; } /** * Не допускаем дубликатов по имени */ if (E::ModuleUser()->UserFieldExistsByName(F::GetRequestStr('name'), F::GetRequestStr('id'))) { E::ModuleMessage()->AddError(E::ModuleLang()->Get('user_field_error_name_exists'), E::ModuleLang()->Get('error')); return false; } return true; }
/** * Обработка основного события * */ public function EventIndex() { $sEvent = R::GetActionEvent(); if ((!$sEvent || $sEvent == 'index') && F::GetRequestStr('q', null, 'get')) { $sEvent = 'topics'; } if ($sEvent == 'comments') { return $this->EventComments(); } elseif ($sEvent == 'blogs') { return $this->EventBlogs(); } elseif ($sEvent == 'topics') { return $this->EventTopics(); } else { $this->SetTemplateAction('index'); } }
function getRequestPostStr($sName, $default = null) { return F::GetRequestStr($sName, $default, 'post'); }
/** * Verifies security key from argument or from request * * @param string|null $sKey - Security key for verifying. If it is ommited then it extracts from request * * @return bool */ public function ValidateSecurityKey($sKey = null) { if (!$sKey) { if (isset($_SERVER['HTTP_X_ALTO_AJAX_KEY'])) { $sKey = (string) $_SERVER['HTTP_X_ALTO_AJAX_KEY']; } else { if (!($sKey = F::GetRequestStr('security_key'))) { // LS-compatibility $sKey = F::GetRequestStr('security_ls_key'); } } } return $sKey == $this->GetSecurityKey(); }
/** * Старт сессии * */ protected function Start() { if ($this->bUseStandartSession) { $sSysSessionName = Config::Get('sys.session.name'); session_name($sSysSessionName); session_set_cookie_params(Config::Get('sys.session.timeout'), Config::Get('sys.session.path'), Config::Get('sys.session.host')); if (!session_id()) { // * Попытка подменить идентификатор имени сессии через куку if (isset($_COOKIE[$sSysSessionName])) { if (!is_string($_COOKIE[$sSysSessionName])) { $this->DelCookie($sSysSessionName . '[]'); $this->DelCookie($sSysSessionName); } elseif (!preg_match('/^[\\-\\,a-zA-Z0-9]{1,128}$/', $_COOKIE[$sSysSessionName])) { $this->DelCookie($sSysSessionName); } } // * Попытка подменить идентификатор имени сессии в реквесте $aRequest = array_merge($_GET, $_POST); // Исключаем попадаение $_COOKIE в реквест if (@ini_get('session.use_only_cookies') === '0' && isset($aRequest[$sSysSessionName]) && !is_string($aRequest[$sSysSessionName])) { session_name($this->GenerateId()); } // * Даем возможность флешу задавать id сессии $sSSID = F::GetRequestStr('SSID'); if ($sSSID && $this->_validFlashAgent() && preg_match('/^[\\w]{5,40}$/', $sSSID)) { session_id($sSSID); session_start(); } else { // wrong session ID, regenerates it session_regenerate_id(); session_start(); } } } else { $this->SetId(); $this->ReadData(); } }
/** * Изменение состояния подписки */ protected function EventAjaxTrackToggle() { /** * Устанавливаем формат Ajax ответа */ E::ModuleViewer()->SetResponseAjax('json'); if (!$this->oUserCurrent) { E::ModuleMessage()->AddError(E::ModuleLang()->Get('need_authorization'), E::ModuleLang()->Get('error')); return; } /** * Получаем тип объекта подписки */ $sTargetType = F::GetRequestStr('target_type'); if (!E::ModuleSubscribe()->IsAllowTargetType($sTargetType)) { E::ModuleMessage()->AddError(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error')); return; } $sTargetId = F::GetRequestStr('target_id') ? F::GetRequestStr('target_id') : null; $iValue = F::GetRequest('value') ? 1 : 0; $oTrack = null; /** * Проверка объекта подписки */ if (!E::ModuleSubscribe()->CheckTarget($sTargetType, $sTargetId, $iValue)) { E::ModuleMessage()->AddError(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error')); return; } /** * Если подписка еще не существовала, то создаем её */ if ($oTrack = E::ModuleSubscribe()->AddTrackSimple($sTargetType, $sTargetId, $this->oUserCurrent->getId())) { $oTrack->setStatus($iValue); E::ModuleSubscribe()->UpdateTrack($oTrack); E::ModuleMessage()->AddNotice(E::ModuleLang()->Get('subscribe_change_ok'), E::ModuleLang()->Get('attention')); return; } E::ModuleMessage()->AddError(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error')); return; }
/** * Отписка от блога или пользователя * */ protected function EventUnsubscribe() { // * Устанавливаем формат Ajax ответа E::ModuleViewer()->SetResponseAjax('json'); if (!F::GetRequest('id')) { E::ModuleMessage()->AddError(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error')); return; } $sType = F::GetRequestStr('type'); $iType = null; // * Определяем от чего отписываемся switch ($sType) { case 'blogs': case 'blog': $iType = ModuleUserfeed::SUBSCRIBE_TYPE_BLOG; break; case 'users': case 'user': $iType = ModuleUserfeed::SUBSCRIBE_TYPE_USER; break; default: E::ModuleMessage()->AddError(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error')); return; } // * Отписываем пользователя E::ModuleUserfeed()->UnsubscribeUser($this->oUserCurrent->getId(), $iType, F::GetRequestStr('id')); E::ModuleMessage()->AddNotice(E::ModuleLang()->Get('userfeed_subscribes_updated'), E::ModuleLang()->Get('attention')); }
/** * Возвращает html-код фотосета * * @param array $aData * * @return bool|string */ public function SnippetPhotoset($aData) { // Попытаемся определить откуда вызывается сниппет фотосета // поскольку нужно точно определить целевой объект и его ид // Редактируется топик. // Получим его ид. и по нему поднимем необходимый фотосет $aAdminMatches = array(); $sControllerPath = R::GetControllerPath(); if ($sControllerPath === 'ajax/preview/topic/' && F::isPost('topic_id')) { $iTopicId = (int) F::GetRequestStr('topic_id'); } elseif (preg_match('~content\\/edit\\/(\\d+)\\/~', $sControllerPath, $aMatches) || preg_match('~admin\\/content-pages\\/edit\\/(\\d+)\\/~', $sControllerPath, $aAdminMatches)) { // Найдем топик, из которого будем брать фотосет $iTopicId = !empty($aData['params']['topic']) ? (int) $aData['params']['topic'] : ($aAdminMatches ? false : $aMatches[1]); } else { $iTopicId = 0; } if ($iTopicId) { // Странно, но топик не нашли - завернём сниппет if (!($oTopic = E::ModuleTopic()->GetTopicById($iTopicId))) { return FALSE; } // Проверим, можно ли пользователю читать этот топик, а то вдруг // он запросил картинки из топика закрытого блога - а так нельзя if (!E::ModuleACL()->IsAllowShowBlog($oTopic->getBlog(), E::User())) { return FALSE; } // Попытаемся найти фотосет /** @var ModuleMresource_EntityMresource[] $aPhotoset */ $aPhotoset = E::ModuleMresource()->GetMresourcesRelByTarget('photoset', $oTopic->getId()); if (empty($aPhotoset)) { return FALSE; } // Фотосет нашли, теперь из него нужно выбрать только те фото, // которые выбрал пользователь в параметрах from и to $iFrom = isset($aData['params']['from']) ? $aData['params']['from'] : 0; $iFrom = (int) str_replace(array('last', 'first'), array(count($aPhotoset), 0), $iFrom); // Пользователи считают картинки с первой, а не с нулевой if ($iFrom) { $iFrom -= 1; } // Если указано количество, то правый предел игнорируем if ($iCount = (int) isset($aData['params']['count']) ? $aData['params']['count'] : FALSE) { $iTo = $iFrom + $iCount - 1; } else { $iTo = isset($aData['params']['to']) ? $aData['params']['to'] : count($aPhotoset); $iTo = (int) str_replace(array('last', 'first'), array(count($aPhotoset), 0), $iTo); if ($iTo) { $iTo -= 1; } } // Пользователь ошибочно указал диапазон. выдумывать ничего не будем, // просто не выведем фотосет if ($iTo - $iFrom < 0) { return FALSE; } // Сбросим ключи набора фото, так лучше считать диапазон $aPhotoset = array_values($aPhotoset); $aPhotos = array(); for ($i = $iFrom; $i <= $iTo; $i++) { if (isset($aPhotoset[$i])) { $oPhoto = $aPhotoset[$i]; $aPhotos[$oPhoto->getMresourceId()] = $oPhoto; } } if (!$aPhotos) { return FALSE; } $sPosition = isset($aData['params']['position']) ? $aData['params']['position'] : 'center'; if (!in_array($sPosition, array('left', 'right'))) { $sPosition = 'center'; } // Получим html-код сниппета $aVars = array('oTopic' => $oTopic, 'aPhotos' => $aPhotos, 'sPosition' => $sPosition, 'sPhotosetHash' => md5(serialize($aData['params']))); $aData['result'] = trim(E::ModuleViewer()->Fetch('tpls/snippets/snippet.photoset.tpl', $aVars)); return $aData['result']; } return FALSE; }
protected function _updateBlog($oBlog) { $sSubtitle = E::ModuleText()->Parser(F::GetRequestStr('blog_subtitle')); $oBlog->setSubtitle($sSubtitle); return parent::_updateBlog($oBlog); }
/** * Вывод обсуждаемых топиков */ protected function EventDiscussed() { $this->sTopicFilterPeriod = 1; // по дефолту 1 день if (in_array(F::GetRequestStr('period'), array(1, 7, 30, 'all'))) { $this->sTopicFilterPeriod = F::GetRequestStr('period'); } /** * Меню */ $this->sTopicFilter = $this->sMenuSubItemSelect = 'discussed'; /** * Передан ли номер страницы */ $iPage = $this->GetParamEventMatch(0, 2) ? $this->GetParamEventMatch(0, 2) : 1; if ($iPage == 1 && !F::GetRequest('period')) { E::ModuleViewer()->SetHtmlCanonical(R::GetPath('index') . 'discussed/'); } /** * Получаем список топиков */ $aResult = E::ModuleTopic()->GetTopicsDiscussed($iPage, Config::Get('module.topic.per_page'), $this->sTopicFilterPeriod == 'all' ? null : $this->sTopicFilterPeriod * 60 * 60 * 24); /** * Если нет топиков за 1 день, то показываем за неделю (7) */ if (!$aResult['count'] && $iPage == 1 && !F::GetRequest('period')) { $this->sTopicFilterPeriod = 7; $aResult = E::ModuleTopic()->GetTopicsDiscussed($iPage, Config::Get('module.topic.per_page'), $this->sTopicFilterPeriod == 'all' ? null : $this->sTopicFilterPeriod * 60 * 60 * 24); } $aTopics = $aResult['collection']; /** * Вызов хуков */ E::ModuleHook()->Run('topics_list_show', array('aTopics' => $aTopics)); /** * Формируем постраничность */ $aPaging = E::ModuleViewer()->MakePaging($aResult['count'], $iPage, Config::Get('module.topic.per_page'), Config::Get('pagination.pages.count'), R::GetPath('index') . 'discussed', array('period' => $this->sTopicFilterPeriod)); E::ModuleViewer()->AddHtmlTitle(E::ModuleLang()->Get('blog_menu_collective_discussed') . ($iPage > 1 ? ' (' . $iPage . ')' : '')); /** * Загружаем переменные в шаблон */ E::ModuleViewer()->Assign('aTopics', $aTopics); E::ModuleViewer()->Assign('aPaging', $aPaging); E::ModuleViewer()->Assign('sPeriodSelectCurrent', $this->sTopicFilterPeriod); E::ModuleViewer()->Assign('sPeriodSelectRoot', R::GetPath('index') . 'discussed/'); /** * Устанавливаем шаблон вывода */ $this->SetTemplateAction('index'); }
/** * Парсим URL * Пример: http://site.ru/action/event/param1/param2/ на выходе получим: * static::$sAction='action'; * static::$sActionEvent='event'; * static::$aParams=array('param1','param2'); * */ protected function ParseUrl() { $sReq = $this->GetRequestUri(); $aRequestUrl = $this->GetRequestArray($sReq); // Список доступных языков, которые могут быть указаны в URL $aLangs = array(); // Только для мультиязычных сайтов if (Config::Get('lang.multilang')) { // Получаем список доступных языков $aLangs = (array) Config::Get('lang.allow'); // Проверка языка в URL if ($aRequestUrl && $aLangs && Config::Get('lang.in_url')) { if (sizeof($aLangs) && sizeof($aRequestUrl) && in_array($aRequestUrl[0], $aLangs)) { static::$sLang = array_shift($aRequestUrl); } } } static::$aRequestURI = $aRequestUrl = $this->RewriteRequest($aRequestUrl); static::$sAction = array_shift($aRequestUrl); static::$sActionEvent = array_shift($aRequestUrl); static::$aParams = $aRequestUrl; // Только для мультиязычных сайтов if (Config::Get('lang.multilang')) { // Проверка языка в GET-параметрах if ($aLangs && Config::Get('lang.in_get')) { $sLangParam = is_string(Config::Get('lang.in_get')) ? Config::Get('lang.in_get') : 'lang'; $sLang = F::GetRequestStr($sLangParam, null, 'get'); if ($sLang) { static::$sLang = $sLang; } } } $this->aCurrentUrl = parse_url(static::$sCurrentFullUrl); $this->aCurrentUrl['protocol'] = F::UrlScheme(); if (!isset($this->aCurrentUrl['scheme']) && $this->aCurrentUrl['protocol']) { $this->aCurrentUrl['scheme'] = $this->aCurrentUrl['protocol']; } $iPathOffset = intval(C::Get('path.offset_request_url')); $aUrlParts = F::ParseUrl(); $sBase = !empty($aUrlParts['base']) ? $aUrlParts['base'] : null; if ($sBase && $iPathOffset) { $aPath = explode('/', trim($aUrlParts['path'], '/')); $iPathOffset = min($iPathOffset, sizeof($aPath)); for ($i = 0; $i < $iPathOffset; $i++) { $sBase .= '/' . $aPath[$i]; } } $this->aCurrentUrl['root'] = F::File_RootUrl(); $this->aCurrentUrl['base'] = $sBase . '/'; $this->aCurrentUrl['lang'] = static::$sLang; $this->aCurrentUrl['action'] = static::$sAction; $this->aCurrentUrl['event'] = static::$sActionEvent; $this->aCurrentUrl['params'] = implode('/', static::$aParams); }
/** * Добавление нового участника разговора (ajax) * */ public function AjaxAddTalkUser() { // * Устанавливаем формат Ajax ответа E::ModuleViewer()->SetResponseAjax('json'); $sUsers = F::GetRequestStr('users', null, 'post'); $idTalk = F::GetRequestStr('idTalk', null, 'post'); // * Если пользователь не авторизирован, возвращаем ошибку if (!E::ModuleUser()->IsAuthorization()) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('need_authorization'), E::ModuleLang()->Get('error')); return; } // * Если разговор не найден, или пользователь не является его автором (или админом), возвращаем ошибку if (!($oTalk = E::ModuleTalk()->GetTalkById($idTalk)) || $oTalk->getUserId() != $this->oUserCurrent->getId() && !$this->oUserCurrent->isAdministrator()) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('talk_not_found'), E::ModuleLang()->Get('error')); return; } // * Получаем список всех участников разговора $aTalkUsers = $oTalk->getTalkUsers(); $aUsers = explode(',', $sUsers); // * Получаем список пользователей, которые не принимают письма $aUserInBlacklist = E::ModuleTalk()->GetBlacklistByTargetId($this->oUserCurrent->getId()); // * Ограничения на максимальное число участников разговора if (count($aTalkUsers) >= Config::Get('module.talk.max_users') && !$this->oUserCurrent->isAdministrator()) { E::ModuleMessage()->AddError(E::ModuleLang()->Get('talk_create_users_error_many'), E::ModuleLang()->Get('error')); return; } // * Обрабатываем добавление по каждому переданному логину пользователя foreach ($aUsers as $sUser) { $sUser = trim($sUser); if ($sUser == '') { continue; } // * Попытка добавить себя if (strtolower($sUser) == strtolower($this->oUserCurrent->getLogin())) { $aResult[] = array('bStateError' => true, 'sMsgTitle' => E::ModuleLang()->Get('error'), 'sMsg' => E::ModuleLang()->Get('talk_speaker_add_self')); continue; } if (($oUser = E::ModuleUser()->GetUserByLogin($sUser)) && $oUser->getActivate() == 1) { if (!in_array($oUser->getId(), $aUserInBlacklist)) { if (array_key_exists($oUser->getId(), $aTalkUsers)) { switch ($aTalkUsers[$oUser->getId()]->getUserActive()) { // * Если пользователь ранее был удален админом разговора, то добавляем его снова case ModuleTalk::TALK_USER_DELETE_BY_AUTHOR: if (E::ModuleTalk()->AddTalkUser(E::GetEntity('Talk_TalkUser', array('talk_id' => $idTalk, 'user_id' => $oUser->getId(), 'date_last' => null, 'talk_user_active' => ModuleTalk::TALK_USER_ACTIVE)))) { E::ModuleNotify()->SendTalkNew($oUser, $this->oUserCurrent, $oTalk); $aResult[] = array('bStateError' => false, 'sMsgTitle' => E::ModuleLang()->Get('attention'), 'sMsg' => E::ModuleLang()->Get('talk_speaker_add_ok', array('login', htmlspecialchars($sUser))), 'sUserId' => $oUser->getId(), 'sUserLogin' => $oUser->getLogin(), 'sUserLink' => $oUser->getUserWebPath(), 'sUserWebPath' => $oUser->getUserWebPath(), 'sUserAvatar48' => $oUser->getAvatarUrl(48)); $bState = true; } else { $aResult[] = array('bStateError' => true, 'sMsgTitle' => E::ModuleLang()->Get('error'), 'sMsg' => E::ModuleLang()->Get('system_error')); } break; // * Если пользователь является активным участником разговора, возвращаем ошибку // * Если пользователь является активным участником разговора, возвращаем ошибку case ModuleTalk::TALK_USER_ACTIVE: $aResult[] = array('bStateError' => true, 'sMsgTitle' => E::ModuleLang()->Get('error'), 'sMsg' => E::ModuleLang()->Get('talk_speaker_user_already_exist', array('login' => htmlspecialchars($sUser)))); break; // * Если пользователь удалил себя из разговора самостоятельно, то блокируем повторное добавление // * Если пользователь удалил себя из разговора самостоятельно, то блокируем повторное добавление case ModuleTalk::TALK_USER_DELETE_BY_SELF: $aResult[] = array('bStateError' => true, 'sMsgTitle' => E::ModuleLang()->Get('error'), 'sMsg' => E::ModuleLang()->Get('talk_speaker_delete_by_self', array('login' => htmlspecialchars($sUser)))); break; default: $aResult[] = array('bStateError' => true, 'sMsgTitle' => E::ModuleLang()->Get('error'), 'sMsg' => E::ModuleLang()->Get('system_error')); } } elseif (E::ModuleTalk()->AddTalkUser(E::GetEntity('Talk_TalkUser', array('talk_id' => $idTalk, 'user_id' => $oUser->getId(), 'date_last' => null, 'talk_user_active' => ModuleTalk::TALK_USER_ACTIVE)))) { E::ModuleNotify()->SendTalkNew($oUser, $this->oUserCurrent, $oTalk); $aResult[] = array('bStateError' => false, 'sMsgTitle' => E::ModuleLang()->Get('attention'), 'sMsg' => E::ModuleLang()->Get('talk_speaker_add_ok', array('login', htmlspecialchars($sUser))), 'sUserId' => $oUser->getId(), 'sUserLogin' => $oUser->getLogin(), 'sUserLink' => $oUser->getUserWebPath(), 'sUserWebPath' => $oUser->getUserWebPath(), 'sUserAvatar48' => $oUser->getAvatarUrl(48)); $bState = true; } else { $aResult[] = array('bStateError' => true, 'sMsgTitle' => E::ModuleLang()->Get('error'), 'sMsg' => E::ModuleLang()->Get('system_error')); } } else { // * Добавляем пользователь не принимает сообщения $aResult[] = array('bStateError' => true, 'sMsgTitle' => E::ModuleLang()->Get('error'), 'sMsg' => E::ModuleLang()->Get('talk_user_in_blacklist', array('login' => htmlspecialchars($sUser)))); } } else { // * Пользователь не найден в базе данных или не активен $aResult[] = array('bStateError' => true, 'sMsgTitle' => E::ModuleLang()->Get('error'), 'sMsg' => E::ModuleLang()->Get('user_not_found', array('login' => htmlspecialchars($sUser)))); } } // * Передаем во вьевер массив результатов обработки по каждому пользователю E::ModuleViewer()->AssignAjax('aUsers', $aResult); }
/** * Показываем юзеров * */ protected function EventIndex() { // Получаем статистику $this->GetStats(); // По какому полю сортировать $sOrder = 'user_rating'; if (F::GetRequest('order')) { $sOrder = F::GetRequestStr('order'); } // В каком направлении сортировать $sOrderWay = 'desc'; if (F::GetRequest('order_way')) { $sOrderWay = F::GetRequestStr('order_way'); } $aFilter = array('activate' => 1); // Передан ли номер страницы $iPage = $this->GetParamEventMatch(0, 2) ? $this->GetParamEventMatch(0, 2) : 1; // Получаем список юзеров $aResult = E::ModuleUser()->GetUsersByFilter($aFilter, array($sOrder => $sOrderWay), $iPage, Config::Get('module.user.per_page')); $aUsers = $aResult['collection']; // Формируем постраничность $aPaging = E::ModuleViewer()->MakePaging($aResult['count'], $iPage, Config::Get('module.user.per_page'), Config::Get('pagination.pages.count'), R::GetPath('people') . 'index', array('order' => $sOrder, 'order_way' => $sOrderWay)); // Получаем алфавитный указатель на список пользователей $aPrefixUser = E::ModuleUser()->GetGroupPrefixUser(1); // Загружаем переменные в шаблон E::ModuleViewer()->Assign('aPaging', $aPaging); E::ModuleViewer()->Assign('aUsersRating', $aUsers); E::ModuleViewer()->Assign('aPrefixUser', $aPrefixUser); E::ModuleViewer()->Assign("sUsersOrder", htmlspecialchars($sOrder)); E::ModuleViewer()->Assign("sUsersOrderWay", htmlspecialchars($sOrderWay)); E::ModuleViewer()->Assign("sUsersOrderWayNext", htmlspecialchars($sOrderWay == 'desc' ? 'asc' : 'desc')); // Устанавливаем шаблон вывода $this->SetTemplateAction('index'); }
/** * Удаление картинки */ public function EventDescription() { // * Устанавливаем формат Ajax ответа E::ModuleViewer()->SetResponseAjax('json'); // Проверяем, целевой объект и права на его редактирование if (!($oTarget = E::ModuleUploader()->CheckAccessAndGetTarget($sTargetType = F::GetRequest('target', FALSE), $sTargetId = F::GetRequest('target_id', FALSE)))) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('not_access'), E::ModuleLang()->Get('error')); return; } if (!($sResourceId = F::GetRequest('resource_id', FALSE))) { E::ModuleMessage()->AddError(E::ModuleLang()->Get('not_access'), E::ModuleLang()->Get('error')); return; } /** @var ModuleMresource_EntityMresource $oResource */ if (!($oResource = E::ModuleMresource()->GetMresourceById($sResourceId))) { E::ModuleMessage()->AddError(E::ModuleLang()->Get('not_access'), E::ModuleLang()->Get('error')); return; } $oResource->setDescription(F::GetRequestStr('description', '')); E::ModuleMresource()->UpdateParams($oResource); E::ModuleMessage()->AddNoticeSingle(E::ModuleLang()->Get('topic_photoset_description_done')); }
/** * AJAX подгрузка следующих фото * */ protected function EventAjaxPhotoGetMore() { // * Устанавливаем формат Ajax ответа E::ModuleViewer()->SetResponseAjax('json'); // * Существует ли топик $iTopicId = F::GetRequestStr('topic_id'); $iLastId = F::GetRequest('last_id'); $sThumbSize = F::GetRequest('thumb_size'); if (!$sThumbSize) { $sThumbSize = '50crop'; } if (!$iTopicId || !($oTopic = E::ModuleTopic()->GetTopicById($iTopicId)) || !$iLastId) { E::ModuleMessage()->AddError(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error')); F::SysWarning('System Error'); return; } // * Получаем список фото $aPhotos = $oTopic->getPhotosetPhotos($iLastId, Config::Get('module.topic.photoset.per_page')); $aResult = array(); if (count($aPhotos)) { // * Формируем данные для ajax ответа foreach ($aPhotos as $oPhoto) { $aResult[] = array('id' => $oPhoto->getMresourceId(), 'path_thumb' => $oPhoto->getLink($sThumbSize), 'path' => $oPhoto->getLink(), 'description' => $oPhoto->getDescription()); } E::ModuleViewer()->AssignAjax('photos', $aResult); } E::ModuleViewer()->AssignAjax('bHaveNext', count($aPhotos) == Config::Get('module.topic.photoset.per_page')); }
/** * Проверка полей блога * * @param ModuleBlog_EntityBlog|null $oBlog * * @return bool */ protected function checkBlogFields($oBlog = null) { $bOk = true; // * Проверяем есть ли название блога if (!F::CheckVal(F::GetRequestStr('blog_title'), 'text', 2, 200)) { E::ModuleMessage()->AddError(E::ModuleLang()->Get('blog_create_title_error'), E::ModuleLang()->Get('error')); $bOk = false; } else { // * Проверяем есть ли уже блог с таким названием if ($oBlogExists = E::ModuleBlog()->GetBlogByTitle(F::GetRequestStr('blog_title'))) { if (!$oBlog || $oBlog->getId() != $oBlogExists->getId()) { E::ModuleMessage()->AddError(E::ModuleLang()->Get('blog_create_title_error_unique'), E::ModuleLang()->Get('error')); $bOk = false; } } } return $bOk; }
/** * Подключение/отключение к блогу * */ protected function AjaxBlogJoin() { // Устанавливаем формат Ajax ответа E::ModuleViewer()->SetResponseAjax('json'); // Пользователь авторизован? if (!$this->oUserCurrent) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('need_authorization'), E::ModuleLang()->Get('error')); return; } // Блог существует? $nBlogId = intval(F::GetRequestStr('idBlog', null, 'post')); if (!$nBlogId || !($oBlog = E::ModuleBlog()->GetBlogById($nBlogId))) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error')); return; } $this->oCurrentBlog = $oBlog; // Type of the blog $oBlogType = $oBlog->getBlogType(); // Current status of user in the blog /** @var ModuleBlog_EntityBlogUser $oBlogUser */ $oBlogUser = E::ModuleBlog()->GetBlogUserByBlogIdAndUserId($oBlog->getId(), $this->oUserCurrent->getId()); if (!$oBlogUser || $oBlogUser->getUserRole() < ModuleBlog::BLOG_USER_ROLE_GUEST && (!$oBlogType || $oBlogType->IsPrivate())) { // * Проверяем тип блога на возможность свободного вступления или вступления по запросу if ($oBlogType && !$oBlogType->GetMembership(ModuleBlog::BLOG_USER_JOIN_FREE) && !$oBlogType->GetMembership(ModuleBlog::BLOG_USER_JOIN_REQUEST)) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('blog_join_error_invite'), E::ModuleLang()->Get('error')); return; } if ($oBlog->getOwnerId() != $this->oUserCurrent->getId()) { // Subscribe user to the blog if ($oBlogType->GetMembership(ModuleBlog::BLOG_USER_JOIN_FREE)) { $bResult = false; if ($oBlogUser) { $oBlogUser->setUserRole(ModuleBlog::BLOG_USER_ROLE_USER); $bResult = E::ModuleBlog()->UpdateRelationBlogUser($oBlogUser); } elseif ($oBlogType->GetMembership(ModuleBlog::BLOG_USER_JOIN_FREE)) { // User can free subscribe to blog /** @var ModuleBlog_EntityBlogUser $oBlogUserNew */ $oBlogUserNew = E::GetEntity('Blog_BlogUser'); $oBlogUserNew->setBlogId($oBlog->getId()); $oBlogUserNew->setUserId($this->oUserCurrent->getId()); $oBlogUserNew->setUserRole(ModuleBlog::BLOG_USER_ROLE_USER); $bResult = E::ModuleBlog()->AddRelationBlogUser($oBlogUserNew); } if ($bResult) { E::ModuleMessage()->AddNoticeSingle(E::ModuleLang()->Get('blog_join_ok'), E::ModuleLang()->Get('attention')); E::ModuleViewer()->AssignAjax('bState', true); // Увеличиваем число читателей блога $oBlog->setCountUser($oBlog->getCountUser() + 1); E::ModuleBlog()->UpdateBlog($oBlog); E::ModuleViewer()->AssignAjax('iCountUser', $oBlog->getCountUser()); // Добавляем событие в ленту E::ModuleStream()->Write($this->oUserCurrent->getId(), 'join_blog', $oBlog->getId()); // Добавляем подписку на этот блог в ленту пользователя E::ModuleUserfeed()->SubscribeUser($this->oUserCurrent->getId(), ModuleUserfeed::SUBSCRIBE_TYPE_BLOG, $oBlog->getId()); } else { $sMsg = $oBlogType->IsPrivate() ? E::ModuleLang()->Get('blog_join_error_invite') : E::ModuleLang()->Get('system_error'); E::ModuleMessage()->AddErrorSingle($sMsg, E::ModuleLang()->Get('error')); return; } } // Подписываем по запросу if ($oBlogType->GetMembership(ModuleBlog::BLOG_USER_JOIN_REQUEST)) { // Подписка уже была запрошена, но результатов пока нет if ($oBlogUser && $oBlogUser->getUserRole() == ModuleBlog::BLOG_USER_ROLE_WISHES) { E::ModuleMessage()->AddNoticeSingle(E::ModuleLang()->Get('blog_join_request_already'), E::ModuleLang()->Get('attention')); E::ModuleViewer()->AssignAjax('bState', true); return; } if ($oBlogUser) { if (!in_array($oBlogUser->getUserRole(), array(ModuleBlog::BLOG_USER_ROLE_REJECT, ModuleBlog::BLOG_USER_ROLE_WISHES))) { $sMessage = E::ModuleLang()->Get('blog_user_status_is') . ' "' . E::ModuleBlog()->GetBlogUserRoleName($oBlogUser->getUserRole()) . '"'; E::ModuleMessage()->AddNoticeSingle($sMessage, E::ModuleLang()->Get('attention')); E::ModuleViewer()->AssignAjax('bState', true); return; } else { $oBlogUser->setUserRole(ModuleBlog::BLOG_USER_ROLE_WISHES); $bResult = E::ModuleBlog()->UpdateRelationBlogUser($oBlogUser); } } else { // Подписки ещё не было - оформим ее /** @var ModuleBlog_EntityBlogUser $oBlogUserNew */ $oBlogUserNew = E::GetEntity('Blog_BlogUser'); $oBlogUserNew->setBlogId($oBlog->getId()); $oBlogUserNew->setUserId($this->oUserCurrent->getId()); $oBlogUserNew->setUserRole(ModuleBlog::BLOG_USER_ROLE_WISHES); $bResult = E::ModuleBlog()->AddRelationBlogUser($oBlogUserNew); } if ($bResult) { // Отправим сообщение модераторам и администраторам блога о том, что // этот пользоватлеь захотел присоединиться к нашему блогу $aBlogUsersResult = E::ModuleBlog()->GetBlogUsersByBlogId($oBlog->getId(), array(ModuleBlog::BLOG_USER_ROLE_MODERATOR, ModuleBlog::BLOG_USER_ROLE_ADMINISTRATOR), null); if ($aBlogUsersResult) { /** @var ModuleUser_EntityUser[] $aBlogModerators */ $aBlogModerators = array(); /** @var ModuleBlog_EntityBlogUser $oCurrentBlogUser */ foreach ($aBlogUsersResult['collection'] as $oCurrentBlogUser) { $aBlogModerators[] = $oCurrentBlogUser->getUser(); } // Добавим владельца блога к списку $aBlogModerators = array_merge($aBlogModerators, array($oBlog->getOwner())); $this->SendBlogRequest($oBlog, $aBlogModerators, $this->oUserCurrent); } E::ModuleMessage()->AddNoticeSingle(E::ModuleLang()->Get('blog_join_request_send'), E::ModuleLang()->Get('attention')); E::ModuleViewer()->AssignAjax('bState', true); return; } } } else { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('blog_join_error_self'), E::ModuleLang()->Get('attention')); return; } } if ($oBlogUser && $oBlogUser->getUserRole() == ModuleBlog::BLOG_USER_ROLE_MEMBER) { // Unsubscribe user from the blog if (E::ModuleBlog()->DeleteRelationBlogUser($oBlogUser)) { E::ModuleMessage()->AddNoticeSingle(E::ModuleLang()->Get('blog_leave_ok'), E::ModuleLang()->Get('attention')); E::ModuleViewer()->AssignAjax('bState', false); // Уменьшаем число читателей блога $oBlog->setCountUser($oBlog->getCountUser() - 1); E::ModuleBlog()->UpdateBlog($oBlog); E::ModuleViewer()->AssignAjax('iCountUser', $oBlog->getCountUser()); // Удаляем подписку на этот блог в ленте пользователя E::ModuleUserfeed()->UnsubscribeUser($this->oUserCurrent->getId(), ModuleUserfeed::SUBSCRIBE_TYPE_BLOG, $oBlog->getId()); return; } else { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error')); return; } } if ($oBlogUser && $oBlogUser->getUserRole() == ModuleBlog::BLOG_USER_ROLE_NOTMEMBER) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('blog_user_request_no_accept'), E::ModuleLang()->Get('error')); return; } if ($oBlogUser && $oBlogUser->getUserRole() == ModuleBlog::BLOG_USER_ROLE_BAN) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('blog_leave_error_banned'), E::ModuleLang()->Get('error')); return; } if ($oBlogUser && $oBlogUser->getUserRole() == ModuleBlog::BLOG_USER_ROLE_BAN_FOR_COMMENT) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('blog_leave_error_banned'), E::ModuleLang()->Get('error')); return; } if ($oBlogUser && $oBlogUser->getUserRole() == ModuleBlog::BLOG_USER_ROLE_WISHES) { E::ModuleMessage()->AddNoticeSingle(E::ModuleLang()->Get('blog_join_request_leave'), E::ModuleLang()->Get('attention')); E::ModuleViewer()->AssignAjax('bState', true); return; } }
protected function _eventRecovery($bAjax = false) { if ($this->IsPost()) { // Was POST request $sEmail = F::GetRequestStr('mail'); // Пользователь с таким емайлом существует? if ($sEmail && F::CheckVal($sEmail, 'mail')) { if ($this->_eventRecoveryRequest($sEmail)) { if (!$bAjax) { E::ModuleMessage()->AddNoticeSingle(E::ModuleLang()->Get('password_reminder_send_link')); } return; } } E::ModuleMessage()->AddError(E::ModuleLang()->Get('password_reminder_bad_email'), E::ModuleLang()->Get('error')); } elseif ($sRecoveryCode = $this->GetParam(0)) { // Was recovery code in GET if (F::CheckVal($sRecoveryCode, 'md5')) { // Проверка кода подтверждения if ($this->_eventRecoverySend($sRecoveryCode)) { return null; } E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('password_reminder_bad_code_txt'), E::ModuleLang()->Get('password_reminder_bad_code')); if (!$bAjax) { return R::Action('error'); } return; } } }
/** * Удаление пользователя из друзей */ public function EventAjaxFriendDelete() { /** * Устанавливаем формат Ajax ответа */ E::ModuleViewer()->SetResponseAjax('json'); $sUserId = F::GetRequestStr('idUser', null, 'post'); /** * Если пользователь не авторизирован, возвращаем ошибку */ if (!E::ModuleUser()->IsAuthorization()) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('need_authorization'), E::ModuleLang()->Get('error')); return; } $this->oUserCurrent = E::ModuleUser()->GetUserCurrent(); /** * При попытке добавить в друзья себя, возвращаем ошибку */ if ($this->oUserCurrent->getId() == $sUserId) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('user_friend_add_self'), E::ModuleLang()->Get('error')); return; } /** * Если пользователь не найден, возвращаем ошибку */ if (!($oUser = E::ModuleUser()->GetUserById($sUserId))) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('user_friend_del_no'), E::ModuleLang()->Get('error')); return; } $this->oUserProfile = $oUser; /** * Получаем статус дружбы между пользователями. * Если статус не определен, или отличается от принятой заявки, * возвращаем ошибку */ $oFriend = E::ModuleUser()->GetFriend($oUser->getId(), $this->oUserCurrent->getId()); $aAllowedFriendStatus = array(ModuleUser::USER_FRIEND_ACCEPT + ModuleUser::USER_FRIEND_OFFER, ModuleUser::USER_FRIEND_ACCEPT + ModuleUser::USER_FRIEND_ACCEPT); if (!$oFriend || !in_array($oFriend->getFriendStatus(), $aAllowedFriendStatus)) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('user_friend_del_no'), E::ModuleLang()->Get('error')); return; } /** * Удаляем из друзей */ if (E::ModuleUser()->DeleteFriend($oFriend)) { E::ModuleMessage()->AddNoticeSingle(E::ModuleLang()->Get('user_friend_del_ok'), E::ModuleLang()->Get('attention')); $oViewerLocal = $this->GetViewerLocal(); $oViewerLocal->Assign('oUserFriend', $oFriend); E::ModuleViewer()->AssignAjax('sToggleText', $oViewerLocal->Fetch('actions/profile/action.profile.friend_item.tpl')); /** * Отправляем пользователю сообщение об удалении дружеской связи */ if (Config::Get('module.user.friend_notice.delete')) { $sText = E::ModuleLang()->Get('user_friend_del_notice_text', array('login' => $this->oUserCurrent->getLogin())); $oTalk = E::ModuleTalk()->SendTalk(E::ModuleLang()->Get('user_friend_del_notice_title'), $sText, $this->oUserCurrent, array($oUser), false, false); E::ModuleTalk()->DeleteTalkUserByArray($oTalk->getId(), $this->oUserCurrent->getId()); } return; } else { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error')); return; } }