Esempio n. 1
0
 /**
  * Проверка на ограничение по времени
  *
  * @param string $sValue     Проверяемое значение
  * @param array  $aParams    Параметры
  *
  * @return bool|string
  */
 public function ValidateTimeLimit($sValue, $aParams)
 {
     if ($oUser = E::ModuleUser()->GetUserById($this->getUserId())) {
         if (E::ModuleACL()->CanAddWallTime($oUser, $this)) {
             return true;
         }
     }
     return E::ModuleLang()->Get('wall_add_time_limit');
 }
Esempio n. 2
0
 /**
  * Возвращает доступные для создания пользователем типы контента
  *
  * @param ModuleUser_EntityUser $oUser
  *
  * @return ModuleTopic_EntityContentType[]
  */
 public function GetAllowContentTypeByUserId($oUser)
 {
     if ($oUser && ($oUser->isAdministrator() || $oUser->isModerator())) {
         // Для админа и модератора доступны все активные типы контента
         /** @var ModuleTopic_EntityContentType[] $aContentTypes */
         $aContentTypes = E::ModuleTopic()->GetContentTypes(array('content_active' => 1));
         return $aContentTypes;
     }
     // Получим все блоги пользователя
     $aBlogs = E::ModuleBlog()->GetBlogsAllowByUser($oUser, false);
     // Добавим персональный блог пользователю
     if ($oUser) {
         $aBlogs[] = E::ModuleBlog()->GetPersonalBlogByUserId($oUser->getId());
     }
     // Получим типы контента
     /** @var ModuleTopic_EntityContentType[] $aContentTypes */
     $aContentTypes = E::ModuleTopic()->GetContentTypes(array('content_active' => 1));
     $aAllowContentTypes = array();
     /** @var ModuleBlog_EntityBlog $oBlog */
     foreach ($aBlogs as $oBlog) {
         // Пропускаем блог, если в него нельзя добавлять топики
         if (!E::ModuleACL()->CanAddTopic($oUser, $oBlog)) {
             continue;
         }
         if ($aContentTypes) {
             foreach ($aContentTypes as $k => $oContentType) {
                 if ($oBlog->IsContentTypeAllow($oContentType->getContentUrl())) {
                     $aAllowContentTypes[] = $oContentType;
                     // Удалим, что бы повторное не проверять, ведь в каком-то
                     // блоге пользвоателя этот тип контента уже разрешён
                     unset($aContentTypes[$k]);
                 }
             }
         }
     }
     return $aAllowContentTypes;
 }
Esempio n. 3
0
 /**
  * Can this blog be read by the user?
  *
  * @param ModuleUser_EntityUser $oUser
  *
  * @return bool
  */
 public function CanReadBy($oUser)
 {
     if ($this->GetBlogType() && $this->GetBlogType()->GetAclRead(ModuleBlog::BLOG_USER_ACL_GUEST)) {
         // anybody can read blog
         return true;
     }
     return $oUser && E::ModuleACL()->IsAllowShowBlog($this, $oUser);
 }
Esempio n. 4
0
 /**
  * Показ и обработка формы приглаешний
  *
  */
 protected function EventInvite()
 {
     /**
      * Только при активном режиме инвайтов
      */
     if (!Config::Get('general.reg.invite')) {
         return parent::EventNotFound();
     }
     $this->sMenuItemSelect = 'invite';
     $this->sMenuSubItemSelect = '';
     E::ModuleViewer()->AddHtmlTitle(E::ModuleLang()->Get('settings_menu_invite'));
     /**
      * Если отправили форму
      */
     if (isPost('submit_invite')) {
         E::ModuleSecurity()->ValidateSendForm();
         $bError = false;
         /**
          * Есть права на отправку инфайтов?
          */
         if (!E::ModuleACL()->CanSendInvite($this->oUserCurrent) && !$this->oUserCurrent->isAdministrator()) {
             E::ModuleMessage()->AddError(E::ModuleLang()->Get('settings_invite_available_no'), E::ModuleLang()->Get('error'));
             $bError = true;
         }
         /**
          * Емайл корректен?
          */
         if (!F::CheckVal(F::GetRequestStr('invite_mail'), 'mail')) {
             E::ModuleMessage()->AddError(E::ModuleLang()->Get('settings_invite_mail_error'), E::ModuleLang()->Get('error'));
             $bError = true;
         }
         /**
          * Запускаем выполнение хуков
          */
         E::ModuleHook()->Run('settings_invate_send_before', array('oUser' => $this->oUserCurrent));
         /**
          * Если нет ошибок, то отправляем инвайт
          */
         if (!$bError) {
             $oInvite = E::ModuleUser()->GenerateInvite($this->oUserCurrent);
             E::ModuleNotify()->SendInvite($this->oUserCurrent, F::GetRequestStr('invite_mail'), $oInvite);
             E::ModuleMessage()->AddNoticeSingle(E::ModuleLang()->Get('settings_invite_submit_ok'));
             E::ModuleHook()->Run('settings_invate_send_after', array('oUser' => $this->oUserCurrent));
         }
     }
     E::ModuleViewer()->Assign('iCountInviteAvailable', E::ModuleUser()->GetCountInviteAvailable($this->oUserCurrent));
     E::ModuleViewer()->Assign('iCountInviteUsed', E::ModuleUser()->GetCountInviteUsed($this->oUserCurrent->getId()));
 }
Esempio n. 5
0
 /**
  * Права пользователей
  */
 protected function EventUserRights()
 {
     $this->sMainMenuItem = 'settings';
     $this->_setTitle(E::ModuleLang()->Get('action.admin.userrights_menu'));
     $this->SetTemplateAction('settings/userrights');
     if ($this->IsPost('submit_type_add')) {
         return $this->_eventUserRightsEditSubmit();
     } else {
         $_REQUEST['userrights_administrator'] = E::ModuleACL()->GetUserRights('blogs', 'administrator');
         $_REQUEST['userrights_moderator'] = E::ModuleACL()->GetUserRights('blogs', 'moderator');
     }
 }
