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

/application/controllers/ItemController.php

http://rsslounge.googlecode.com/
PHP | 357 lines | 200 code | 59 blank | 98 comment | 29 complexity | c0cab5f66442adc076f29279592f102a MD5 | raw file
  1. <?php
  2. /**
  3. * Controller for listing and editing items (messages and images)
  4. *
  5. * @package application_controllers
  6. * @copyright Copyright (c) Tobias Zeising (http://www.aditu.de)
  7. * @license GPLv3 (http://www.gnu.org/licenses/gpl-3.0.html)
  8. */
  9. class ItemController extends Zend_Controller_Action {
  10. /**
  11. * Initialize controller (set language object, base etc.)
  12. *
  13. * @return void
  14. */
  15. public function init() {
  16. // initialize view
  17. $view = $this->initView();
  18. // set language
  19. $view->language = Zend_Registry::get('language');
  20. // set translate object
  21. $view->translate()->setTranslator($view->language);
  22. // no automatic view rendering
  23. Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer')->setNoRender(true);
  24. }
  25. /**
  26. * shows a list of items
  27. * will be called on every change of settings and
  28. * returns the messages and images
  29. *
  30. * @return void
  31. */
  32. public function listAction() {
  33. $isJson = $this->getRequest()->getParam('json', false);
  34. // load current settings
  35. $settingsModel = new application_models_settings();
  36. $currentSettings = array();
  37. foreach($settingsModel->fetchAll() as $setting)
  38. $currentSettings[$setting->name] = $setting->value;
  39. // read settings
  40. $settings = $this->getRequest()->getPost();
  41. $settings = array_merge($currentSettings,$settings);
  42. // get list template vars
  43. $listHelper = Zend_Controller_Action_HelperBroker::getStaticHelper('list');
  44. try {
  45. $listHelper->readItems($settings);
  46. $listHelper->setTemplateVars($this->view);
  47. } catch(Exception $e) {
  48. $this->_helper->json(array( 'error' => $e->getMessage()));
  49. }
  50. // save settings
  51. if(Zend_Registry::get('config')->demomode!="1" && Zend_Registry::get('session')->authenticated===true) {
  52. $settingsModel->save( array(
  53. 'currentPriorityStart' => $settings['currentPriorityStart'],
  54. 'currentPriorityEnd' => $settings['currentPriorityEnd'],
  55. 'view' => $settings['view'],
  56. 'selected' => $settings['selected'],
  57. 'unread' => $settings['unread'],
  58. 'starred' => $settings['starred'],
  59. 'sort' => $settings['sort']
  60. ) );
  61. }
  62. // get unread items
  63. $itemCounter = Zend_Controller_Action_HelperBroker::getStaticHelper('itemcounter');
  64. // return items
  65. $feedModel = new application_models_feeds();
  66. $result = array(
  67. 'html' => utf8_encode(utf8_decode($this->view->render('item/list.'.Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer')->getViewSuffix()))),
  68. 'categories' => $itemCounter->unreadItemsCategories($settings),
  69. 'feeds' => $itemCounter->unreadItemsFeeds($settings),
  70. 'starred' => $itemCounter->starredItems($settings),
  71. 'all' => $itemCounter->allItems($settings),
  72. 'countfeeds' => $feedModel->count(Zend_Registry::get('session')->currentPriorityStart,
  73. Zend_Registry::get('session')->currentPriorityEnd,
  74. Zend_Registry::get('session')->view)
  75. );
  76. if($isJson==true) {
  77. unset($result['html']);
  78. $result['messages'] = $listHelper->getMessages();
  79. $result['moremessages'] = $listHelper->hasMoreMessages();
  80. $result['multimedia'] = $listHelper->getMultimedia();
  81. $result['moremultimedia'] = $listHelper->hasMoreMultimedia();
  82. }
  83. $this->_helper->json($result);
  84. }
  85. /**
  86. * list more items
  87. * will be executed on clicking on more
  88. *
  89. * @return void
  90. */
  91. public function listmoreAction() {
  92. // load current settings
  93. $settingsModel = new application_models_settings();
  94. $currentSettings = array();
  95. foreach($settingsModel->fetchAll() as $setting)
  96. $currentSettings[$setting->name] = $setting->value;
  97. // read settings
  98. $settings = $this->getRequest()->getParams();
  99. $settings = array_merge($currentSettings,$settings);
  100. // get items
  101. $result = $this->listItems($settings);
  102. // show items
  103. $this->_helper->json($result);
  104. }
  105. /**
  106. * mark as read
  107. * sends a new image or message to client
  108. * if only unread items filter set
  109. *
  110. * @return void
  111. */
  112. public function markAction() {
  113. // get item
  114. $item = $this->getItem();
  115. if($item===false)
  116. return;
  117. // toggle item mark
  118. if($item->unread==1)
  119. $item->unread = 0;
  120. else
  121. $item->unread = 1;
  122. $item->save();
  123. // get next item only unread items visible?
  124. $itemCounter = Zend_Controller_Action_HelperBroker::getStaticHelper('itemcounter');
  125. $settings = $this->getRequest()->getParams();
  126. $result = array();
  127. if($settings['unread'] == 1) {
  128. // load next item (if item exists)
  129. $settings['offset'] = $this->getRequest()->getParam('items');
  130. $settings['itemsperpage'] = 1;
  131. $result = $this->listItems($settings);
  132. }
  133. // return unread items
  134. $result['categories'] = $itemCounter->unreadItemsCategories();
  135. $result['feeds'] = $itemCounter->unreadItemsFeeds();
  136. $result['starred'] = $itemCounter->starredItems();
  137. $this->_helper->json($result);
  138. }
  139. /**
  140. * mark all as read
  141. *
  142. * @return void
  143. */
  144. public function markallAction() {
  145. $items = $this->getRequest()->getParam('items');
  146. if(!is_array($items))
  147. $items = array();
  148. // mark items as read
  149. $itemModel = new application_models_items();
  150. $itemModel->markAsRead($items);
  151. unset($items);
  152. // count items of all categories
  153. $itemCounter = Zend_Controller_Action_HelperBroker::getStaticHelper('itemcounter');
  154. $items = $itemCounter->unreadItemsCategories();
  155. // no more unread items available?
  156. if(count($items)==1)
  157. $this->_helper->json(array(
  158. 'success' => true,
  159. 'next' => '0'
  160. ));
  161. // get current selected cat or feed
  162. $selected = Zend_Registry::get('session')->selected;
  163. if(strlen($selected)==0)
  164. $selected = 'cat_0';
  165. // category selected?
  166. if(strlen($selected)>4 && substr($selected,0,4)=='cat_') {
  167. $current = substr($selected,4);
  168. $type = 'cat_';
  169. }
  170. // feed selected?
  171. if(strlen($selected)>5 && substr($selected,0,5)=='feed_') {
  172. $items = $itemCounter->unreadItemsFeeds();
  173. $current = substr($selected,5);
  174. $type = 'feed_';
  175. }
  176. // other unread items found and current has no more unread items
  177. if(!array_key_exists($current, $items) && count($items)>0) {
  178. $keys = array_keys($items);
  179. $this->_helper->json(array(
  180. 'success' => true,
  181. 'next' => $type.$keys[0]
  182. ));
  183. // current has more unread items
  184. } else
  185. $this->_helper->json(array(
  186. 'success' => true,
  187. 'next' => $selected
  188. ));
  189. }
  190. /**
  191. * mark as starred
  192. *
  193. * @return void
  194. */
  195. public function starAction() {
  196. // get item
  197. $item = $this->getItem();
  198. if($item===false)
  199. return;
  200. // toggle item mark
  201. if($item->starred==1)
  202. $item->starred = 0;
  203. else
  204. $item->starred = 1;
  205. $item->save();
  206. // return starred items
  207. $itemCounter = Zend_Controller_Action_HelperBroker::getStaticHelper('itemcounter');
  208. $result['starred'] = $itemCounter->starredItems();
  209. $this->_helper->json($result);
  210. }
  211. /**
  212. * unstarr all
  213. *
  214. * @return void
  215. */
  216. public function unstarrallAction() {
  217. $items = $this->getRequest()->getParam('items');
  218. if(!is_array($items))
  219. $this->_helper->json(true);
  220. $items = array_unique($items);
  221. // mark items as unstarred
  222. $itemModel = new application_models_items();
  223. foreach($items as $id) {
  224. $item = $itemModel->find($id);
  225. if($item->count()>0) {
  226. $item->current()->starred = 0;
  227. $item->current()->save();
  228. }
  229. }
  230. $this->_helper->json(true);
  231. }
  232. /**
  233. * list more items
  234. *
  235. * @return array with items
  236. * @param array $settings current settings
  237. */
  238. public function listItems($settings) {
  239. $isJson = $this->getRequest()->getParam('json', false);
  240. // get items
  241. $listHelper = Zend_Controller_Action_HelperBroker::getStaticHelper('list');
  242. try {
  243. $listHelper->readItems($settings);
  244. } catch(Exception $e) {
  245. return array( 'error' => $e->getMessage());
  246. }
  247. // create html for message and return as json
  248. $return = array();
  249. if($settings['offset']>0 && $settings['view']=='messages') {
  250. if($isJson==true) {
  251. $return['messages'] = $listHelper->getMessages();
  252. $return['more'] = $listHelper->hasMoreMessages();
  253. } else {
  254. // render message items
  255. $return['messages'] = $this->view->partialLoop(
  256. 'item/message-item.'.Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer')->getViewSuffix(),
  257. $listHelper->getMessages()
  258. );
  259. // indicates whether more items available or not
  260. $return['more'] = $listHelper->hasMoreMessages();
  261. }
  262. }
  263. // create html for multimedia and return as json
  264. if($settings['offset']>0 && $settings['view']=='multimedia') {
  265. if($isJson==true) {
  266. $return['multimedia'] = $listHelper->getMultimedia();
  267. $return['more'] = $listHelper->hasMoreMultimedia();
  268. } else {
  269. // render multimedia items
  270. $return['multimedia'] = $this->view->partialLoop(
  271. 'item/multimedia-item.'.Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer')->getViewSuffix(),
  272. $listHelper->getMultimedia()
  273. );
  274. // indicates whether more items available or not
  275. $return['more'] = $listHelper->hasMoreMultimedia();
  276. }
  277. }
  278. return $return;
  279. }
  280. /**
  281. * validates given item id and returns item row object
  282. *
  283. * @return Zend_Db_Table_Row|bool false on error or item row object
  284. */
  285. protected function getItem() {
  286. // get id
  287. $id = $this->getRequest()->getParam('id');
  288. // search and validate given id
  289. $itemModel = new application_models_items();
  290. $item = $itemModel->find($id);
  291. if($item->count()==0)
  292. $this->_helper->json(array(
  293. 'error' => $this->view->translate('invalid item id')
  294. ));
  295. else
  296. return $item->current();
  297. }
  298. }