PageRenderTime 62ms CodeModel.GetById 25ms RepoModel.GetById 1ms app.codeStats 1ms

/plugins/gamerpress/classes/modules/topic/Topic.class.php

https://bitbucket.org/devall/gamerpress
PHP | 235 lines | 175 code | 4 blank | 56 comment | 34 complexity | 9014ca33491fe068d5ff76c1d89bff73 MD5 | raw file
  1. <?php
  2. /*-------------------------------------------------------
  3. *
  4. * Copyright © 2012 Alexei Yelizarov
  5. *
  6. *--------------------------------------------------------
  7. */
  8. /**
  9. * Модуль для работы с топиками
  10. *
  11. * @package modules.topic
  12. * @since 0.1
  13. */
  14. class PluginGamerpress_ModuleTopic extends PluginGamerpress_Inherit_ModuleTopic {
  15. /**
  16. * Добавляет топик
  17. *
  18. * @param ModuleTopic_EntityTopic $oTopic Объект топика
  19. * @return ModuleTopic_EntityTopic|bool
  20. */
  21. public function AddTopic(ModuleTopic_EntityTopic $oTopic) {
  22. if ($sId=$this->oMapperTopic->AddTopic($oTopic)) {
  23. $oTopic->setId($sId);
  24. if ($oTopic->getPublish() and $oTopic->getTags()) {
  25. $aTags=explode(',',$oTopic->getTags());
  26. foreach ($aTags as $sTag) {
  27. $oTag=Engine::GetEntity('Topic_TopicTag');
  28. $oTag->setTopicId($oTopic->getId());
  29. $oTag->setUserId($oTopic->getUserId());
  30. $oTag->setBlogId($oTopic->getBlogId());
  31. $oTag->setGameId($oTopic->getGameId());
  32. $oTag->setText($sTag);
  33. $this->AddTopicTag($oTag);
  34. }
  35. }
  36. //чистим зависимые кеши
  37. $this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,array('topic_new',"topic_update_user_{$oTopic->getUserId()}","topic_new_blog_{$oTopic->getBlogId()}"));
  38. return $oTopic;
  39. }
  40. return false;
  41. }
  42. /**
  43. * Список топиков из игр
  44. *
  45. * @param PluginGamerpress_ModuleGame_EntityGame $oGame Объект игры
  46. * @param int $iPage Номер страницы
  47. * @param int $iPerPage Количество элементов на страницу
  48. * @param string $sShowType Тип выборки топиков
  49. * @param string $sPeriod Период в виде секунд или конкретной даты
  50. * @return array
  51. */
  52. public function GetTopicsByGame($oGame,$iPage,$iPerPage,$sShowType='good',$sPeriod=null) {
  53. if (is_numeric($sPeriod)) {
  54. // количество последних секунд
  55. $sPeriod=date("Y-m-d H:00:00",time()-$sPeriod);
  56. }
  57. $aFilter=array(
  58. 'topic_publish' => 1,
  59. 'game_id' => $oGame->getId(),
  60. );
  61. if ($sPeriod) {
  62. $aFilter['topic_date_more'] = $sPeriod;
  63. }
  64. switch ($sShowType) {
  65. case 'good':
  66. $aFilter['topic_rating']=array(
  67. 'value' => Config::Get('module.blog.collective_good'),
  68. 'type' => 'top',
  69. );
  70. break;
  71. case 'bad':
  72. $aFilter['topic_rating']=array(
  73. 'value' => Config::Get('module.blog.collective_good'),
  74. 'type' => 'down',
  75. );
  76. break;
  77. case 'new':
  78. $aFilter['topic_new']=date("Y-m-d H:00:00",time()-Config::Get('module.topic.new_time'));
  79. break;
  80. case 'newall':
  81. // нет доп фильтра
  82. break;
  83. case 'discussed':
  84. $aFilter['order']=array('t.topic_count_comment desc','t.topic_id desc');
  85. break;
  86. case 'top':
  87. $aFilter['order']=array('t.topic_rating desc','t.topic_id desc');
  88. break;
  89. default:
  90. break;
  91. }
  92. return $this->GetTopicsByFilter($aFilter,$iPage,$iPerPage);
  93. }
  94. /**
  95. * Получает число новых топиков из игры
  96. *
  97. * @param PluginGamerpress_ModuleGame_EntityGame $oGame Объект игры
  98. * @return int
  99. */
  100. public function GetCountTopicsByGameNew($oGame) {
  101. $sDate=date("Y-m-d H:00:00",time()-Config::Get('module.topic.new_time'));
  102. $aFilter=array(
  103. 'topic_publish' => 1,
  104. 'game_id' => $oGame->getId(),
  105. 'topic_new' => $sDate,
  106. );
  107. return $this->GetCountTopicsByFilter($aFilter);
  108. }
  109. /**
  110. * Получает дополнительные данные(объекты) для топиков по их ID
  111. *
  112. * @param array $aTopicId Список ID топиков
  113. * @param array|null $aAllowData Список типов дополнительных данных, которые нужно подключать к топикам
  114. * @return array
  115. */
  116. public function GetTopicsAdditionalData($aTopicId,$aAllowData=null) {
  117. if (is_null($aAllowData)) {
  118. $aAllowData=array(
  119. 'user'=>array(),
  120. 'blog'=>array('owner'=>array(),'relation_user'),
  121. 'game'=>array('owner'=>array(),'relation_user'),
  122. 'vote',
  123. 'favourite',
  124. 'comment_new'
  125. );
  126. }
  127. func_array_simpleflip($aAllowData);
  128. if (!is_array($aTopicId)) {
  129. $aTopicId=array($aTopicId);
  130. }
  131. /**
  132. * Получаем "голые" топики
  133. */
  134. $aTopics=$this->GetTopicsByArrayId($aTopicId);
  135. /**
  136. * Формируем ID дополнительных данных, которые нужно получить
  137. */
  138. $aUserId=array();
  139. $aBlogId=array();
  140. $aGameId=array();
  141. $aTopicIdQuestion=array();
  142. $aPhotoMainId=array();
  143. foreach ($aTopics as $oTopic) {
  144. if (isset($aAllowData['user'])) {
  145. $aUserId[]=$oTopic->getUserId();
  146. }
  147. if (isset($aAllowData['blog'])) {
  148. $aBlogId[]=$oTopic->getBlogId();
  149. }
  150. if (isset($aAllowData['game'])) {
  151. $aGameId[]=$oTopic->getGameId();
  152. }
  153. if ($oTopic->getType()=='question') {
  154. $aTopicIdQuestion[]=$oTopic->getId();
  155. }
  156. if ($oTopic->getType()=='photoset' and $oTopic->getPhotosetMainPhotoId()) {
  157. $aPhotoMainId[]=$oTopic->getPhotosetMainPhotoId();
  158. }
  159. }
  160. /**
  161. * Получаем дополнительные данные
  162. */
  163. $aTopicsVote=array();
  164. $aFavouriteTopics=array();
  165. $aTopicsQuestionVote=array();
  166. $aTopicsRead=array();
  167. $aUsers=isset($aAllowData['user']) && is_array($aAllowData['user']) ? $this->User_GetUsersAdditionalData($aUserId,$aAllowData['user']) : $this->User_GetUsersAdditionalData($aUserId);
  168. $aBlogs=isset($aAllowData['blog']) && is_array($aAllowData['blog']) ? $this->Blog_GetBlogsAdditionalData($aBlogId,$aAllowData['blog']) : $this->Blog_GetBlogsAdditionalData($aBlogId);
  169. $aGames=isset($aAllowData['game']) && is_array($aAllowData['game']) ? $this->PluginGamerpress_Game_GetGamesAdditionalData($aGameId,$aAllowData['game']) : $this->PluginGamerpress_Game_GetGamesAdditionalData($aGameId);
  170. if (isset($aAllowData['vote']) and $this->oUserCurrent) {
  171. $aTopicsVote=$this->Vote_GetVoteByArray($aTopicId,'topic',$this->oUserCurrent->getId());
  172. $aTopicsQuestionVote=$this->GetTopicsQuestionVoteByArray($aTopicIdQuestion,$this->oUserCurrent->getId());
  173. }
  174. if (isset($aAllowData['favourite']) and $this->oUserCurrent) {
  175. $aFavouriteTopics=$this->GetFavouriteTopicsByArray($aTopicId,$this->oUserCurrent->getId());
  176. }
  177. if (isset($aAllowData['comment_new']) and $this->oUserCurrent) {
  178. $aTopicsRead=$this->GetTopicsReadByArray($aTopicId,$this->oUserCurrent->getId());
  179. }
  180. $aPhotosetMainPhotos=$this->GetTopicPhotosByArrayId($aPhotoMainId);
  181. /**
  182. * Добавляем данные к результату - списку топиков
  183. */
  184. foreach ($aTopics as $oTopic) {
  185. if (isset($aUsers[$oTopic->getUserId()])) {
  186. $oTopic->setUser($aUsers[$oTopic->getUserId()]);
  187. } else {
  188. $oTopic->setUser(null); // или $oTopic->setUser(new ModuleUser_EntityUser());
  189. }
  190. if (isset($aBlogs[$oTopic->getBlogId()])) {
  191. $oTopic->setBlog($aBlogs[$oTopic->getBlogId()]);
  192. } else {
  193. $oTopic->setBlog(null); // или $oTopic->setBlog(new ModuleBlog_EntityBlog());
  194. }
  195. if (isset($aGames[$oTopic->getGameId()])) {
  196. $oTopic->setGame($aGames[$oTopic->getGameId()]);
  197. } else {
  198. $oTopic->setGame(null); // или $oTopic->setGame(new PluginGamerpress_ModuleGame_EntityGame());
  199. }
  200. if (isset($aTopicsVote[$oTopic->getId()])) {
  201. $oTopic->setVote($aTopicsVote[$oTopic->getId()]);
  202. } else {
  203. $oTopic->setVote(null);
  204. }
  205. if (isset($aFavouriteTopics[$oTopic->getId()])) {
  206. $oTopic->setFavourite($aFavouriteTopics[$oTopic->getId()]);
  207. } else {
  208. $oTopic->setFavourite(null);
  209. }
  210. if (isset($aTopicsQuestionVote[$oTopic->getId()])) {
  211. $oTopic->setUserQuestionIsVote(true);
  212. } else {
  213. $oTopic->setUserQuestionIsVote(false);
  214. }
  215. if (isset($aTopicsRead[$oTopic->getId()])) {
  216. $oTopic->setCountCommentNew($oTopic->getCountComment()-$aTopicsRead[$oTopic->getId()]->getCommentCountLast());
  217. $oTopic->setDateRead($aTopicsRead[$oTopic->getId()]->getDateRead());
  218. } else {
  219. $oTopic->setCountCommentNew(0);
  220. $oTopic->setDateRead(date("Y-m-d H:i:s"));
  221. }
  222. if (isset($aPhotosetMainPhotos[$oTopic->getPhotosetMainPhotoId()])) {
  223. $oTopic->setPhotosetMainPhoto($aPhotosetMainPhotos[$oTopic->getPhotosetMainPhotoId()]);
  224. } else {
  225. $oTopic->setPhotosetMainPhoto(null);
  226. }
  227. }
  228. return $aTopics;
  229. }
  230. }
  231. ?>