Esempio n. 6
0
 /**
  * Can this topic be deleted by the user?
  *
  * @param ModuleUser_EntityUser $oUser
  *
  * @return bool
  */
 public function CanDeletedBy($oUser)
 {
     return E::ModuleACL()->IsAllowDeleteTopic($this, $oUser);
 }
Esempio n. 7
0
 /**
  * Обработка добавление комментария к письму
  *
  */
 protected function SubmitComment()
 {
     // * Проверям авторизован ли пользователь
     if (!E::ModuleUser()->IsAuthorization()) {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('need_authorization'), E::ModuleLang()->Get('error'));
         return false;
     }
     // * Проверяем разговор
     if (!($oTalk = E::ModuleTalk()->GetTalkById(F::GetRequestStr('cmt_target_id')))) {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error'));
         return false;
     }
     if (!($oTalkUser = E::ModuleTalk()->GetTalkUser($oTalk->getId(), $this->oUserCurrent->getId()))) {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error'));
         return false;
     }
     // * Проверяем разрешено ли отправлять инбокс по времени
     if (!E::ModuleACL()->CanPostTalkCommentTime($this->oUserCurrent)) {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('talk_time_limit'), E::ModuleLang()->Get('error'));
         return false;
     }
     // * Проверяем текст комментария
     $sText = E::ModuleText()->Parser(F::GetRequestStr('comment_text'));
     $iMin = intval(Config::Get('module.talk.min_length'));
     $iMax = intval(Config::Get('module.talk.max_length'));
     if (!F::CheckVal($sText, 'text', $iMin, $iMax)) {
         if ($iMax) {
             E::ModuleMessage()->AddError(E::ModuleLang()->Get('talk_create_text_error_len', array('min' => $iMin, 'max' => $iMax)), E::ModuleLang()->Get('error'));
         } else {
             E::ModuleMessage()->AddError(E::ModuleLang()->Get('talk_create_text_error_min', array('min' => $iMin)), E::ModuleLang()->Get('error'));
         }
         return false;
     }
     // * Проверям на какой коммент отвечаем
     $sParentId = (int) F::GetRequest('reply');
     if (!F::CheckVal($sParentId, 'id')) {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error'));
         return false;
     }
     $oCommentParent = null;
     if ($sParentId != 0) {
         // * Проверяем существует ли комментарий на который отвечаем
         if (!($oCommentParent = E::ModuleComment()->GetCommentById($sParentId))) {
             E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error'));
             return false;
         }
         // * Проверяем из одного топика ли новый коммент и тот на который отвечаем
         if ($oCommentParent->getTargetId() != $oTalk->getId()) {
             E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error'));
             return false;
         }
     } else {
         // * Корневой комментарий
         $sParentId = null;
     }
     // * Проверка на дублирующий коммент
     if (E::ModuleComment()->GetCommentUnique($oTalk->getId(), 'talk', $this->oUserCurrent->getId(), $sParentId, md5($sText))) {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('topic_comment_spam'), E::ModuleLang()->Get('error'));
         return false;
     }
     // * Создаём комментарий
     /** @var ModuleComment_EntityComment $oCommentNew */
     $oCommentNew = E::GetEntity('Comment');
     $oCommentNew->setTargetId($oTalk->getId());
     $oCommentNew->setTargetType('talk');
     $oCommentNew->setUserId($this->oUserCurrent->getId());
     $oCommentNew->setText($sText);
     $oCommentNew->setDate(F::Now());
     $oCommentNew->setUserIp(F::GetUserIp());
     $oCommentNew->setPid($sParentId);
     $oCommentNew->setTextHash(md5($sText));
     $oCommentNew->setPublish(1);
     // * Добавляем коммент
     E::ModuleHook()->Run('talk_comment_add_before', array('oCommentNew' => $oCommentNew, 'oCommentParent' => $oCommentParent, 'oTalk' => $oTalk));
     if (E::ModuleComment()->AddComment($oCommentNew)) {
         E::ModuleHook()->Run('talk_comment_add_after', array('oCommentNew' => $oCommentNew, 'oCommentParent' => $oCommentParent, 'oTalk' => $oTalk));
         E::ModuleViewer()->AssignAjax('sCommentId', $oCommentNew->getId());
         $oTalk->setDateLast(F::Now());
         $oTalk->setUserIdLast($oCommentNew->getUserId());
         $oTalk->setCommentIdLast($oCommentNew->getId());
         $oTalk->setCountComment($oTalk->getCountComment() + 1);
         E::ModuleTalk()->UpdateTalk($oTalk);
         // * Отсылаем уведомления всем адресатам
         $aUsersTalk = E::ModuleTalk()->GetUsersTalk($oTalk->getId(), ModuleTalk::TALK_USER_ACTIVE);
         foreach ($aUsersTalk as $oUserTalk) {
             if ($oUserTalk->getId() != $oCommentNew->getUserId()) {
                 E::ModuleNotify()->SendTalkCommentNew($oUserTalk, $this->oUserCurrent, $oTalk, $oCommentNew);
             }
         }
         // * Увеличиваем число новых комментов
         E::ModuleTalk()->IncreaseCountCommentNew($oTalk->getId(), $oCommentNew->getUserId());
         return true;
     } else {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error'));
     }
     return false;
 }
