diff --git a/classes/modules/blog/Blog.class.php b/classes/modules/blog/Blog.class.php index ab1e09c3..74b86806 100644 --- a/classes/modules/blog/Blog.class.php +++ b/classes/modules/blog/Blog.class.php @@ -35,6 +35,101 @@ class LsBlog extends Module { $this->oMapperBlog->SetUserCurrent($this->User_GetUserCurrent()); $this->oUserCurrent=$this->User_GetUserCurrent(); } + /** + * Получает дополнительные данные(объекты) для блогов по их ID + * + */ + public function GetBlogsAdditionalData($aBlogId,$aAllowData=array('vote','owner')) { + func_array_simpleflip($aAllowData); + if (!is_array($aBlogId)) { + $aBlogId=array($aBlogId); + } + /** + * Получаем блоги + */ + $aBlogs=$this->GetBlogsByArrayId($aBlogId); + /** + * Формируем ID дополнительных данных, которые нужно получить + */ + $aUserId=array(); + foreach ($aBlogs as $oBlog) { + if (isset($aAllowData['owner'])) { + $aUserId[]=$oBlog->getOwnerId(); + } + } + /** + * Получаем дополнительные данные + */ + $aUsers=isset($aAllowData['owner']) && is_array($aAllowData['owner']) ? $this->User_GetUsersAdditionalData($aUserId,$aAllowData['owner']) : $this->User_GetUsersAdditionalData($aUserId); + /** + * Добавляем данные к результату - списку блогов + */ + foreach ($aBlogs as $oBlog) { + if (isset($aUsers[$oBlog->getOwnerId()])) { + $oBlog->setOwner($aUsers[$oBlog->getOwnerId()]); + } else { + $oBlog->setOwner(null); // или $oBlog->setOwner(new UserEntity_User()); + } + /** + * Права на блог + */ + $oBlog->setUserIsAdministrator(false); + $oBlog->setUserIsModerator(false); + if ($this->oUserCurrent and $oBlogUser=$this->GetRelationBlogUserByBlogIdAndUserId($oBlog->getId(),$this->oUserCurrent->getId())) { + if ($oBlogUser->getIsAdministrator()) { + $oBlog->setUserIsAdministrator(true); + } + if ($oBlogUser->getIsModerator()) { + $oBlog->setUserIsModerator(true); + } + } + /** + * + */ + } + + return $aBlogs; + } + /** + * Список блогов по ID + * + * @param array $aUserId + */ + public function GetBlogsByArrayId($aBlogId) { + if (!is_array($aBlogId)) { + $aBlogId=array($aBlogId); + } + $aBlogId=array_unique($aBlogId); + $aBlogs=array(); + /** + * Делаем мульти-запрос к кешу + */ + $aCacheKeys=func_array_change_value($aBlogId,'blog_'); + if (false !== ($data = $this->Cache_Get($aCacheKeys))) { + /** + * проверяем что досталось из кеша + */ + foreach ($aCacheKeys as $sKey ) { + if (isset($data[$sKey])) { + $aBlogs[$data[$sKey]->getId()]=$data[$sKey]; + } + } + } + /** + * Смотрим каких блогов не было в кеше и делаем запрос в БД + */ + $aBlogIdNeedQuery=array_diff($aBlogId,array_keys($aBlogs)); + if ($data = $this->oMapperBlog->GetBlogsByArrayId($aBlogIdNeedQuery)) { + foreach ($data as $oBlog) { + /** + * Добавляем к результату и сохраняем в кеш + */ + $aBlogs[$oBlog->getId()]=$oBlog; + $this->Cache_Set($oBlog, "blog_{$oBlog->getId()}", array("blog_update_{$oBlog->getId()}"), 60*60*24*4); + } + } + return $aBlogs; + } /** * Получить персональный блог юзера * @@ -51,7 +146,11 @@ class LsBlog extends Module { * @return unknown */ public function GetBlogById($sBlogId) { - return $this->oMapperBlog->GetBlogById($sBlogId); + $aBlogs=$this->GetBlogsAdditionalData($sId); + if (isset($aBlogs[$sId])) { + return $aBlogs[$sId]; + } + return null; } /** * Получить блог по УРЛу @@ -257,7 +356,7 @@ class LsBlog extends Module { if ($aBlogUser=$this->oMapperBlog->GetRelationBlogUsers($aFilter)) { return $aBlogUser[0]; } - return false; + return null; } /** * Список модеро вблога diff --git a/classes/modules/blog/entity/Blog.entity.class.php b/classes/modules/blog/entity/Blog.entity.class.php index fd66a832..9a2d092e 100644 --- a/classes/modules/blog/entity/Blog.entity.class.php +++ b/classes/modules/blog/entity/Blog.entity.class.php @@ -60,22 +60,12 @@ class BlogEntity_Blog extends Entity return $this->_aData['blog_avatar_type']; } - public function getUserLogin() { - return $this->_aData['user_login']; + + + public function getOwner() { + return $this->_aData['owner']; } - public function getUserProfileAvatar() { - return $this->_aData['user_profile_avatar']; - } - public function getUserProfileAvatarType() { - return $this->_aData['user_profile_avatar_type']; - } - public function getUserProfileAvatarPath($iSize=100) { - if ($this->getUserProfileAvatar()) { - return DIR_WEB_ROOT.DIR_UPLOADS_IMAGES.'/'.$this->getOwnerId().'/avatar_'.$iSize.'x'.$iSize.'.'.$this->getUserProfileAvatarType(); - } else { - return DIR_STATIC_SKIN.'/images/avatar_'.$iSize.'x'.$iSize.'.jpg'; - } - } + public function getUserIsVote() { return $this->_aData['user_is_vote']; } @@ -89,18 +79,23 @@ class BlogEntity_Blog extends Entity return DIR_STATIC_SKIN.'/images/avatar_blog_'.$iSize.'x'.$iSize.'.gif'; } } - public function getCurrentUserIsJoin() { - return $this->_aData['current_user_is_join']; + public function getUserIsJoin() { + return $this->_aData['user_is_join']; + } + public function getUserIsAdministrator() { + return $this->_aData['user_is_administrator']; + } + public function getUserIsModerator() { + return $this->_aData['user_is_moderator']; } public function getUrlFull() { if ($this->getType()=='personal') { - return DIR_WEB_ROOT.'/'.ROUTE_PAGE_MY.'/'.$this->getUserLogin().'/'; + return DIR_WEB_ROOT.'/'.ROUTE_PAGE_MY.'/'.$this->getOwner()->getLogin().'/'; } else { return DIR_WEB_ROOT.'/'.ROUTE_PAGE_BLOG.'/'.$this->getUrl().'/'; } } - - + public function setId($data) { $this->_aData['blog_id']=$data; @@ -144,5 +139,18 @@ class BlogEntity_Blog extends Entity public function setAvatarType($data) { $this->_aData['blog_avatar_type']=$data; } + + public function setOwner($data) { + $this->_aData['owner']=$data; + } + public function setUserIsAdministrator($data) { + $this->_aData['user_is_administrator']=$data; + } + public function setUserIsModerator($data) { + $this->_aData['user_is_moderator']=$data; + } + public function setUserIsJoin($data) { + $this->_aData['user_is_join']=$data; + } } ?> \ No newline at end of file diff --git a/classes/modules/blog/mapper/Blog.mapper.class.php b/classes/modules/blog/mapper/Blog.mapper.class.php index 0c4c63f6..6b1dee06 100644 --- a/classes/modules/blog/mapper/Blog.mapper.class.php +++ b/classes/modules/blog/mapper/Blog.mapper.class.php @@ -65,7 +65,27 @@ class Mapper_Blog extends Mapper { return false; } - + public function GetBlogsByArrayId($aArrayId) { + if (!is_array($aArrayId) or count($aArrayId)==0) { + return array(); + } + + $sql = "SELECT + b.* + FROM + ".DB_TABLE_BLOG." as b + WHERE + b.blog_id IN(?a) + ORDER BY FIELD(b.blog_id,?a) "; + $aBlogs=array(); + if ($aRows=$this->oDb->select($sql,$aArrayId,$aArrayId)) { + foreach ($aRows as $aBlog) { + $aBlogs[]=new BlogEntity_Blog($aBlog); + } + } + return $aBlogs; + } + public function AddRelationBlogUser(BlogEntity_BlogUser $oBlogUser) { $sql = "INSERT INTO ".DB_TABLE_BLOG_USER." (blog_id, diff --git a/classes/modules/topic/Topic.class.php b/classes/modules/topic/Topic.class.php index a251d360..0556b430 100644 --- a/classes/modules/topic/Topic.class.php +++ b/classes/modules/topic/Topic.class.php @@ -39,7 +39,7 @@ class LsTopic extends Module { * Получает дополнительные данные(объекты) для топиков по их ID * */ - public function GetTopicsAdditionalData($aTopicId,$aAllowData=array('user','blog','content','vote')) { + public function GetTopicsAdditionalData($aTopicId,$aAllowData=array('user','blog','vote','favourite','comment_new')) { func_array_simpleflip($aAllowData); if (!is_array($aTopicId)) { $aTopicId=array($aTopicId); @@ -52,7 +52,7 @@ class LsTopic extends Module { * Формируем ID дополнительных данных, которые нужно получить */ $aUserId=array(); - $aBlogId=array(); + $aBlogId=array(); foreach ($aTopics as $oTopic) { if (isset($aAllowData['user'])) { $aUserId[]=$oTopic->getUserId(); @@ -64,8 +64,22 @@ class LsTopic extends Module { /** * Получаем дополнительные данные */ + $aTopicsVote=array(); + $aFavouriteTopics=array(); + $aTopicsQuestionVote=array(); + $aCountCommentNew=array(); $aUsers=isset($aAllowData['user']) && is_array($aAllowData['user']) ? $this->User_GetUsersAdditionalData($aUserId,$aAllowData['user']) : $this->User_GetUsersAdditionalData($aUserId); $aBlogs=isset($aAllowData['blog']) && is_array($aAllowData['blog']) ? $this->Blog_GetBlogsAdditionalData($aBlogId,$aAllowData['blog']) : $this->Blog_GetBlogsAdditionalData($aBlogId); + if (isset($aAllowData['vote'])) { + $aTopicsVote=$this->GetTopicsVoteByArray($aTopicId,$this->oUserCurrent->getId()); + $aTopicsQuestionVote=$this->GetTopicsQuestionVoteByArray($aTopicId,$this->oUserCurrent->getId()); + } + if (isset($aAllowData['favourite'])) { + $aFavouriteTopics=$this->GetFavouriteTopicsByArray($aTopicId,$this->oUserCurrent->getId()); + } + if (isset($aAllowData['comment_new'])) { + $aCountCommentNew=$this->GetTopicsReadByArray($aTopicId,$this->oUserCurrent->getId()); + } /** * Добавляем данные к результату - списку топиков */ @@ -80,6 +94,27 @@ class LsTopic extends Module { } else { $oTopic->setBlog(null); // или $oTopic->setBlog(new BlogEntity_Blog()); } + if (isset($aTopicsVote[$oTopic->getId()])) { + $oTopic->setUserIsVote(true); + $oTopic->setUserVoteDelta($aTopicsVote[$oTopic->getId()]->getDelta()); + } else { + $oTopic->setUserIsVote(false); + } + if (isset($aFavouriteTopics[$oTopic->getId()])) { + $oTopic->setIsFavourite(true); + } else { + $oTopic->setIsFavourite(false); + } + if (isset($aTopicsQuestionVote[$oTopic->getId()])) { + $oTopic->setUserQuestionIsVote(true); + } else { + $oTopic->setUserQuestionIsVote(false); + } + if (isset($aCountCommentNew[$oTopic->getId()])) { + $oTopic->setCountCommentNew($oTopic->getCountComment()-$aCountCommentNew[$oTopic->getId()]->getCommentCountLast()); + } else { + $oTopic->setCountCommentNew(0); + } } return $aTopics; } @@ -189,8 +224,8 @@ class LsTopic extends Module { */ public function GetTopicById($sId) { $aTopics=$this->GetTopicsAdditionalData($sId); - if (count($aTopics)>0) { - return $aTopics[0]; + if (isset($aTopics[$sId])) { + return $aTopics[$sId]; } return null; } @@ -203,6 +238,7 @@ class LsTopic extends Module { if (!is_array($aTopicId)) { $aTopicId=array($aTopicId); } + $aTopicId=array_unique($aTopicId); $aTopics=array(); /** * Делаем мульти-запрос к кешу @@ -222,7 +258,7 @@ class LsTopic extends Module { * Смотрим каких топиков не было в кеше и делаем запрос в БД */ $aTopicIdNeedQuery=array_diff($aTopicId,array_keys($aTopics)); - if ($data = $this->oMapper->GetTopicsByArrayId($aTopicIdNeedQuery)) { + if ($data = $this->oMapperTopic->GetTopicsByArrayId($aTopicIdNeedQuery)) { foreach ($data as $oTopic) { /** * Добавляем к результату и сохраняем в кеш @@ -244,9 +280,10 @@ class LsTopic extends Module { */ public function GetTopicsFavouriteByUserId($sUserId,$iCurrPage,$iPerPage) { if (false === ($data = $this->Cache_Get("topic_favourite_user_{$sUserId}_{$iCurrPage}_{$iPerPage}"))) { - $data = array('collection'=>$this->GetTopicsAdditionalData($this->oMapperTopic->GetTopicsFavouriteByUserId($sUserId,$iCount,$iCurrPage,$iPerPage)),'count'=>$iCount); + $data = array('collection'=>$this->oMapperTopic->GetTopicsFavouriteByUserId($sUserId,$iCount,$iCurrPage,$iPerPage),'count'=>$iCount); $this->Cache_Set($data, "topic_favourite_user_{$sUserId}_{$iCurrPage}_{$iPerPage}", array('topic_update',"favourite_change_user_{$sUserId}"), 60*60*24*1); } + $data['collection']=$this->GetTopicsAdditionalData($data['collection']); return $data; } /** @@ -266,9 +303,10 @@ class LsTopic extends Module { protected function GetTopicsByFilter($aFilter,$iPage,$iPerPage) { $s=serialize($aFilter); if (false === ($data = $this->Cache_Get("topic_filter_{$s}_{$iPage}_{$iPerPage}"))) { - $data = array('collection'=>$this->GetTopicsAdditionalData($this->oMapperTopic->GetTopics($aFilter,$iCount,$iPage,$iPerPage)),'count'=>$iCount); + $data = array('collection'=>$this->oMapperTopic->GetTopics($aFilter,$iCount,$iPage,$iPerPage),'count'=>$iCount); $this->Cache_Set($data, "topic_filter_{$s}_{$iPage}_{$iPerPage}", array('topic_update','topic_new'), 60*60*24*3); } + $data['collection']=$this->GetTopicsAdditionalData($data['collection']); return $data; } @@ -533,9 +571,10 @@ class LsTopic extends Module { */ public function GetTopicsRatingByDate($sDate,$iLimit=20) { if (false === ($data = $this->Cache_Get("topic_rating_{$sDate}_{$iLimit}"))) { - $data = $this->GetTopicsAdditionalData($this->oMapperTopic->GetTopicsRatingByDate($sDate,$iLimit)); + $data = $this->oMapperTopic->GetTopicsRatingByDate($sDate,$iLimit); $this->Cache_Set($data, "topic_rating_{$sDate}_{$iLimit}", array('topic_update'), 60*60*24*2); } + $data=$this->GetTopicsAdditionalData($data); return $data; } /** @@ -632,9 +671,10 @@ class LsTopic extends Module { */ public function GetTopicsByTag($sTag,$iPage,$iPerPage) { if (false === ($data = $this->Cache_Get("topic_tag_{$sTag}_{$iPage}_{$iPerPage}"))) { - $data = array('collection'=>$this->GetTopicsAdditionalData($this->oMapperTopic->GetTopicsByTag($sTag,$iCount,$iPage,$iPerPage)),'count'=>$iCount); + $data = array('collection'=>$this->oMapperTopic->GetTopicsByTag($sTag,$iCount,$iPage,$iPerPage),'count'=>$iCount); $this->Cache_Set($data, "topic_tag_{$sTag}_{$iPage}_{$iPerPage}", array('topic_update','topic_new'), 60*15); } + $data['collection']=$this->GetTopicsAdditionalData($data['collection']); return $data; } /** @@ -658,7 +698,52 @@ class LsTopic extends Module { * @return unknown */ public function GetTopicVote($sTopicId,$sUserId) { - return $this->oMapperTopic->GetTopicVote($sTopicId,$sUserId); + $data=$this->GetTopicsVoteByArray($sTopicId,$sUserId); + if (isset($data[$sTopicId])) { + return $data[$sTopicId]; + } + return null; + } + + /** + * Получить список голосований за топик по списку айдишников + * + * @param unknown_type $aTopicId + */ + public function GetTopicsVoteByArray($aTopicId,$sUserId) { + if (!is_array($aTopicId)) { + $aTopicId=array($aTopicId); + } + $aTopicId=array_unique($aTopicId); + $aTopicsVote=array(); + /** + * Делаем мульти-запрос к кешу + */ + $aCacheKeys=func_array_change_value($aTopicId,'topic_vote_','_'.$sUserId); + if (false !== ($data = $this->Cache_Get($aCacheKeys))) { + /** + * проверяем что досталось из кеша + */ + foreach ($aCacheKeys as $sKey ) { + if (isset($data[$sKey])) { + $aTopicsVote[$data[$sKey]->getTopicId()]=$data[$sKey]; + } + } + } + /** + * Смотрим каких топиков не было в кеше и делаем запрос в БД + */ + $aTopicIdNeedQuery=array_diff($aTopicId,array_keys($aTopicsVote)); + if ($data = $this->oMapperTopic->GetTopicsVoteByArray($aTopicIdNeedQuery,$sUserId)) { + foreach ($data as $oTopicVote) { + /** + * Добавляем к результату и сохраняем в кеш + */ + $aTopicsVote[$oTopicVote->getTopicId()]=$oTopicVote; + $this->Cache_Set($oTopicVote, "topic_vote_{$oTopicVote->getTopicId()}_{$oTopicVote->getVoterId()}", array(), 60*60*24*4); + } + } + return $aTopicsVote; } /** * Увеличивает у топика число комментов @@ -678,7 +763,51 @@ class LsTopic extends Module { * @return unknown */ public function GetFavouriteTopic($sTopicId,$sUserId) { - return $this->oMapperTopic->GetFavouriteTopic($sTopicId,$sUserId); + $data=$this->GetFavouriteTopicsByArray($sTopicId,$sUserId); + if (isset($data[$sTopicId])) { + return $data[$sTopicId]; + } + return null; + } + /** + * Получить список избранного по списку айдишников + * + * @param unknown_type $aTopicId + */ + public function GetFavouriteTopicsByArray($aTopicId,$sUserId) { + if (!is_array($aTopicId)) { + $aTopicId=array($aTopicId); + } + $aTopicId=array_unique($aTopicId); + $aFavouriteTopics=array(); + /** + * Делаем мульти-запрос к кешу + */ + $aCacheKeys=func_array_change_value($aTopicId,'favourite_topic_','_'.$sUserId); + if (false !== ($data = $this->Cache_Get($aCacheKeys))) { + /** + * проверяем что досталось из кеша + */ + foreach ($aCacheKeys as $sKey ) { + if (isset($data[$sKey])) { + $aFavouriteTopics[$data[$sKey]->getTopicId()]=$data[$sKey]; + } + } + } + /** + * Смотрим каких топиков не было в кеше и делаем запрос в БД + */ + $aTopicIdNeedQuery=array_diff($aTopicId,array_keys($aFavouriteTopics)); + if ($data = $this->oMapperTopic->GetFavouriteTopicsByArray($aTopicIdNeedQuery,$sUserId)) { + foreach ($data as $oFavouriteTopic) { + /** + * Добавляем к результату и сохраняем в кеш + */ + $aFavouriteTopics[$oFavouriteTopic->getTopicId()]=$oFavouriteTopic; + $this->Cache_Set($oFavouriteTopic, "favourite_topic_{$oFavouriteTopic->getTopicId()}_{$oFavouriteTopic->getUserId()}", array(), 60*60*24*4); + } + } + return $aFavouriteTopics; } /** * Добавляет топик в избранное @@ -737,6 +866,46 @@ class LsTopic extends Module { */ public function GetTopicRead($sTopicId,$sUserId) { return $this->oMapperTopic->GetTopicRead($sTopicId,$sUserId); + } + /** + * Получить список просмотром/чтения топиков по списку айдишников + * + * @param unknown_type $aTopicId + */ + public function GetTopicsReadByArray($aTopicId,$sUserId) { + if (!is_array($aTopicId)) { + $aTopicId=array($aTopicId); + } + $aTopicId=array_unique($aTopicId); + $aTopicsRead=array(); + /** + * Делаем мульти-запрос к кешу + */ + $aCacheKeys=func_array_change_value($aTopicId,'topic_read_','_'.$sUserId); + if (false !== ($data = $this->Cache_Get($aCacheKeys))) { + /** + * проверяем что досталось из кеша + */ + foreach ($aCacheKeys as $sKey ) { + if (isset($data[$sKey])) { + $aTopicsRead[$data[$sKey]->getTopicId()]=$data[$sKey]; + } + } + } + /** + * Смотрим каких топиков не было в кеше и делаем запрос в БД + */ + $aTopicIdNeedQuery=array_diff($aTopicId,array_keys($aTopicsRead)); + if ($data = $this->oMapperTopic->GetTopicsReadByArray($aTopicIdNeedQuery,$sUserId)) { + foreach ($data as $oTopicRead) { + /** + * Добавляем к результату и сохраняем в кеш + */ + $aTopicsRead[$oTopicRead->getTopicId()]=$oTopicRead; + $this->Cache_Set($oTopicRead, "topic_read_{$oTopicRead->getTopicId()}_{$oTopicRead->getUserId()}", array(), 60*60*24*4); + } + } + return $aTopicsRead; } /** * Проверяет голосовал ли юзер за топик-вопрос @@ -746,7 +915,51 @@ class LsTopic extends Module { * @return unknown */ public function GetTopicQuestionVote($sTopicId,$sUserId) { - return $this->oMapperTopic->GetTopicQuestionVote($sTopicId,$sUserId); + $data=$this->GetTopicsQuestionVoteByArray($sTopicId,$sUserId); + if (isset($data[$sTopicId])) { + return $data[$sTopicId]; + } + return null; + } + /** + * Получить список голосований в топике-опросе по списку айдишников + * + * @param unknown_type $aTopicId + */ + public function GetTopicsQuestionVoteByArray($aTopicId,$sUserId) { + if (!is_array($aTopicId)) { + $aTopicId=array($aTopicId); + } + $aTopicId=array_unique($aTopicId); + $aTopicsQuestionVote=array(); + /** + * Делаем мульти-запрос к кешу + */ + $aCacheKeys=func_array_change_value($aTopicId,'topic_question_vote_','_'.$sUserId); + if (false !== ($data = $this->Cache_Get($aCacheKeys))) { + /** + * проверяем что досталось из кеша + */ + foreach ($aCacheKeys as $sKey ) { + if (isset($data[$sKey])) { + $aTopicsQuestionVote[$data[$sKey]->getTopicId()]=$data[$sKey]; + } + } + } + /** + * Смотрим каких топиков не было в кеше и делаем запрос в БД + */ + $aTopicIdNeedQuery=array_diff($aTopicId,array_keys($aTopicsQuestionVote)); + if ($data = $this->oMapperTopic->GetTopicsQuestionVoteByArray($aTopicIdNeedQuery,$sUserId)) { + foreach ($data as $oTopicVote) { + /** + * Добавляем к результату и сохраняем в кеш + */ + $aTopicsQuestionVote[$oTopicVote->getTopicId()]=$oTopicVote; + $this->Cache_Set($oTopicVote, "topic_question_vote_{$oTopicVote->getTopicId()}_{$oTopicVote->getVoterId()}", array(), 60*60*24*4); + } + } + return $aTopicsQuestionVote; } /** * Добавляет факт голосования за топик-вопрос @@ -766,5 +979,7 @@ class LsTopic extends Module { public function GetTopicUnique($sUserId,$sHash) { return $this->GetTopicsAdditionalData($this->oMapperTopic->GetTopicUnique($sUserId,$sHash)); } + + } ?> \ No newline at end of file diff --git a/classes/modules/topic/entity/Topic.entity.class.php b/classes/modules/topic/entity/Topic.entity.class.php index 9421ac99..f5e497f0 100644 --- a/classes/modules/topic/entity/Topic.entity.class.php +++ b/classes/modules/topic/entity/Topic.entity.class.php @@ -97,38 +97,25 @@ class TopicEntity_Topic extends Entity return $this->_aData['topic_text_hash']; } - - public function getCountCommentNew() { - return $this->_aData['count_comment_new']; - } public function getTagsArray() { return explode(',',$this->getTags()); } - public function getUserLogin() { - return $this->_aData['user_login']; + public function getCountCommentNew() { + return $this->_aData['count_comment_new']; + } + public function getUser() { + return $this->_aData['user']; } - public function getBlogType() { - return $this->_aData['blog_type']; - } - public function getBlogUrl() { - return $this->_aData['blog_url']; - } - public function getBlogTitle() { - return $this->_aData['blog_title']; + public function getBlog() { + return $this->_aData['blog']; } - public function getBlogUrlFull() { - if ($this->getBlogType()=='personal') { - return DIR_WEB_ROOT.'/'.ROUTE_PAGE_MY.'/'.$this->getUserLogin().'/'; - } else { - return DIR_WEB_ROOT.'/'.ROUTE_PAGE_BLOG.'/'.$this->getBlogUrl().'/'; - } - } + public function getUrl() { - if ($this->getBlogType()=='personal') { + if ($this->getBlog()->getType()=='personal') { return DIR_WEB_ROOT.'/'.ROUTE_PAGE_BLOG.'/'.$this->getId().'.html'; } else { - return DIR_WEB_ROOT.'/'.ROUTE_PAGE_BLOG.'/'.$this->getBlogUrl().'/'.$this->getId().'.html'; + return DIR_WEB_ROOT.'/'.ROUTE_PAGE_BLOG.'/'.$this->getBlog()->getUrl().'/'.$this->getId().'.html'; } } public function getUserIsVote() { @@ -139,16 +126,7 @@ class TopicEntity_Topic extends Entity } public function getUserQuestionIsVote() { return $this->_aData['user_question_is_vote']; - } - public function getUserIsBlogAdministrator() { - return $this->_aData['user_is_blog_administrator']; - } - public function getUserIsBlogModerator() { - return $this->_aData['user_is_blog_moderator']; - } - public function getBlogOwnerId() { - return $this->_aData['blog_owner_id']; - } + } public function getIsFavourite() { return $this->_aData['topic_is_favourite']; } @@ -381,5 +359,27 @@ class TopicEntity_Topic extends Entity public function setTextHash($data) { $this->_aData['topic_text_hash']=$data; } + + public function setUser($data) { + $this->_aData['user']=$data; + } + public function setBlog($data) { + $this->_aData['blog']=$data; + } + public function setUserQuestionIsVote($data) { + $this->_aData['user_question_is_vote']=$data; + } + public function setUserIsVote($data) { + $this->_aData['user_is_vote']=$data; + } + public function setUserVoteDelta($data) { + $this->_aData['user_vote_delta']=$data; + } + public function setCountCommentNew($data) { + $this->_aData['count_comment_new']=$data; + } + public function setIsFavourite($data) { + $this->_aData['topic_is_favourite']=$data; + } } ?> \ No newline at end of file diff --git a/classes/modules/topic/mapper/Topic.mapper.class.php b/classes/modules/topic/mapper/Topic.mapper.class.php index 1e262c0b..02254d9a 100644 --- a/classes/modules/topic/mapper/Topic.mapper.class.php +++ b/classes/modules/topic/mapper/Topic.mapper.class.php @@ -141,13 +141,13 @@ class Mapper_Topic extends Mapper { } $sql = "SELECT - t.* + t.*, + tc.* FROM - ".DB_TABLE_TOPIC." as t + ".DB_TABLE_TOPIC." as t + JOIN ".DB_TABLE_TOPIC_CONTENT." AS tc ON t.topic_id=tc.topic_id WHERE - t.topic_id IN(?a) - AND - t.publish = 1 + t.topic_id IN(?a) ORDER BY FIELD(t.topic_id,?a) "; $aTopics=array(); if ($aRows=$this->oDb->select($sql,$aArrayId,$aArrayId)) { @@ -281,6 +281,29 @@ class Mapper_Topic extends Mapper { return null; } + public function GetTopicsVoteByArray($aArrayId,$sUserId) { + if (!is_array($aArrayId) or count($aArrayId)==0) { + return array(); + } + + $sql = "SELECT + v.* + FROM + ".DB_TABLE_TOPIC_VOTE." as v + WHERE + v.user_voter_id = ?d + AND + v.topic_id IN(?a) + "; + $aVotes=array(); + if ($aRows=$this->oDb->select($sql,$sUserId,$aArrayId)) { + foreach ($aRows as $aRow) { + $aVotes[]=new TopicEntity_TopicVote($aRow); + } + } + return $aVotes; + } + public function increaseTopicCountComment($sTopicId) { $sql = "UPDATE ".DB_TABLE_TOPIC." SET @@ -419,6 +442,28 @@ class Mapper_Topic extends Mapper { return null; } + public function GetFavouriteTopicsByArray($aArrayId,$sUserId) { + if (!is_array($aArrayId) or count($aArrayId)==0) { + return array(); + } + $sql = "SELECT + f.* + FROM + ".DB_TABLE_FAVOURITE_TOPIC." as f + WHERE + f.user_id = ?d + AND + f.topic_id IN(?a) + "; + $aFavourites=array(); + if ($aRows=$this->oDb->select($sql,$sUserId,$aArrayId)) { + foreach ($aRows as $aRow) { + $aFavourites[]=new TopicEntity_FavouriteTopic($aRow); + } + } + return $aFavourites; + } + public function GetTopicsFavouriteByUserId($sUserId,&$iCount,$iCurrPage,$iPerPage) { $sql = " SELECT @@ -521,6 +566,29 @@ class Mapper_Topic extends Mapper { return false; } + public function GetTopicsReadByArray($aArrayId,$sUserId) { + if (!is_array($aArrayId) or count($aArrayId)==0) { + return array(); + } + + $sql = "SELECT + t.* + FROM + ".DB_TABLE_TOPIC_READ." as t + WHERE + t.user_id = ?d + AND + t.topic_id IN(?a) + "; + $aReads=array(); + if ($aRows=$this->oDb->select($sql,$sUserId,$aArrayId)) { + foreach ($aRows as $aRow) { + $aReads[]=new TopicEntity_TopicRead($aRow); + } + } + return $aReads; + } + public function AddTopicQuestionVote(TopicEntity_TopicQuestionVote $oTopicQuestionVote) { $sql = "INSERT INTO ".DB_TABLE_TOPIC_QUESTION_VOTE." (topic_id, @@ -543,5 +611,28 @@ class Mapper_Topic extends Mapper { } return null; } + + public function GetTopicsQuestionVoteByArray($aArrayId,$sUserId) { + if (!is_array($aArrayId) or count($aArrayId)==0) { + return array(); + } + + $sql = "SELECT + v.* + FROM + ".DB_TABLE_TOPIC_QUESTION_VOTE." as v + WHERE + v.user_voter_id = ?d + AND + v.topic_id IN(?a) + "; + $aVotes=array(); + if ($aRows=$this->oDb->select($sql,$sUserId,$aArrayId)) { + foreach ($aRows as $aRow) { + $aVotes[]=new TopicEntity_TopicQuestionVote($aRow); + } + } + return $aVotes; + } } ?> \ No newline at end of file diff --git a/classes/modules/user/User.class.php b/classes/modules/user/User.class.php index e34001ed..5f40f4e4 100644 --- a/classes/modules/user/User.class.php +++ b/classes/modules/user/User.class.php @@ -76,6 +76,7 @@ class LsUser extends Module { if (!is_array($aUserId)) { $aUserId=array($aUserId); } + $aUserId=array_unique($aUserId); $aUsers=array(); /** * Делаем мульти-запрос к кешу @@ -139,7 +140,12 @@ class LsUser extends Module { * @return unknown */ public function GetUserByActivateKey($sKey) { - return $this->oMapper->GetUserByActivateKey($sKey); + $id=$this->oMapper->GetUserByActivateKey($sKey); + $data=$this->GetUsersAdditionalData($id); + if ($id and isset($data[$id])) { + return $data[$id]; + } + return null; } /** * Получить юзера по ключу сессии @@ -148,7 +154,12 @@ class LsUser extends Module { * @return unknown */ public function GetUserByKey($sKey) { - return $this->oMapper->GetUserByKey($sKey); + $id=$this->oMapper->GetUserByKey($sKey); + $data=$this->GetUsersAdditionalData($id); + if ($id and isset($data[$id])) { + return $data[$id]; + } + return null; } /** * Получить юзера по мылу @@ -157,7 +168,12 @@ class LsUser extends Module { * @return unknown */ public function GetUserByMail($sMail) { - return $this->oMapper->GetUserByMail($sMail); + $id=$this->oMapper->GetUserByMail($sMail); + $data=$this->GetUsersAdditionalData($id); + if ($id and isset($data[$id])) { + return $data[$id]; + } + return null; } /** * Получить юзера по логину @@ -165,17 +181,19 @@ class LsUser extends Module { * @param unknown_type $sLogin * @return unknown */ - public function GetUserByLogin($sLogin) { - $s=strtolower($sLogin); - $s2=-1; - if ($this->oUserCurrent) { - $s2=$this->oUserCurrent->getId(); - } - if (false === ($data = $this->Cache_Get("user_login_{$s}_{$s2}"))) { - if ($data = $this->oMapper->GetUserByLogin($sLogin)) { - $this->Cache_Set($data, "user_login_{$s}_{$s2}", array("user_update_{$data->getId()}","frend_change_frend_{$data->getId()}"), 60*5); + public function GetUserByLogin($sLogin) { + $s=strtolower($sLogin); + if (false === ($data = $this->Cache_Get("user_login_{$s}"))) { + if ($id = $this->oMapper->GetUserByLogin($sLogin)) { + $this->Cache_Set($id, "user_login_{$s}", array(), 60*60*24*1); } } + if ($id) { + $data=$this->GetUsersAdditionalData($id); + if (isset($data[$id])) { + return $data[$id]; + } + } return $data; } /** @@ -184,12 +202,12 @@ class LsUser extends Module { * @param unknown_type $sId * @return unknown */ - public function GetUserById($sId) { - if (false === ($data = $this->Cache_Get("user_{$sId}"))) { - $data = $this->oMapper->GetUserById($sId); - $this->Cache_Set($data, "user_{$sId}", array("user_update_{$sId}"), 60*5); - } - return $data; + public function GetUserById($sId) { + $aUsers=$this->GetUsersAdditionalData($sId); + if (isset($aUsers[$sId])) { + return $aUsers[$sId]; + } + return null; } /** * Обновляет юзера diff --git a/classes/modules/user/mapper/User.mapper.class.php b/classes/modules/user/mapper/User.mapper.class.php index 0a9e3964..22f9c979 100644 --- a/classes/modules/user/mapper/User.mapper.class.php +++ b/classes/modules/user/mapper/User.mapper.class.php @@ -111,97 +111,74 @@ class Mapper_User extends Mapper { return false; } + public function GetUsersByArrayId($aArrayId) { + if (!is_array($aArrayId) or count($aArrayId)==0) { + return array(); + } + + $sql = "SELECT + u.* , + IF(ua.user_id IS NULL,0,1) as user_is_administrator + FROM + ".DB_TABLE_USER." as u + LEFT JOIN ".DB_TABLE_USER_ADMINISTRATOR." AS ua ON u.user_id=ua.user_id + WHERE + u.user_id IN(?a) + ORDER BY FIELD(u.user_id,?a) "; + $aUsers=array(); + if ($aRows=$this->oDb->select($sql,$aArrayId,$aArrayId)) { + foreach ($aRows as $aUser) { + $aUsers[]=new UserEntity_User($aUser); + } + } + return $aUsers; + } public function GetUserByActivateKey($sKey) { $sql = "SELECT - u.*, - IF(ua.user_id IS NULL,0,1) as user_is_administrator + u.user_id FROM - ".DB_TABLE_USER." as u - LEFT JOIN ".DB_TABLE_USER_ADMINISTRATOR." AS ua ON u.user_id=ua.user_id + ".DB_TABLE_USER." as u WHERE u.user_activate_key = ? "; if ($aRow=$this->oDb->selectRow($sql,$sKey)) { - return new UserEntity_User($aRow); + return $aRow['user_id']; } return null; } public function GetUserByKey($sKey) { $sql = "SELECT - u.*, - IF(ua.user_id IS NULL,0,1) as user_is_administrator + u.user_id FROM - ".DB_TABLE_USER." as u - LEFT JOIN ".DB_TABLE_USER_ADMINISTRATOR." AS ua ON u.user_id=ua.user_id + ".DB_TABLE_USER." as u WHERE u.user_key = ? "; if ($aRow=$this->oDb->selectRow($sql,$sKey)) { - return new UserEntity_User($aRow); - } - return null; - } - - public function GetUserById($sKey) { - $sql = "SELECT - u.*, - IF(ua.user_id IS NULL,0,1) as user_is_administrator - FROM - ".DB_TABLE_USER." as u - LEFT JOIN ".DB_TABLE_USER_ADMINISTRATOR." AS ua ON u.user_id=ua.user_id - WHERE - u.user_id = ? "; - if ($aRow=$this->oDb->selectRow($sql,$sKey)) { - return new UserEntity_User($aRow); + return $aRow['user_id']; } return null; } public function GetUserByMail($sMail) { $sql = "SELECT - u.*, - IF(ua.user_id IS NULL,0,1) as user_is_administrator + u.user_id FROM - ".DB_TABLE_USER." as u - LEFT JOIN ".DB_TABLE_USER_ADMINISTRATOR." AS ua ON u.user_id=ua.user_id + ".DB_TABLE_USER." as u WHERE u.user_mail = ? "; - if ($aRow=$this->oDb->selectRow($sql,strtolower($sMail))) { - return new UserEntity_User($aRow); + if ($aRow=$this->oDb->selectRow($sql,$sMail)) { + return $aRow['user_id']; } return null; } - public function GetUserByLogin($sLogin) { - $iCurrentUserId=-1; - if (is_object($this->oUserCurrent)) { - $iCurrentUserId=$this->oUserCurrent->getId(); - } + public function GetUserByLogin($sLogin) { $sql = "SELECT - u.*, - IF(uv.user_id IS NULL,0,1) as user_is_vote, - uv.vote_delta as user_vote_delta, - IF(uf.user_id IS NULL,0,1) as user_is_frend + u.user_id FROM - ".DB_TABLE_USER." as u - - LEFT JOIN ( - SELECT - user_id, - vote_delta - FROM ".DB_TABLE_USER_VOTE." - WHERE user_voter_id = ?d - ) AS uv ON uv.user_id = u.user_id - - LEFT JOIN ( - SELECT - user_id, - user_frend_id - FROM ".DB_TABLE_FRIEND." - WHERE user_id = ?d - ) AS uf ON uf.user_frend_id = u.user_id - + ".DB_TABLE_USER." as u WHERE u.user_login = ? "; - if ($aRow=$this->oDb->selectRow($sql,$iCurrentUserId,$iCurrentUserId,strtolower($sLogin))) { - return new UserEntity_User($aRow); + if ($aRow=$this->oDb->selectRow($sql,$sLogin)) { + return $aRow['user_id']; } return null; } diff --git a/templates/skin/new/topic_list.tpl b/templates/skin/new/topic_list.tpl index ab7ead0a..318857ec 100644 --- a/templates/skin/new/topic_list.tpl +++ b/templates/skin/new/topic_list.tpl @@ -1,5 +1,7 @@ {if count($aTopics)>0} - {foreach from=$aTopics item=oTopic} + {foreach from=$aTopics item=oTopic} + {assign var="oBlog" value=$oTopic->getBlog()} + {assign var="oUser" value=$oTopic->getUser()}
@@ -15,11 +17,11 @@ {/if} @@ -72,7 +74,7 @@ {if $oTopic->getType()=='link'} {/if} -
  • {$oTopic->getUserLogin()}
  • +
  • {$oUser->getLogin()}
  • {if $oTopic->getCountComment()>0} {$oTopic->getCountComment()}{if $oTopic->getCountCommentNew()}+{$oTopic->getCountCommentNew()}{/if}