protected function updateCommunityCat(ModuleBlog_EntityBlog $oBlog) { $sql = 'UPDATE ' . Config::Get('db.table.blog') . ' SET blog_cat = ? WHERE blog_id = ?d'; if ($this->oDb->query($sql, $oBlog->getCategory(), $oBlog->getId()) !== null) { return true; } return false; }
/** * Расчет рейтинга и силы при голосовании за блог * * @param ModuleUser_EntityUser $oUser Объект пользователя, который голосует * @param ModuleBlog_EntityBlog $oBlog Объект блога * @param int $iValue * * @return int */ public function VoteBlog($oUser, $oBlog, $iValue) { if (!C::Get('plugin.simplerating.blog.vote')) { return 0; } if (!C::Get('plugin.simplerating.blog.dislike') && $iValue < 0) { return 0; } /** * Устанавливаем рейтинг блога */ $oBlog->setRating((double) $oBlog->getRating() + $iValue * (double) C::Get('plugin.simplerating.blog.add')); /** * Убавляем рейтинг голосующего, если нужно */ if (C::Get('plugin.simplerating.blog_user_remove')) { $oUser->setRating((double) $oUser->getRating() + (double) C::Get('plugin.simplerating.blog.user_remove')); $this->User_Update($oUser); } return (double) C::Get('plugin.simplerating.blog.add'); }
/** * Обновляет блог в БД * * @param ModuleBlog_EntityBlog $oBlog Объект блога * @return bool */ public function UpdateBlog(ModuleBlog_EntityBlog $oBlog) { $sql = "UPDATE " . Config::Get('db.table.blog') . " \n\t\t\tSET \n\t\t\t\tblog_title= ?,\n\t\t\t\tblog_description= ?,\n\t\t\t\tblog_type= ?,\n\t\t\t\tblog_date_edit= ?,\n\t\t\t\tblog_rating= ?f,\n\t\t\t\tblog_count_vote = ?d,\n\t\t\t\tblog_count_user= ?d,\n\t\t\t\tblog_count_topic= ?d,\n\t\t\t\tblog_limit_rating_topic= ?f ,\n\t\t\t\tblog_url= ?,\n\t\t\t\tblog_avatar= ?\n\t\t\tWHERE\n\t\t\t\tblog_id = ?d\n\t\t"; if ($this->oDb->query($sql, $oBlog->getTitle(), $oBlog->getDescription(), $oBlog->getType(), $oBlog->getDateEdit(), $oBlog->getRating(), $oBlog->getCountVote(), $oBlog->getCountUser(), $oBlog->getCountTopic(), $oBlog->getLimitRatingTopic(), $oBlog->getUrl(), $oBlog->getAvatar(), $oBlog->getId())) { return true; } return false; }
/** * Проверяет может ли пользователь голосовать за конкретный блог * * @param Entity_User $oUser * @param Entity_Blog $oBlog * @return bool */ public function CanVoteBlog(ModuleUser_EntityUser $oUser, ModuleBlog_EntityBlog $oBlog) { /** * Если блог закрытый, проверяем является ли пользователь его читателем */ if ($oBlog->getType() == 'close') { $oBlogUser = $this->Blog_GetBlogUserByBlogIdAndUserId($oBlog->getId(), $oUser->getId()); if (!$oBlogUser || $oBlogUser->getUserRole() < ModuleBlog::BLOG_USER_ROLE_GUEST) { return self::CAN_VOTE_BLOG_ERROR_CLOSE; } } if ($oUser->getRating() >= Config::Get('acl.vote.blog.rating')) { return self::CAN_VOTE_BLOG_TRUE; } return self::CAN_VOTE_BLOG_FALSE; }
/** * Вспомогательный метод проверки прав пользователя блога * * @param ModuleBlog_EntityBlog $oBlog * @param ModuleUser_EntityUser $oUser * @param string $sRights * * @return bool */ protected function _checkBlogUserRights($oBlog, $oUser, $sRights) { $sUserRole = ''; $bCurrentUser = false; $bResult = false; if (!$oBlog) { return false; } // Если пользователь не передан, то берется текущий if (!$oUser) { if ($oUser = E::ModuleUser()->GetUserCurrent()) { $bCurrentUser = true; } else { return false; } } elseif (E::ModuleUser()->GetUserCurrent() && E::ModuleUser()->GetUserCurrent()->getId() == $oUser->getId()) { $bCurrentUser = true; } $sCacheKey = 'acl_blog_user_rights' . serialize(array($oBlog->GetId(), $oUser ? $oUser->GetId() : 0, $bCurrentUser, $sRights)); // Сначала проверяем кеш if (is_int($xCacheResult = E::ModuleCache()->Get($sCacheKey, 'tmp'))) { return $xCacheResult; } if ($bCurrentUser) { // Blog owner has any rights if ($oBlog->getUserOwnerId() == $oUser->getId()) { return true; } // * Для авторизованного пользователя данный код будет работать быстрее if ($oBlog->getUserIsAdministrator()) { $sUserRole = 'administrator'; } elseif ($oBlog->getUserIsModerator()) { $sUserRole = 'moderator'; } } else { $oBlogUser = E::ModuleBlog()->GetBlogUserByBlogIdAndUserId($oBlog->getId(), $oUser->getId()); if ($oBlogUser) { if ($oBlogUser->IsBlogAdministrator()) { $sUserRole = 'administrator'; } elseif ($oBlogUser->IsBlogModerator()) { $sUserRole = 'moderator'; } } } if ($sUserRole) { $aUserRights = $this->GetUserRights('blogs', $sUserRole); $bResult = isset($aUserRights[$sRights]) && (bool) $aUserRights[$sRights]; } E::ModuleCache()->Set($sCacheKey, $bResult ? 1 : 0, array('blog_update', 'user_update'), 0, 'tmp'); return $bResult; }
/** * Обновляет блог * * @param ModuleBlog_EntityBlog $oBlog * @return unknown */ public function UpdateBlog(ModuleBlog_EntityBlog $oBlog) { $oBlog->setDateEdit(date("Y-m-d H:i:s")); $res = $this->oMapperBlog->UpdateBlog($oBlog); if ($res) { //чистим зависимые кеши $this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG, array('blog_update', "blog_update_{$oBlog->getId()}", "topic_update")); $this->Cache_Delete("blog_{$oBlog->getId()}"); return true; } return false; }
/** * Рассылает уведомления о новом топике подписчикам блога * * @param ModuleBlog_EntityBlog $oBlog Объект блога * @param ModuleTopic_EntityTopic $oTopic Объект топика * @param ModuleUser_EntityUser $oUserTopic Объект пользователя */ public function SendNotifyTopicNew($oBlog, $oTopic, $oUserTopic) { $aBlogUsersResult = E::ModuleBlog()->GetBlogUsersByBlogId($oBlog->getId(), null, null); // нужно постранично пробегаться по всем /** @var ModuleBlog_EntityBlogUser[] $aBlogUsers */ $aBlogUsers = $aBlogUsersResult['collection']; foreach ($aBlogUsers as $oBlogUser) { if ($oBlogUser->getUserId() == $oUserTopic->getId()) { continue; } E::ModuleNotify()->SendTopicNewToSubscribeBlog($oBlogUser->getUser(), $oTopic, $oBlog, $oUserTopic); } //отправляем создателю блога if ($oBlog->getOwnerId() != $oUserTopic->getId()) { E::ModuleNotify()->SendTopicNewToSubscribeBlog($oBlog->getOwner(), $oTopic, $oBlog, $oUserTopic); } }
/** * Отправляет юзеру уведомление о новом топике в блоге, в котором он состоит * * @param ModuleUser_EntityUser $oUserTo Объект пользователя кому отправляем * @param ModuleTopic_EntityTopic $oTopic Объект топика * @param ModuleBlog_EntityBlog $oBlog Объект блога * @param ModuleUser_EntityUser $oUserTopic Объект пользователя, написавшего топик * @return bool */ public function SendNotifyTopicNewToSubscribeBlog(ModuleUser_EntityUser $oUserTo, ModuleTopic_EntityTopic $oTopic, ModuleBlog_EntityBlog $oBlog, ModuleUser_EntityUser $oUserTopic) { /** * Проверяем можно ли юзеру рассылать уведомление */ if (!$oUserTo->getSettingsNoticeNewTopic()) { return false; } $this->Notify_Send($oUserTo, 'topic_new.tpl', $this->Lang_Get('emails.topic_new.subject') . ' «' . htmlspecialchars($oBlog->getTitle()) . '»', array('oUserTo' => $oUserTo, 'oTopic' => $oTopic, 'oBlog' => $oBlog, 'oUserTopic' => $oUserTopic)); return true; }
/** * Проверяет можно или нет пользователю управлять пользователями блога * * @param ModuleBlog_EntityBlog $oBlog Блог * @param ModuleUser_EntityUser $oUser Пользователь * @return bool */ public function IsAllowAdminBlog($oBlog, $oUser) { if ($oUser->isAdministrator()) { return true; } /** * Разрешаем если это создатель блога */ if ($oBlog->getOwnerId() == $oUser->getId()) { return true; } /** * Явлется ли авторизованный пользователь администратором блога */ $oBlogUser = $this->Blog_GetBlogUserByBlogIdAndUserId($oBlog->getId(), $oUser->getId()); if ($oBlogUser && $oBlogUser->getIsAdministrator()) { return true; } return false; }
/** * Обновляет блог в БД * * @param ModuleBlog_EntityBlog $oBlog Объект блога * * @return bool */ public function UpdateBlog($oBlog) { $sql = "\n UPDATE ?_blog\n SET\n blog_title = ?,\n blog_description = ?,\n blog_type = ?,\n blog_date_edit = ?,\n blog_rating = ?f,\n blog_count_vote = ?d,\n blog_count_user = ?d,\n blog_count_topic = ?d,\n blog_limit_rating_topic = ?f ,\n blog_url = ?,\n blog_avatar = ?\n WHERE\n blog_id = ?d\n "; $bResult = $this->oDb->query($sql, $oBlog->getTitle(), $oBlog->getDescription(), $oBlog->getType(), $oBlog->getDateEdit(), $oBlog->getRating(), $oBlog->getCountVote(), $oBlog->getCountUser(), $oBlog->getCountTopic(), $oBlog->getLimitRatingTopic(), $oBlog->getUrl(), $oBlog->getAvatar(), $oBlog->getId()); return $bResult !== false; }
/** * Расчет рейтинга и силы при голосовании за блог * * @param ModuleUser_EntityUser $oUser Объект пользователя, который голосует * @param ModuleBlog_EntityBlog $oBlog Объект блога * @param int $iValue * @return int */ public function VoteBlog(ModuleUser_EntityUser $oUser, ModuleBlog_EntityBlog $oBlog, $iValue) { $oBlog->setRating($oBlog->getRating() + $iValue); return $iValue; }
/** * Удаляет аватар блога с сервера * * @param ModuleBlog_EntityBlog $oBlog Блог */ public function DeleteBlogAvatar($oBlog) { /** * Если аватар есть, удаляем его и его рейсайзы */ if ($oBlog->getAvatar()) { $aSize = array_merge(Config::Get('module.blog.avatar_size'), array(48)); foreach ($aSize as $iSize) { $this->Image_RemoveFile($this->Image_GetServerPath($oBlog->getAvatarPath($iSize))); } } }
/** * Удаляет аватар блога с сервера * * @param ModuleBlog_EntityBlog $oBlog Блог */ public function DeleteBlogAvatar($oBlog) { /** * Если аватар есть, удаляем его и его рейсайзы */ if ($oBlog->getAvatar()) { $this->Media_RemoveImageBySizes($oBlog->getAvatar(), Config::Get('module.blog.avatar_size')); } $oBlog->setAvatar(null); }
/** * Расчет рейтинга и силы при голосовании за блог * * @param ModuleUser_EntityUser $oUser Объект пользователя, который голосует * @param ModuleBlog_EntityBlog $oBlog Объект блога * @param int $iValue * * @return int */ public function VoteBlog($oUser, $oBlog, $iValue) { if (!C::Get('plugin.rating.blog.vote')) { return 0; } if (!C::Get('plugin.rating.blog.dislike') && $iValue < 0) { return 0; } /** * Устанавливаем рейтинг блога, используя логарифмическое распределение */ $skill = $oUser->getSkill(); $iMinSize = C::Get('plugin.rating.blog.min_change'); //1.13; $iMaxSize = C::Get('plugin.rating.blog.max_change'); //15; $iSizeRange = $iMaxSize - $iMinSize; $iMinCount = log(0 + 1); $iMaxCount = log(C::Get('plugin.rating.blog.max_rating') + 1); //500 $iCountRange = $iMaxCount - $iMinCount; if ($iCountRange == 0) { $iCountRange = 1; } if ($skill > C::Get('plugin.rating.blog.left_border') and $skill < C::Get('plugin.rating.blog.right_border')) { //50-200 $skill_new = $skill / C::Get('plugin.rating.blog.mid_divider'); //20; } elseif ($skill >= C::Get('plugin.rating.blog.right_border')) { //200 $skill_new = $skill / C::Get('plugin.rating.blog.right_divider'); //10; } else { $skill_new = $skill / C::Get('plugin.rating.blog.left_divider'); //50; } $iDelta = $iMinSize + (log($skill_new + 1) - $iMinCount) * ($iSizeRange / $iCountRange); /** * Сохраняем рейтинг */ $oBlog->setRating($oBlog->getRating() + $iValue * $iDelta); return $iValue * $iDelta; }
/** * Расчет рейтинга и силы при голосовании за блог * * @param ModuleUser_EntityUser $oUser Объект пользователя, который голосует * @param ModuleBlog_EntityBlog $oBlog Объект блога * @param int $iValue * @return int */ public function VoteBlog(ModuleUser_EntityUser $oUser, ModuleBlog_EntityBlog $oBlog, $iValue) { /** * Устанавливаем рейтинг блога, используя логарифмическое распределение */ $skill = $oUser->getSkill(); $iMinSize = 1.13; $iMaxSize = 15; $iSizeRange = $iMaxSize - $iMinSize; $iMinCount = log(0 + 1); $iMaxCount = log(500 + 1); $iCountRange = $iMaxCount - $iMinCount; if ($iCountRange == 0) { $iCountRange = 1; } if ($skill > 50 and $skill < 200) { $skill_new = $skill / 20; } elseif ($skill >= 200) { $skill_new = $skill / 10; } else { $skill_new = $skill / 50; } $iDelta = $iMinSize + (log($skill_new + 1) - $iMinCount) * ($iSizeRange / $iCountRange); /** * Сохраняем рейтинг */ $oBlog->setRating($oBlog->getRating() + $iValue * $iDelta); return $iValue * $iDelta; }
/** * Рассылает уведомления о новом топике подписчикам блога * * @param ModuleBlog_EntityBlog $oBlog Объект блога * @param ModuleTopic_EntityTopic $oTopic Объект топика * @param ModuleUser_EntityUser $oUserTopic Объект пользователя */ public function SendNotifyTopicNew($oBlog, $oTopic, $oUserTopic) { $aBlogUsersResult = $this->Blog_GetBlogUsersByBlogId($oBlog->getId(), null, null); // нужно постранично пробегаться по всем $aBlogUsers = $aBlogUsersResult['collection']; foreach ($aBlogUsers as $oBlogUser) { if ($oBlogUser->getUserId() == $oUserTopic->getId()) { continue; } $this->Notify_SendTopicNewToSubscribeBlog($oBlogUser->getUser(), $oTopic, $oBlog, $oUserTopic); } //отправляем создателю блога if ($oBlog->getOwnerId() != $oUserTopic->getId()) { $this->Notify_SendTopicNewToSubscribeBlog($oBlog->getOwner(), $oTopic, $oBlog, $oUserTopic); } }
/** * Удаляет аватар блога с сервера * * @param ModuleBlog_EntityBlog $oBlog Блог */ public function DeleteAvatar($oBlog) { if ($oBlog) { // * Если аватар есть, удаляем его и его рейсайзы (старая схема) if ($sUrl = $oBlog->getAvatar()) { E::ModuleImg()->Delete(E::ModuleUploader()->Url2Dir($sUrl)); } // Deletes blog avatar from media resources E::ModuleMresource()->DeleteMresourcesRelByTarget('blog_avatar', $oBlog->getid()); } }
/** * Проверка полей блога * * @param 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; }
/** * Выполняет отправку приглашения в блог * (по внутренней почте и на email) * * @param ModuleBlog_EntityBlog $oBlog * @param ModuleUser_EntityUser $oUser */ protected function SendBlogInvite($oBlog, $oUser) { $sTitle = E::ModuleLang()->Get('blog_user_invite_title', array('blog_title' => $oBlog->getTitle())); F::IncludeLib('XXTEA/encrypt.php'); // Формируем код подтверждения в URL $sCode = $oBlog->getId() . '_' . $oUser->getId(); $sCode = rawurlencode(base64_encode(xxtea_encrypt($sCode, Config::Get('module.blog.encrypt')))); $aPath = array('accept' => R::GetPath('blog') . 'invite/accept/?code=' . $sCode, 'reject' => R::GetPath('blog') . 'invite/reject/?code=' . $sCode); // Сформируем название типа блога на языке приложения. // Это может быть либо название, либо текстовка. $sBlogType = mb_strtolower(preg_match('~^\\{\\{(.*)\\}\\}$~', $sBlogType = $oBlog->getBlogType()->getTypeName(), $aMatches) ? E::ModuleLang()->Get($aMatches[1]) : $sBlogType, 'UTF-8'); $sText = E::ModuleLang()->Get('blog_user_invite_text', array('login' => $this->oUserCurrent->getLogin(), 'accept_path' => $aPath['accept'], 'reject_path' => $aPath['reject'], 'blog_title' => $oBlog->getTitle(), 'blog_type' => $sBlogType)); $oTalk = E::ModuleTalk()->SendTalk($sTitle, $sText, $this->oUserCurrent, array($oUser), false, false); // Отправляем пользователю заявку E::ModuleNotify()->SendBlogUserInvite($oUser, $this->oUserCurrent, $oBlog, R::GetPath('talk') . 'read/' . $oTalk->getId() . '/'); // Удаляем отправляющего юзера из переписки E::ModuleTalk()->DeleteTalkUserByArray($oTalk->getId(), $this->oUserCurrent->getId()); }
/** * Выполняет отправку приглашения в блог * (по внутренней почте и на email) * * @param ModuleBlog_EntityBlog $oBlog * @param ModuleUser_EntityUser $oUser */ protected function SendBlogInvite($oBlog, $oUser) { $sTitle = $this->Lang_Get('blog_user_invite_title', array('blog_title' => $oBlog->getTitle())); require_once Config::Get('path.root.engine') . '/lib/external/XXTEA/encrypt.php'; $sCode = $oBlog->getId() . '_' . $oUser->getId(); $sCode = rawurlencode(base64_encode(xxtea_encrypt($sCode, Config::Get('module.blog.encrypt')))); $aPath = array('accept' => Router::GetPath('blog') . 'invite/accept/?code=' . $sCode, 'reject' => Router::GetPath('blog') . 'invite/reject/?code=' . $sCode); $sText = $this->Lang_Get('blog_user_invite_text', array('login' => $this->oUserCurrent->getLogin(), 'accept_path' => $aPath['accept'], 'reject_path' => $aPath['reject'], 'blog_title' => $oBlog->getTitle())); $oTalk = $this->Talk_SendTalk($sTitle, $sText, $this->oUserCurrent, array($oUser), false, false); /** * Отправляем пользователю заявку */ $this->Notify_SendBlogUserInvite($oUser, $this->oUserCurrent, $oBlog, Router::GetPath('talk') . 'read/' . $oTalk->getId() . '/'); /** * Удаляем отправляющего юзера из переписки */ $this->Talk_DeleteTalkUserByArray($oTalk->getId(), $this->oUserCurrent->getId()); }
/** * Обновляет блог в БД * * @param ModuleBlog_EntityBlog $oBlog Объект блога * @return bool */ public function UpdateBlog(ModuleBlog_EntityBlog $oBlog) { $sql = "UPDATE " . Config::Get('db.table.blog') . "\n\t\t\tSET \n\t\t\t\tblog_title= ?,\n\t\t\t\tblog_description= ?,\n\t\t\t\tblog_type= ?,\n\t\t\t\tblog_date_edit= ?,\n\t\t\t\tblog_count_vote = ?d,\n\t\t\t\tblog_count_user= ?d,\n\t\t\t\tblog_count_topic= ?d,\n\t\t\t\tblog_limit_rating_topic= ?f ,\n\t\t\t\tblog_url= ?,\n\t\t\t\tblog_skip_index= ?d,\n\t\t\t\tblog_avatar= ?\n\t\t\tWHERE\n\t\t\t\tblog_id = ?d\n\t\t"; $res = $this->oDb->query($sql, $oBlog->getTitle(), $oBlog->getDescription(), $oBlog->getType(), $oBlog->getDateEdit(), $oBlog->getCountVote(), $oBlog->getCountUser(), $oBlog->getCountTopic(), $oBlog->getLimitRatingTopic(), $oBlog->getUrl(), $oBlog->getSkipIndex(), $oBlog->getAvatar(), $oBlog->getId()); return $this->IsSuccessful($res); }