Esempio n. 8
0
 /**
  * Голосование за пользователя
  *
  */
 protected function EventVoteUser()
 {
     // * Пользователь авторизован?
     if (!$this->oUserCurrent) {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('need_authorization'), E::ModuleLang()->Get('error'));
         return;
     }
     // * Пользователь существует?
     if (!($oUser = E::ModuleUser()->GetUserById(F::GetRequestStr('idUser', null, 'post')))) {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error'));
         return;
     }
     // * Голосует за себя?
     if ($oUser->getId() == $this->oUserCurrent->getId()) {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('user_vote_error_self'), E::ModuleLang()->Get('attention'));
         return;
     }
     // * Уже голосовал?
     if ($oUserVote = E::ModuleVote()->GetVote($oUser->getId(), 'user', $this->oUserCurrent->getId())) {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('user_vote_error_already'), E::ModuleLang()->Get('attention'));
         return;
     }
     // * Имеет право на голосование?
     if (!E::ModuleACL()->CanVoteUser($this->oUserCurrent, $oUser)) {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('user_vote_error_acl'), E::ModuleLang()->Get('attention'));
         return;
     }
     // * Как проголосовал
     $iValue = F::GetRequestStr('value', null, 'post');
     if (!in_array($iValue, array('1', '-1'))) {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('attention'));
         return;
     }
     // * Голосуем
     /** @var ModuleVote_EntityVote $oUserVote */
     $oUserVote = E::GetEntity('Vote');
     $oUserVote->setTarget($oUser);
     $oUserVote->setTargetId($oUser->getId());
     $oUserVote->setTargetType('user');
     $oUserVote->setVoter($this->oUserCurrent);
     $oUserVote->setVoterId($this->oUserCurrent->getId());
     $oUserVote->setDirection($iValue);
     $oUserVote->setDate(F::Now());
     if ($iValue != 0) {
         $nDeltaRating = (double) E::ModuleRating()->VoteUser($this->oUserCurrent, $oUser, $iValue);
     } else {
         $nDeltaRating = 0.0;
     }
     $oUserVote->setValue($nDeltaRating);
     $oUser->setCountVote($oUser->getCountVote() + 1);
     if (E::ModuleVote()->AddVote($oUserVote) && E::ModuleUser()->Update($oUser)) {
         E::ModuleMessage()->AddNoticeSingle(E::ModuleLang()->Get('user_vote_ok'), E::ModuleLang()->Get('attention'));
         E::ModuleViewer()->AssignAjax('iRating', number_format($oUser->getRating(), Config::Get('view.skill_length')));
         E::ModuleViewer()->AssignAjax('iSkill', number_format($oUser->getSkill(), Config::Get('view.rating_length')));
         E::ModuleViewer()->AssignAjax('iCountVote', $oUser->getCountVote());
         // * Добавляем событие в ленту
         E::ModuleStream()->Write($oUserVote->getVoterId(), 'vote_user', $oUser->getId());
     } else {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error'));
         return;
     }
 }
Esempio n. 9
0
 /**
  * Проверяет доступность того или иного целевого объекта, переопределяется
  * плагинами. По умолчанию всё грузить запрещено.
  * Если всё нормально и пользователю разрешено сюда загружать картинки,
  * то метод возвращает целевой объект, иначе значение FALSE.
  *
  * @param string $sTarget
  * @param int    $iTargetId
  *
  * @return bool
  */
 public function CheckAccessAndGetTarget($sTarget, $iTargetId = null)
 {
     // Проверяем право пользователя на прикрепление картинок к топику
     if (mb_strpos($sTarget, 'single-image-uploader') === 0 || $sTarget == 'photoset') {
         // Проверям, авторизован ли пользователь
         if (!E::IsUser()) {
             return FALSE;
         }
         // Топик редактируется
         if ($oTopic = E::ModuleTopic()->GetTopicById($iTargetId)) {
             if (!E::ModuleACL()->IsAllowEditTopic($oTopic, E::User())) {
                 return FALSE;
             }
             return $oTopic;
         }
         return TRUE;
     }
     // Загружать аватарки можно только в свой профиль
     if ($sTarget == 'profile_avatar') {
         if ($iTargetId && E::IsUser() && $iTargetId == E::UserId()) {
             return E::User();
         }
         return FALSE;
     }
     // Загружать аватарки можно только в свой профиль
     if ($sTarget == 'profile_photo') {
         if ($iTargetId && E::IsUser() && $iTargetId == E::UserId()) {
             return E::User();
         }
         return FALSE;
     }
     if ($sTarget == 'blog_avatar') {
         /** @var ModuleBlog_EntityBlog $oBlog */
         $oBlog = E::ModuleBlog()->GetBlogById($iTargetId);
         if (!E::IsUser()) {
             return false;
         }
         if (!$oBlog) {
             // Блог еще не создан
             return E::ModuleACL()->CanCreateBlog(E::User()) || E::IsAdminOrModerator();
         }
         if ($oBlog && (E::ModuleACL()->CheckBlogEditBlog($oBlog, E::User()) || E::IsAdminOrModerator())) {
             return $oBlog;
         }
         return '';
     }
     if ($sTarget == 'topic') {
         if (!E::IsUser()) {
             return false;
         }
         /** @var ModuleTopic_EntityTopic $oTopic */
         $oTopic = E::ModuleTopic()->GetTopicById($iTargetId);
         if (!$oTopic) {
             // Топик еще не создан
             return TRUE;
         }
         if ($oTopic && (E::ModuleACL()->IsAllowEditTopic($oTopic, E::User()) || E::IsAdminOrModerator())) {
             return $oTopic;
         }
         return '';
     }
     if ($sTarget == 'topic_comment') {
         if (!E::IsUser()) {
             return false;
         }
         /** @var ModuleComment_EntityComment $oComment */
         $oComment = E::ModuleComment()->GetCommentById($iTargetId);
         if (!$oComment) {
             // Комментарий еще не создан
             return TRUE;
         }
         if ($oComment && (E::ModuleACL()->CanPostComment(E::User(), $oComment->getTarget()) && E::ModuleAcl()->CanPostCommentTime(E::User()) || E::IsAdminOrModerator())) {
             return $oComment;
         }
         return '';
     }
     if ($sTarget == 'talk_comment') {
         if (!E::IsUser()) {
             return false;
         }
         /** @var ModuleComment_EntityComment $oComment */
         $oComment = E::ModuleComment()->GetCommentById($iTargetId);
         if (!$oComment) {
             // Комментарий еще не создан
             return TRUE;
         }
         if ($oComment && (E::ModuleAcl()->CanPostTalkCommentTime(E::User()) || E::IsAdminOrModerator())) {
             return $oComment;
         }
         return '';
     }
     if ($sTarget == 'talk') {
         if (!E::IsUser()) {
             return false;
         }
         /** @var ModuleComment_EntityComment $oTalk */
         $oTalk = E::ModuleTalk()->GetTalkById($iTargetId);
         if (!$oTalk) {
             // Комментарий еще не создан
             return TRUE;
         }
         if ($oTalk && (E::ModuleAcl()->CanSendTalkTime(E::User()) || E::IsAdminOrModerator())) {
             return $oTalk;
         }
         return '';
     }
     return FALSE;
 }
