PageRenderTime 54ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 0ms

/plugins/lsgallery/classes/modules/album/Album.class.php

https://bitbucket.org/devall/gamerpress
PHP | 381 lines | 242 code | 36 blank | 103 comment | 41 complexity | 152c1091b02b7bbd6454749cd4423505 MD5 | raw file
  1. <?php
  2. class PluginLsgallery_ModuleAlbum extends Module
  3. {
  4. /**
  5. *
  6. * @var PluginLsgallery_ModuleAlbum_MapperAlbum
  7. */
  8. protected $oMapper;
  9. /**
  10. *
  11. * @var ModuleUser_EntityUser
  12. */
  13. protected $oUserCurrent = null;
  14. public function Init()
  15. {
  16. $this->oMapper = Engine::GetMapper(__CLASS__);
  17. $this->oUserCurrent = $this->User_GetUserCurrent();
  18. }
  19. /**
  20. * Create album
  21. *
  22. * @param PluginLsgallery_ModuleAlbum_EntityAlbum $oAlbum
  23. * @return boolean|PluginLsgallery_ModuleAlbum_EntityAlbum
  24. */
  25. public function CreateAlbum($oAlbum)
  26. {
  27. $oAlbum->setDateAdd();
  28. if ($sId = $this->oMapper->CreateAlbum($oAlbum)) {
  29. $oAlbum->setId($sId);
  30. $this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG, array('album_new'));
  31. return $oAlbum;
  32. }
  33. return false;
  34. }
  35. /**
  36. * Update album
  37. *
  38. * @param PluginLsgallery_ModuleAlbum_EntityAlbum $oAlbum
  39. * @return boolean
  40. */
  41. public function UpdateAlbum($oAlbum)
  42. {
  43. $oAlbum->setDateEdit();
  44. if ($this->oMapper->UpdateAlbum($oAlbum)) {
  45. //чистим зависимые кеши
  46. $this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG, array('album_update', "album_update_{$oAlbum->getId()}", "image_update"));
  47. $this->Cache_Delete("album_{$oAlbum->getId()}");
  48. return true;
  49. }
  50. return false;
  51. }
  52. /**
  53. * Delete album
  54. * @param int|PluginLsgallery_ModuleAlbum_EntityAlbum $iAlbumId
  55. * @return boolean
  56. */
  57. public function DeleteAlbum($iAlbumId)
  58. {
  59. if ($iAlbumId instanceof PluginLsgallery_ModuleAlbum_EntityAlbum) {
  60. $iAlbumId = $iAlbumId->getId();
  61. }
  62. $aResult = $this->PluginLsGallery_Image_GetImagesByAlbumId($iAlbumId);
  63. if (!$this->oMapper->DeleteAlbum($iAlbumId)) {
  64. return false;
  65. }
  66. if ($aResult['count']) {
  67. $aImages = $aResult['collection'];
  68. $aImagesId = array_keys($aImages);
  69. foreach ($aImages as $oImage) {
  70. $this->PluginLsGallery_Image_DeleteImageFiles($oImage);
  71. }
  72. $this->Vote_DeleteVoteByTarget($aImagesId, 'image');
  73. $this->Favourite_DeleteFavouriteByTargetId($aImagesId, 'image');
  74. $this->Comment_DeleteCommentByTargetId($aImagesId, 'image');
  75. }
  76. /**
  77. * Чистим кеш
  78. */
  79. $this->Cache_Clean(
  80. Zend_Cache::CLEANING_MODE_MATCHING_TAG, array(
  81. "album_update", "image_update", "comment_update"
  82. )
  83. );
  84. $this->Cache_Delete("album_{$iAlbumId}");
  85. return true;
  86. }
  87. /**
  88. * Get album by Id
  89. *
  90. * @param string $sAlbumId
  91. * @return PluginLsgallery_ModuleAlbum_EntityAlbum|null
  92. */
  93. public function GetAlbumById($sAlbumId)
  94. {
  95. $aAlbums = $this->GetAlbumsAdditionalData($sAlbumId);
  96. if (isset($aAlbums[$sAlbumId])) {
  97. return $aAlbums[$sAlbumId];
  98. }
  99. return null;
  100. }
  101. /**
  102. * Get albums additional data
  103. *
  104. * @todo Подтягивание картинок
  105. * @param array $aAlbumsId
  106. * @param array $aAllowData
  107. * @return array
  108. */
  109. public function GetAlbumsAdditionalData($aAlbumsId, $aAllowData = array('user' => array(), 'cover' => array()))
  110. {
  111. func_array_simpleflip($aAllowData);
  112. if (!is_array($aAlbumsId)) {
  113. $aAlbumsId = array($aAlbumsId);
  114. }
  115. $aAlbums = $this->GetAlbumsByArrayId($aAlbumsId);
  116. $aUserId = array();
  117. $aImageId = array();
  118. foreach ($aAlbums as $oAlbum) {
  119. /* @var $oAlbum PluginLsgallery_ModuleAlbum_EntityAlbum */
  120. if (isset($aAllowData['user'])) {
  121. $aUserId[] = $oAlbum->getUserId();
  122. }
  123. if (isset($aAllowData['cover'])) {
  124. $aImageId[] = $oAlbum->getCoverId();
  125. }
  126. }
  127. $aUsers = isset($aAllowData['user']) && is_array($aAllowData['user']) ? $this->User_GetUsersAdditionalData($aUserId, $aAllowData['user']) : $this->User_GetUsersAdditionalData($aUserId);
  128. $aImages = isset($aAllowData['cover']) && is_array($aAllowData['cover']) ? $this->PluginLsgallery_Image_GetImagesAdditionalData($aImageId, $aAllowData['cover']) : $this->PluginLsgallery_Image_GetImagesAdditionalData($aUserId);
  129. foreach ($aAlbums as $oAlbum) {
  130. if (isset($aUsers[$oAlbum->getUserId()])) {
  131. $oAlbum->setUser($aUsers[$oAlbum->getUserId()]);
  132. } else {
  133. $oAlbum->setUser(null);
  134. }
  135. if (isset($aImages[$oAlbum->getCoverId()])) {
  136. $oAlbum->setCover($aImages[$oAlbum->getCoverId()]);
  137. } else {
  138. $oAlbum->setCover(null);
  139. }
  140. }
  141. return $aAlbums;
  142. }
  143. /**
  144. * Get albums by array Id
  145. *
  146. * @param array $aAlbumId
  147. * @return array
  148. */
  149. public function GetAlbumsByArrayId($aAlbumId)
  150. {
  151. if (!$aAlbumId) {
  152. return array();
  153. }
  154. if (Config::Get('sys.cache.solid')) {
  155. return $this->GetAlbumsByArrayIdSolid($aAlbumId);
  156. }
  157. if (!is_array($aAlbumId)) {
  158. $aAlbumId = array($aAlbumId);
  159. }
  160. $aAlbumId = array_unique($aAlbumId);
  161. $aAlbums = array();
  162. $aAlbumIdNotNeedQuery = array();
  163. /**
  164. * Делаем мульти-запрос к кешу
  165. */
  166. $aCacheKeys = func_build_cache_keys($aAlbumId, 'album_');
  167. if (false !== ($data = $this->Cache_Get($aCacheKeys))) {
  168. /**
  169. * проверяем что досталось из кеша
  170. */
  171. foreach ($aCacheKeys as $sValue => $sKey) {
  172. if (array_key_exists($sKey, $data)) {
  173. if ($data[$sKey]) {
  174. $aAlbums[$data[$sKey]->getId()] = $data[$sKey];
  175. } else {
  176. $aAlbumIdNotNeedQuery[] = $sValue;
  177. }
  178. }
  179. }
  180. }
  181. $aAlbumIdNeedQuery = array_diff($aAlbumId, array_keys($aAlbums));
  182. $aAlbumIdNeedQuery = array_diff($aAlbumIdNeedQuery, $aAlbumIdNotNeedQuery);
  183. $aAlbumIdNeedStore = $aAlbumIdNeedQuery;
  184. if ($data = $this->oMapper->GetAlbumsByArrayId($aAlbumIdNeedQuery)) {
  185. foreach ($data as $oAlbum) {
  186. /**
  187. * Добавляем к результату и сохраняем в кеш
  188. */
  189. $aAlbums[$oAlbum->getId()] = $oAlbum;
  190. $this->Cache_Set($oAlbum, "album_{$oAlbum->getId()}", array(), 60 * 60 * 24 * 4);
  191. $aAlbumIdNeedStore = array_diff($aAlbumIdNeedStore, array($oAlbum->getId()));
  192. }
  193. }
  194. /**
  195. * Сохраняем в кеш запросы не вернувшие результата
  196. */
  197. foreach ($aAlbumIdNeedStore as $sId) {
  198. $this->Cache_Set(null, "album_{$sId}", array(), 60 * 60 * 24 * 4);
  199. }
  200. /**
  201. * Сортируем результат согласно входящему массиву
  202. */
  203. $aAlbums = func_array_sort_by_keys($aAlbums, $aAlbumId);
  204. return $aAlbums;
  205. }
  206. /**
  207. * Get albums by array id from solid cache
  208. *
  209. * @param array $aAlbumId
  210. * @return array
  211. */
  212. public function GetAlbumsByArrayIdSolid($aAlbumId)
  213. {
  214. if (!is_array($aAlbumId)) {
  215. $aAlbumId = array($aAlbumId);
  216. }
  217. $aAlbumId = array_unique($aAlbumId);
  218. $aAlbums = array();
  219. $s = join(',', $aAlbumId);
  220. if (false === ($data = $this->Cache_Get("album_id_{$s}"))) {
  221. $data = $this->oMapper->GetAlbumsByArrayId($aAlbumId);
  222. foreach ($data as $oAlbum) {
  223. $aAlbums[$oAlbum->getId()] = $oAlbum;
  224. }
  225. $this->Cache_Set($aAlbums, "album_id_{$s}", array("album_update"), 60 * 60 * 24 * 1);
  226. return $aAlbums;
  227. }
  228. return $data;
  229. }
  230. /**
  231. * Get albums for list
  232. *
  233. * @param int $iPage
  234. * @param int $iPerPage
  235. * @param boolean $bMy
  236. * @return \PluginLsgallery_ModuleAlbum_EntityAlbum
  237. */
  238. public function GetAlbumsIndex($iPage, $iPerPage, $bMy = false)
  239. {
  240. $aFilter = array(
  241. 'album_type' => array(
  242. 'open' => true
  243. ),
  244. 'not_empty' => true
  245. );
  246. if ($this->oUserCurrent) {
  247. $aFriends = $this->User_GetUsersFriend($this->oUserCurrent->getId());
  248. if (count($aFriends)) {
  249. $aFilter['album_type']['friend'] = array_keys($aFriends);
  250. }
  251. }
  252. return $this->GetAlbumsByFilter($aFilter, $iPage, $iPerPage);
  253. }
  254. /**
  255. * Get albims by filter
  256. *
  257. * @param array $aFilter
  258. * @param int $iPage
  259. * @param int $iPerPage
  260. * @param array $aAllowData
  261. * @param boolean $bOnlyIds
  262. * @return \PluginLsgallery_ModuleAlbum_EntityAlbum
  263. */
  264. public function GetAlbumsByFilter($aFilter, $iPage = 0, $iPerPage = 0, $aAllowData = array('user' => array(), 'cover' => array()), $bOnlyIds = false)
  265. {
  266. $s = serialize($aFilter);
  267. if (false === ($data = $this->Cache_Get("album_filter_{$s}_{$iPage}_{$iPerPage}"))) {
  268. $data = ($iPage * $iPerPage != 0) ? array(
  269. 'collection' => $this->oMapper->GetAlbums($aFilter, $iCount, $iPage, $iPerPage),
  270. 'count' => $iCount
  271. ) : array(
  272. 'collection' => $this->oMapper->GetAllAlbums($aFilter),
  273. 'count' => $this->GetCountAlbumsByFilter($aFilter)
  274. );
  275. $this->Cache_Set($data, "album_filter_{$s}_{$iPage}_{$iPerPage}", array('album_update', 'album_new'), 60 * 60 * 24 * 3);
  276. }
  277. if (!$bOnlyIds) {
  278. $data['collection'] = $this->GetAlbumsAdditionalData($data['collection'], $aAllowData);
  279. }
  280. return $data;
  281. }
  282. /**
  283. * Get count aldums by filter
  284. *
  285. * @param array $aFilter
  286. * @return int
  287. */
  288. public function GetCountAlbumsByFilter($aFilter)
  289. {
  290. $s = serialize($aFilter);
  291. if (false === ($data = $this->Cache_Get("album_count_{$s}"))) {
  292. $data = $this->oMapper->GetCountAlbums($aFilter);
  293. $this->Cache_Set($data, "album_count_{$s}", array('album_update', 'album_new'), 60 * 60 * 24 * 1);
  294. }
  295. return $data;
  296. }
  297. /**
  298. * Get user aldums
  299. *
  300. * @param string $sUserId
  301. * @param int $iPage
  302. * @param int $iPerPage
  303. * @return \PluginLsgallery_ModuleAlbum_EntityAlbum
  304. */
  305. public function GetAlbumsPersonalByUser($sUserId, $iPage = 0, $iPerPage = 0)
  306. {
  307. $aFilter = array(
  308. 'user_id' => $sUserId,
  309. 'album_type' => array(
  310. 'open'
  311. ),
  312. );
  313. if ($this->oUserCurrent) {
  314. if ($this->oUserCurrent->getId() == $sUserId) {
  315. unset($aFilter['album_type']);
  316. } else {
  317. $aFriends = $this->User_GetUsersFriend($this->oUserCurrent->getId());
  318. if (count($aFriends)) {
  319. $aFilter['album_type']['friend'] = array_keys($aFriends);
  320. }
  321. }
  322. }
  323. return $this->GetAlbumsByFilter($aFilter, $iPage, $iPerPage);
  324. }
  325. public function GetCountAlbumsPersonalByUser($sUserId)
  326. {
  327. $aFilter = array(
  328. 'user_id' => $sUserId,
  329. 'album_type' => array(
  330. 'open'
  331. ),
  332. );
  333. if ($this->oUserCurrent) {
  334. if ($this->oUserCurrent->getId() == $sUserId) {
  335. unset($aFilter['album_type']);
  336. } else {
  337. $aFriends = $this->User_GetUsersFriend($this->oUserCurrent->getId());
  338. if (count($aFriends)) {
  339. $aFilter['album_type']['friend'] = array_keys($aFriends);
  340. }
  341. }
  342. }
  343. return $this->GetCountAlbumsByFilter($aFilter);
  344. }
  345. }