Esempio n. 10
0
 /**
  * Удаление блога
  *
  */
 protected function EventDeleteBlog()
 {
     E::ModuleSecurity()->ValidateSendForm();
     // * Проверяем передан ли в УРЛе номер блога
     $nBlogId = intval($this->GetParam(0));
     if (!$nBlogId || !($oBlog = E::ModuleBlog()->GetBlogById($nBlogId))) {
         return parent::EventNotFound();
     }
     $this->oCurrentBlog = $oBlog;
     // * Проверям авторизован ли пользователь
     if (!E::ModuleUser()->IsAuthorization()) {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('not_access'), E::ModuleLang()->Get('error'));
         return R::Action('error');
     }
     // * проверяем есть ли право на удаление блога
     if (!($nAccess = E::ModuleACL()->IsAllowDeleteBlog($oBlog, $this->oUserCurrent))) {
         return parent::EventNotFound();
     }
     $aTopics = E::ModuleTopic()->GetTopicsByBlogId($nBlogId);
     switch ($nAccess) {
         case ModuleACL::CAN_DELETE_BLOG_EMPTY_ONLY:
             if (is_array($aTopics) && count($aTopics)) {
                 E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('blog_admin_delete_not_empty'), E::ModuleLang()->Get('error'), true);
                 R::Location($oBlog->getUrlFull());
             }
             break;
         case ModuleACL::CAN_DELETE_BLOG_WITH_TOPICS:
             /*
              * Если указан идентификатор блога для перемещения,
              * то делаем попытку переместить топики.
              *
              * (-1) - выбран пункт меню "удалить топики".
              */
             $nNewBlogId = intval(F::GetRequestStr('topic_move_to'));
             if ($nNewBlogId > 0 && is_array($aTopics) && count($aTopics)) {
                 if (!($oBlogNew = E::ModuleBlog()->GetBlogById($nNewBlogId))) {
                     E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('blog_admin_delete_move_error'), E::ModuleLang()->Get('error'), true);
                     R::Location($oBlog->getUrlFull());
                 }
                 // * Если выбранный блог является персональным, возвращаем ошибку
                 if ($oBlogNew->getType() == 'personal') {
                     E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('blog_admin_delete_move_personal'), E::ModuleLang()->Get('error'), true);
                     R::Location($oBlog->getUrlFull());
                 }
                 // * Перемещаем топики
                 E::ModuleTopic()->MoveTopics($nBlogId, $nNewBlogId);
             }
             break;
         default:
             return parent::EventNotFound();
     }
     // * Удаляяем блог и перенаправляем пользователя к списку блогов
     E::ModuleHook()->Run('blog_delete_before', array('sBlogId' => $nBlogId));
     if ($this->_deleteBlog($oBlog)) {
         E::ModuleHook()->Run('blog_delete_after', array('sBlogId' => $nBlogId));
         E::ModuleMessage()->AddNoticeSingle(E::ModuleLang()->Get('blog_admin_delete_success'), E::ModuleLang()->Get('attention'), true);
         R::Location(R::GetPath('blogs'));
     } else {
         R::Location($oBlog->getUrlFull());
     }
 }
Esempio n. 11
0
 /**
  * Получает список блогов, которые доступны пользователю для заданного действия.
  * Или проверяет на заданное действие конкретный блог
  *
  * @param string                    $sAllow
  * @param ModuleUser_EntityUser     $oUser
  * @param int|ModuleBlog_EntityBlog $xBlog
  * @param bool                      $bCheckOnly
  * @param bool                      $bSortByTitle
  *
  * @return array|bool
  */
 public function GetBlogsAllowTo($sAllow, $oUser, $xBlog = null, $bCheckOnly = false, $bSortByTitle = true)
 {
     /** @var ModuleBlog_EntityBlog $oRequestBlog */
     $oRequestBlog = null;
     if (is_object($xBlog)) {
         $iRequestBlogId = intval($xBlog->GetId());
         $oRequestBlog = $xBlog;
     } else {
         $iRequestBlogId = intval($xBlog);
     }
     $sCacheKey = 'blogs_allow_to_' . serialize(array($sAllow, $oUser ? $oUser->GetId() : 0, $iRequestBlogId, (bool) $bCheckOnly));
     if ($iRequestBlogId && $bCheckOnly) {
         // Если только проверка прав, то проверяем временный кеш
         if (is_int($xCacheResult = E::ModuleCache()->Get($sCacheKey, 'tmp'))) {
             return $xCacheResult;
         }
     }
     if ($oUser->isAdministrator() || $oUser->isModerator()) {
         // Если админ и если проверка на конкретный блог, то возвращаем без проверки
         if ($iRequestBlogId) {
             return $iRequestBlogId;
         }
         $aAdditionalData = array('relation_user');
         $aAllowBlogs = $this->GetBlogs($aAdditionalData);
         if ($iRequestBlogId) {
             return isset($aAllowBlogs[$iRequestBlogId]) ? $aAllowBlogs[$iRequestBlogId] : array();
         }
         if ($bSortByTitle) {
             $this->_sortByTitle($aAllowBlogs);
         }
         return $aAllowBlogs;
     }
     if (false === ($aAllowBlogs = E::ModuleCache()->Get($sCacheKey))) {
         if ($oUser) {
             // User is owner of the blog
             if ($oRequestBlog && $oRequestBlog->getOwnerId() == $oUser->getId()) {
                 return $oRequestBlog;
             }
             // Блоги, созданные пользователем
             $aAllowBlogs = $this->GetBlogsByOwnerId($oUser->getId());
             if ($iRequestBlogId && isset($aAllowBlogs[$iRequestBlogId])) {
                 return $aAllowBlogs[$iRequestBlogId];
             }
             // Блоги, в которых состоит пользователь
             if ($iRequestBlogId) {
                 // Requests one blog
                 $aBlogUsers = $this->GetBlogUsersByArrayBlog($iRequestBlogId, $oUser->getId());
                 if ($oBlogUser = reset($aBlogUsers)) {
                     if (!$oBlogUser->getBlog()) {
                         if (!$oRequestBlog) {
                             $oRequestBlog = $this->GetBlogById($iRequestBlogId);
                         }
                         $oBlogUser->setBlog($oRequestBlog);
                     }
                 }
             } else {
                 // Requests any allowed blogs
                 $aBlogUsers = $this->GetBlogUsersByUserId($oUser->getId());
             }
             foreach ($aBlogUsers as $oBlogUser) {
                 /** @var ModuleBlog_EntityBlogType $oBlog */
                 $oBlog = $oBlogUser->getBlog();
                 /** @var ModuleBlog_EntityBlogType $oBlogType */
                 $oBlogType = $oBlog->GetBlogType();
                 // админа и модератора блога не проверяем
                 if ($oBlogUser->IsBlogAdministrator() || $oBlogUser->IsBlogModerator()) {
                     $aAllowBlogs[$oBlog->getId()] = $oBlog;
                 } elseif ($oBlogUser->getUserRole() !== self::BLOG_USER_ROLE_NOTMEMBER && $oBlogUser->getUserRole() > self::BLOG_USER_ROLE_GUEST) {
                     $bAllow = false;
                     if ($oBlogType) {
                         if ($sAllow == 'write') {
                             $bAllow = $oBlogType->GetAclWrite(self::BLOG_USER_ACL_MEMBER) && $oBlogType->GetMinRateWrite() <= $oUser->getRating() || E::ModuleACL()->CheckBlogEditContent($oBlog, $oUser);
                         } elseif ($sAllow == 'read') {
                             $bAllow = $oBlogType->GetAclRead(self::BLOG_USER_ACL_MEMBER) && $oBlogType->GetMinRateRead() <= $oUser->getRating();
                         } elseif ($sAllow == 'comment') {
                             $bAllow = $oBlogType->GetAclComment(self::BLOG_USER_ACL_MEMBER) && $oBlogType->GetMinRateComment() <= $oUser->getRating();
                         }
                         if ($bAllow) {
                             $aAllowBlogs[$oBlog->getId()] = $oBlog;
                         }
                     }
                 }
                 // Если задан конкретный блог и он найден, то проверять больше не нужно
                 if ($iRequestBlogId && isset($aAllowBlogs[$iRequestBlogId])) {
                     return $aAllowBlogs[$iRequestBlogId];
                 }
             }
         }
         if ($sAllow == 'write') {
             // Блоги, в которые можно писать без вступления
             $aFilter = array('acl_write' => self::BLOG_USER_ACL_USER, 'min_rate_write' => $oUser->GetUserRating());
         } elseif ($sAllow == 'read') {
             // Блоги, которые можно читать без вступления
             $aFilter = array('acl_read' => self::BLOG_USER_ACL_USER, 'min_rate_read' => $oUser->GetUserRating());
         } elseif ($sAllow == 'comment') {
             // Блоги, в которые можно писать без вступления
             $aFilter = array('acl_comment' => self::BLOG_USER_ACL_USER, 'min_rate_comment' => $oUser->GetUserRating());
         }
         // Получаем типы блогов
         if ($aBlogTypes = $this->GetBlogTypes($aFilter, true)) {
             // Получаем ID блогов
             $aCriteria = array('filter' => array('blog_type' => $aBlogTypes));
             // Получаем ID блогов
             $aResult = $this->oMapper->GetBlogsIdByCriteria($aCriteria);
             // Получаем сами блоги
             if ($aResult['data']) {
                 // если задана только проверка, то сам блог(и) не нужен
                 if ($iRequestBlogId && $bCheckOnly) {
                     return in_array($iRequestBlogId, $aResult['data']);
                 }
                 if ($aBlogs = $this->GetBlogsAdditionalData($aResult['data'], array())) {
                     foreach ($aBlogs as $oBlog) {
                         if (!isset($aAllowBlogs[$oBlog->getId()])) {
                             $aAllowBlogs[$oBlog->getId()] = $oBlog;
                         }
                     }
                 }
             }
         }
         if ($iRequestBlogId) {
             return isset($aAllowBlogs[$iRequestBlogId]) ? $aAllowBlogs[$iRequestBlogId] : array();
         }
         if ($bSortByTitle) {
             $this->_sortByTitle($aAllowBlogs);
         }
         E::ModuleCache()->Set($aAllowBlogs, $sCacheKey, array('blog_update', 'user_update'), 'P1D');
     }
     if ($iRequestBlogId && $bCheckOnly) {
         // Если только проверка прав, то сохраняем во временный кеш
         // Чтоб не было ложных сробатываний, используем в этом кеше числовое значение
         E::ModuleCache()->Set($sCacheKey, $aAllowBlogs ? 1 : 0, array('blog_update', 'user_update'), 0, 'tmp');
     }
     return $aAllowBlogs;
 }
Esempio n. 12
0
 /**
  * AJAX удаление фото
  *
  */
 protected function EventAjaxPhotoDelete()
 {
     // * Устанавливаем формат Ajax ответа
     E::ModuleViewer()->SetResponseAjax('json');
     // * Проверяем авторизован ли юзер
     if (!E::ModuleUser()->IsAuthorization()) {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('not_access'), E::ModuleLang()->Get('error'));
         return false;
     }
     // * Поиск фото по id
     $oPhoto = E::ModuleTopic()->GetTopicPhotoById($this->GetPost('id'));
     if ($oPhoto) {
         if ($oPhoto->getTopicId()) {
             // * Проверяем права на топик
             $oTopic = E::ModuleTopic()->GetTopicById($oPhoto->getTopicId());
             if ($oTopic && E::ModuleACL()->IsAllowEditTopic($oTopic, $this->oUserCurrent)) {
                 E::ModuleTopic()->DeleteTopicPhoto($oPhoto);
                 // * Если удаляем главную фотографию. топика, то её необходимо сменить
                 if ($oPhoto->getId() == $oTopic->getPhotosetMainPhotoId() && $oTopic->getPhotosetCount() > 1) {
                     $aPhotos = $oTopic->getPhotosetPhotos(0, 1);
                     $oTopic->setPhotosetMainPhotoId($aPhotos[0]->getMresourceId());
                 } elseif ($oTopic->getPhotosetCount() == 1) {
                     $oTopic->setPhotosetMainPhotoId(null);
                 }
                 $oTopic->setPhotosetCount($oTopic->getPhotosetCount() - 1);
                 E::ModuleTopic()->UpdateTopic($oTopic);
                 E::ModuleMessage()->AddNotice(E::ModuleLang()->Get('topic_photoset_photo_deleted'), E::ModuleLang()->Get('attention'));
                 return;
             }
             E::ModuleMessage()->AddError(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error'));
             return;
         }
         E::ModuleTopic()->DeleteTopicPhoto($oPhoto);
         E::ModuleMessage()->AddNotice(E::ModuleLang()->Get('topic_photoset_photo_deleted'), E::ModuleLang()->Get('attention'));
         return;
     }
     E::ModuleMessage()->AddError(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error'));
     return;
 }
Esempio n. 13
0
 /**
  * Возвращает html-код фотосета
  *
  * @param $aData
  * @return bool
  */
 public function SnippetPhotoset($aData)
 {
     // Попытаемся определить откуда вызывается сниппет фотосета
     // поскольку нужно точно определить целевой объект и его ид
     // Редактируется топик.
     // Получим его ид. и по нему поднимем необходимый фотосет
     $aAdminMatches = array();
     if (preg_match('~content\\/edit\\/(\\d+)\\/~', R::GetControllerPath(), $aMatches) || preg_match('~admin\\/content-pages\\/edit\\/(\\d+)\\/~', R::GetControllerPath(), $aAdminMatches)) {
         // Найдем топик, из которого будем брать фотосет
         $iTopicId = (int) isset($aData['params']['topic']) ? $aData['params']['topic'] : ($aAdminMatches ? FALSE : $aMatches[1]);
         // Странно, но топик не нашли - завернём сниппет
         if (!($oTopic = E::ModuleTopic()->GetTopicById($iTopicId))) {
             return FALSE;
         }
         // Проверим, можно ли пользователю читать этот топик, а то вдруг
         // он запросил картинки из топика закрытого блога - а так нельзя
         if (!E::ModuleACL()->IsAllowShowBlog($oTopic->getBlog(), E::User())) {
             return FALSE;
         }
         // Попытаемся найти фотосет
         /** @var ModuleMresource_EntityMresource[] $aPhotos */
         if (!(($aPhotos = E::ModuleMresource()->GetMresourcesRelByTarget('photoset', $oTopic->getId())) && is_array($aPhotos) && count($aPhotos) > 0)) {
             return FALSE;
         }
         // Фотосет нашли, теперь из него нужно выбрать только те фото,
         // которые выбрал пользователь в параметрах from и to
         $iFrom = isset($aData['params']['from']) ? $aData['params']['from'] : 0;
         $iFrom = (int) str_replace(array('last', 'first'), array(count($aPhotos), 0), $iFrom);
         // Пользователи считают картинки с первой, а не с нулевой
         if ($iFrom) {
             $iFrom -= 1;
         }
         // Если указана длина, то правый предел игнорируем
         if ($iCount = (int) isset($aData['params']['count']) ? $aData['params']['count'] : FALSE) {
             $iTo = $iFrom + $iCount - 1;
         } else {
             $iTo = isset($aData['params']['to']) ? $aData['params']['to'] : count($aPhotos);
             $iTo = (int) str_replace(array('last', 'first'), array(count($aPhotos), 0), $iTo);
             if ($iTo) {
                 $iTo -= 1;
             }
         }
         // Пользователь ошибочно указал диапазон. выдумывать ничего не будем,
         // просто не выведем фотосет
         if ($iTo - $iFrom < 0) {
             return FALSE;
         }
         // Сбросим ключи набора фото, так лучше считать диапазон
         $aPhotos = array_values($aPhotos);
         foreach ($aPhotos as $k => $v) {
             if ($k < $iFrom || $k > $iTo) {
                 unset($aPhotos[$k]);
             }
         }
         if (!$aPhotos) {
             return FALSE;
         }
         $sPosition = $iTopicId = (int) isset($aData['params']['position']) ? $aData['params']['position'] : 'center';
         if (!in_array($sPosition, array('left', 'right'))) {
             $sPosition = 'center';
         }
         // Получим html-код сниппета
         $aVars = array('oTopic' => $oTopic, 'aPhotos' => $aPhotos, 'sPosition' => $sPosition, 'sPhotosetHash' => md5(serialize($aData['params'])));
         $aData['result'] = trim(E::ModuleViewer()->Fetch('tpls/snippets/snippet.photoset.tpl', $aVars));
         return $aData['result'];
     }
     return FALSE;
 }
Esempio n. 14
0
 /**
  * Может ли комментарий быть удален
  *
  * @return bool
  */
 public function isDeletable()
 {
     if ($this->getTargetType() != 'talk' && ($oUser = E::ModuleUser()->GetUserCurrent())) {
         if ($oUser->isAdministrator()) {
             return true;
         }
         if (($oBlog = $this->getTargetBlog()) && E::ModuleACL()->CheckBlogDeleteComment($oBlog, $oUser)) {
             return true;
         }
     }
     return false;
 }
Esempio n. 15
0
 /**
  * @param string                    $sAllow
  * @param ModuleUser_EntityUser     $oUser
  * @param int|ModuleBlog_EntityBlog $xBlog
  * @param bool                      $bCheckOnly
  *
  * @return array|bool|mixed|ModuleBlog_EntityBlog[]
  */
 protected function _getBlogsAllowTo($sAllow, $oUser, $xBlog = null, $bCheckOnly = false)
 {
     /** @var ModuleBlog_EntityBlog $oRequestBlog */
     $oRequestBlog = null;
     if (is_object($xBlog)) {
         $iRequestBlogId = intval($xBlog->GetId());
         $oRequestBlog = $xBlog;
     } else {
         $iRequestBlogId = intval($xBlog);
     }
     if ($oUser->isAdministrator() || $oUser->isModerator()) {
         // Если админ и если проверка на конкретный блог, то возвращаем без проверки
         if ($iRequestBlogId) {
             return $iRequestBlogId;
         }
         $aAdditionalData = array('relation_user');
         $aAllowBlogs = $this->GetBlogs($aAdditionalData);
         if ($iRequestBlogId) {
             return isset($aAllowBlogs[$iRequestBlogId]) ? $aAllowBlogs[$iRequestBlogId] : array();
         }
         return $aAllowBlogs;
     }
     // User is owner of the blog
     if ($oRequestBlog && $oRequestBlog->getOwnerId() == $oUser->getId()) {
         return $oRequestBlog;
     }
     // Блоги, созданные пользователем
     $aAllowBlogs = $this->GetBlogsByOwnerId($oUser->getId());
     if ($iRequestBlogId && isset($aAllowBlogs[$iRequestBlogId])) {
         return $aAllowBlogs[$iRequestBlogId];
     }
     // Блоги, в которых состоит пользователь
     if ($iRequestBlogId) {
         // Requests one blog
         $aBlogUsers = $this->GetBlogUsersByArrayBlog($iRequestBlogId, $oUser->getId());
         if ($oBlogUser = reset($aBlogUsers)) {
             if (!$oBlogUser->getBlog()) {
                 if (!$oRequestBlog) {
                     $oRequestBlog = $this->GetBlogById($iRequestBlogId);
                 }
                 $oBlogUser->setBlog($oRequestBlog);
             }
         }
     } else {
         // Requests any allowed blogs
         $aBlogUsers = $this->GetBlogUsersByUserId($oUser->getId());
     }
     foreach ($aBlogUsers as $oBlogUser) {
         /** @var ModuleBlog_EntityBlog $oBlog */
         $oBlog = $oBlogUser->getBlog();
         /** @var ModuleBlog_EntityBlogType $oBlogType */
         $oBlogType = $oBlog->GetBlogType();
         // админа и модератора блога не проверяем
         if ($oBlogUser->IsBlogAdministrator() || $oBlogUser->IsBlogModerator()) {
             $aAllowBlogs[$oBlog->getId()] = $oBlog;
         } elseif ($oBlogUser->getUserRole() !== self::BLOG_USER_ROLE_NOTMEMBER && $oBlogUser->getUserRole() > self::BLOG_USER_ROLE_GUEST) {
             $bAllow = false;
             if ($oBlogType) {
                 if ($sAllow == 'write') {
                     $bAllow = $oBlogType->GetAclWrite(self::BLOG_USER_ACL_MEMBER) && $oBlogType->GetMinRateWrite() <= $oUser->getRating() || E::ModuleACL()->CheckBlogEditContent($oBlog, $oUser);
                 } elseif ($sAllow == 'read') {
                     $bAllow = $oBlogType->GetAclRead(self::BLOG_USER_ACL_MEMBER) && $oBlogType->GetMinRateRead() <= $oUser->getRating();
                 } elseif ($sAllow == 'comment') {
                     $bAllow = $oBlogType->GetAclComment(self::BLOG_USER_ACL_MEMBER) && $oBlogType->GetMinRateComment() <= $oUser->getRating();
                 }
                 if ($bAllow) {
                     $aAllowBlogs[$oBlog->getId()] = $oBlog;
                 }
             }
         }
         // Если задан конкретный блог и он найден, то проверять больше не нужно
         if ($iRequestBlogId && isset($aAllowBlogs[$iRequestBlogId])) {
             return $aAllowBlogs[$iRequestBlogId];
         }
     }
     $aFilter = array();
     if ($sAllow == 'list') {
         // Blogs which user can list
         $aFilter['allow_list'] = true;
     } elseif ($sAllow == 'read') {
         // Blogs which can be read without subscribing
         $aFilter = array('acl_read' => self::BLOG_USER_ACL_USER, 'min_rate_read' => $oUser->GetUserRating());
     } elseif ($sAllow == 'comment') {
         // Blogs in which user can comment without subscription
         $aFilter = array('acl_comment' => self::BLOG_USER_ACL_USER, 'min_rate_comment' => $oUser->GetUserRating());
     } elseif ($sAllow == 'write') {
         // Blogs in which user can write without subscription
         $aFilter = array('acl_write' => self::BLOG_USER_ACL_USER, 'min_rate_write' => $oUser->GetUserRating());
     }
     // Получаем типы блогов
     if ($aFilter && ($aBlogTypes = $this->GetBlogTypes($aFilter, true))) {
         // Получаем ID блогов
         $aCriteria = array('filter' => array('blog_type' => $aBlogTypes));
         // Получаем ID блогов
         $aResult = $this->oMapper->GetBlogsIdByCriteria($aCriteria);
         // Получаем сами блоги
         if ($aResult['data']) {
             // если задана только проверка, то сам блог(и) не нужен
             if ($iRequestBlogId && $bCheckOnly) {
                 return in_array($iRequestBlogId, $aResult['data']);
             }
             if ($aBlogs = $this->GetBlogsAdditionalData($aResult['data'], array())) {
                 foreach ($aBlogs as $oBlog) {
                     if (!isset($aAllowBlogs[$oBlog->getId()])) {
                         $aAllowBlogs[$oBlog->getId()] = $oBlog;
                     }
                 }
             }
         }
     }
     if ($iRequestBlogId) {
         return isset($aAllowBlogs[$iRequestBlogId]) ? $aAllowBlogs[$iRequestBlogId] : array();
     }
     return $aAllowBlogs;
 }
Esempio n. 16
0
 /**
  * Обработка добавления в друзья
  *
  * @param ModuleUser_EntityUser $oUser
  * @param string                $sUserText
  * @param ModuleUser_EntityUser $oFriend
  *
  * @return bool
  */
 protected function SubmitAddFriend($oUser, $sUserText, $oFriend = null)
 {
     /**
      * Ограничения на добавления в друзья, т.к. приглашение отправляется в личку, то и ограничиваем по ней
      */
     if (!E::ModuleACL()->CanSendTalkTime($this->oUserCurrent)) {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('user_friend_add_time_limit'), E::ModuleLang()->Get('error'));
         return false;
     }
     /**
      * Обрабатываем текст заявки
      */
     $sUserText = E::ModuleText()->Parse($sUserText);
     /**
      * Создаем связь с другом
      */
     /** @var ModuleUser_EntityFriend $oFriendNew */
     $oFriendNew = E::GetEntity('User_Friend');
     $oFriendNew->setUserTo($oUser->getId());
     $oFriendNew->setUserFrom($this->oUserCurrent->getId());
     // Добавляем заявку в друзья
     $oFriendNew->setStatusFrom(ModuleUser::USER_FRIEND_OFFER);
     $oFriendNew->setStatusTo(ModuleUser::USER_FRIEND_NULL);
     $bStateError = $oFriend ? !E::ModuleUser()->UpdateFriend($oFriendNew) : !E::ModuleUser()->AddFriend($oFriendNew);
     if (!$bStateError) {
         E::ModuleMessage()->AddNoticeSingle(E::ModuleLang()->Get('user_friend_offer_send'), E::ModuleLang()->Get('attention'));
         $sTitle = E::ModuleLang()->Get('user_friend_offer_title', array('login' => $this->oUserCurrent->getLogin(), 'friend' => $oUser->getLogin()));
         F::IncludeLib('XXTEA/encrypt.php');
         $sCode = $this->oUserCurrent->getId() . '_' . $oUser->getId();
         $sCode = rawurlencode(base64_encode(xxtea_encrypt($sCode, Config::Get('module.talk.encrypt'))));
         $aPath = array('accept' => R::GetPath('profile') . 'friendoffer/accept/?code=' . $sCode, 'reject' => R::GetPath('profile') . 'friendoffer/reject/?code=' . $sCode);
         $sText = E::ModuleLang()->Get('user_friend_offer_text', array('login' => $this->oUserCurrent->getLogin(), 'accept_path' => $aPath['accept'], 'reject_path' => $aPath['reject'], 'user_text' => $sUserText));
         $oTalk = E::ModuleTalk()->SendTalk($sTitle, $sText, $this->oUserCurrent, array($oUser), false, false);
         /**
          * Отправляем пользователю заявку
          */
         E::ModuleNotify()->SendUserFriendNew($oUser, $this->oUserCurrent, $sUserText, R::GetPath('talk') . 'read/' . $oTalk->getId() . '/');
         /**
          * Удаляем отправляющего юзера из переписки
          */
         E::ModuleTalk()->DeleteTalkUserByArray($oTalk->getId(), $this->oUserCurrent->getId());
     } else {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error'));
     }
     /**
      * Подписываем запрашивающего дружбу на
      */
     E::ModuleStream()->SubscribeUser($this->oUserCurrent->getId(), $oUser->getId());
     $oViewerLocal = $this->GetViewerLocal();
     $oViewerLocal->Assign('oUserFriend', $oFriendNew);
     E::ModuleViewer()->AssignAjax('sToggleText', $oViewerLocal->Fetch('actions/profile/action.profile.friend_item.tpl'));
 }