control.php 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. <?php
  2. /**
  3. * The control file of message of ZenTaoPMS.
  4. *
  5. * @copyright Copyright 2009-2023 禅道软件(青岛)有限公司(ZenTao Software (Qingdao) Co., Ltd. www.cnezsoft.com)
  6. * @license ZPL(http://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
  7. * @author Yidong Wang <yidong@cnezsoft.com>
  8. * @package message
  9. * @version $Id$
  10. * @link https://www.zentao.net
  11. */
  12. class message extends control
  13. {
  14. /**
  15. * 主页。
  16. * Index.
  17. *
  18. * @access public
  19. * @return void
  20. */
  21. public function index()
  22. {
  23. foreach($this->lang->message->typeList as $type => $typeName)
  24. {
  25. if(isset($this->config->message->typeLink[$type]))
  26. {
  27. list($moduleName, $methodName) = explode('|', $this->config->message->typeLink[$type]);
  28. if(common::hasPriv($moduleName, $methodName)) $this->locate($this->createLink($moduleName, $methodName));
  29. }
  30. }
  31. if(common::hasPriv('message', 'setting')) $this->locate($this->createLink('message', 'setting'));
  32. }
  33. /**
  34. * 浏览器设置。
  35. * Browser setting.
  36. *
  37. * @access public
  38. * @return void
  39. */
  40. public function browser()
  41. {
  42. if($_POST)
  43. {
  44. $data = fixer::input('post')->get();
  45. $browserConfig = new stdclass();
  46. $browserConfig->turnon = $data->turnon;
  47. $browserConfig->pollTime = (int)$data->pollTime;
  48. if($browserConfig->turnon)
  49. {
  50. if(empty($browserConfig->pollTime)) $this->send(array('result' => 'fail', 'message' => array('pollTime' => sprintf($this->lang->error->notempty, $this->lang->message->browserSetting->pollTime))));
  51. if($browserConfig->pollTime < $this->config->message->browser->minPollTime) $this->send(array('result' => 'fail', 'message' => array('pollTime' => $this->lang->message->browserSetting->pollTimeTip)));
  52. }
  53. $this->loadModel('setting')->setItems('system.message.browser', $browserConfig);
  54. if(dao::isError()) $this->send(array('result' => 'fail', 'message' => dao::getError()));
  55. return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'load' => array('url' => $this->createLink('message', 'browser'), 'selector' => array('#header', '#mainContainer'))));
  56. }
  57. $this->view->title = $this->lang->message->browser;
  58. $this->view->browserConfig = $this->config->message->browser;
  59. $this->display();
  60. }
  61. /**
  62. * 消息设置。
  63. * Message setting.
  64. *
  65. * @access public
  66. * @return void
  67. */
  68. public function setting()
  69. {
  70. if(strtolower($this->server->request_method) == "post")
  71. {
  72. $data = fixer::input('post')->get();
  73. $data->messageSetting = !empty($data->messageSetting) ? json_encode($data->messageSetting) : '';
  74. $data->blockUser = !empty($data->blockUser) && is_array($data->blockUser) ? implode(',', $data->blockUser) : zget($data, 'blockUser', '');
  75. $this->loadModel('setting')->setItem('system.message.setting@' . $this->config->vision, $data->messageSetting);
  76. $this->setting->setItem('system.message.blockUser@' . $this->config->vision, $data->blockUser);
  77. return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'load' => true));
  78. }
  79. $users = $this->loadModel('user')->getPairs('noletter,noclosed');
  80. unset($users['']);
  81. $this->view->title = $this->lang->message->setting;
  82. $this->view->users = $users;
  83. $this->view->objectTypes = $this->message->getObjectTypes();
  84. $this->view->objectActions = $this->message->getObjectActions();
  85. $this->display();
  86. }
  87. /**
  88. * Ajax: 获取消息。
  89. * Ajax get message.
  90. *
  91. * @param string $windowBlur
  92. * @access public
  93. * @return void
  94. */
  95. public function ajaxGetMessage($windowBlur = 'false')
  96. {
  97. if($this->config->message->browser->turnon == 0) return;
  98. $this->message->deleteExpired();
  99. $todos = $this->message->batchSaveTodoNotice();
  100. $waitMessages = array_merge($todos, $this->message->getMessages('wait'));
  101. $unreadCount = $this->message->getUnreadCount();
  102. if(!$this->config->message->browser->show) return print(json_encode(array('newCount' => $unreadCount, 'showCount' => $this->config->message->browser->count)));
  103. if(empty($waitMessages)) return;
  104. $windowBlur = !empty($windowBlur) && $windowBlur != 'false';
  105. $messages = array();
  106. $newline = $windowBlur ? "\n" : '<br />';
  107. foreach($waitMessages as $message) $messages[$message->id] = $message->data;
  108. $this->dao->update(TABLE_NOTIFY)->set('status')->eq('sended')->set('sendTime')->eq(helper::now())->where('id')->in(array_keys($messages))->exec();
  109. foreach($messages as $id => $message)
  110. {
  111. preg_match_all("/<a href='([^\']+)'/", $message, $out);
  112. $link = count($out[1]) ? $out[1][0] : '';
  113. $message = $windowBlur ? strip_tags($message) : str_replace("<a href='$link'", "<a data-url='{$link}' href='###' onclick='clickMessage(this)'", $message);
  114. $message = preg_replace("/data-app='([^\']+)'/", '', $message);
  115. $browserMessages[] = $windowBlur ? array('text' => $message, 'url' => $link) : "<div class='browser-message-content'><span class='text-secondary-500' data-id={$id}>{$message}</span></div>";
  116. }
  117. echo json_encode(array('newCount' => $unreadCount, 'messages' => $browserMessages, 'showCount' => $this->config->message->browser->count));
  118. }
  119. /**
  120. * Ajax: 获取消息下拉菜单。
  121. * Ajax get dropmenu.
  122. *
  123. * @param string $active unread|all
  124. * @access public
  125. * @return void
  126. */
  127. public function ajaxGetDropmenu($active = 'unread')
  128. {
  129. $this->messageZen->assignDropmenuVars($active);
  130. $this->display();
  131. }
  132. /**
  133. * Ajax: 获取旧页面消息下拉菜单。
  134. * Ajax get dropmenu for old.
  135. *
  136. * @param string $active unread|all
  137. * @access public
  138. * @return void
  139. */
  140. public function ajaxGetDropmenuForOld($active = 'unread')
  141. {
  142. $this->messageZen->assignDropmenuVars($active);
  143. $this->display();
  144. }
  145. /**
  146. * Ajax: 标记消息已读。
  147. * Ajax mark read.
  148. *
  149. * @param string $messageID all|int
  150. * @access public
  151. * @return void
  152. */
  153. public function ajaxMarkRead($messageID)
  154. {
  155. if($messageID != 'all') $messageID = (int)$messageID;
  156. $this->dao->update(TABLE_NOTIFY)->set('status')->eq('read')->where('objectType')->eq('message')
  157. ->andWhere('toList')->eq(",{$this->app->user->account},")
  158. ->beginIF(is_int($messageID))->andWhere('id')->eq($messageID)->fi()
  159. ->exec();
  160. }
  161. /**
  162. * Ajax: 标记消息未读。
  163. * Ajax: Mark message to unread
  164. *
  165. * @param int $messageID
  166. * @access public
  167. * @return void
  168. */
  169. public function ajaxMarkUnread($messageID)
  170. {
  171. $messageID = (int)$messageID;
  172. $this->dao->update(TABLE_NOTIFY)->set('status')->eq('sended')->where('objectType')->eq('message')
  173. ->andWhere('toList')->eq(",{$this->app->user->account},")
  174. ->beginIF(is_int($messageID))->andWhere('id')->eq($messageID)->fi()
  175. ->exec();
  176. }
  177. /**
  178. * Ajax: 删除消息。
  179. * Ajax delete message.
  180. *
  181. * @param string $messageID all|allread|int
  182. * @access public
  183. * @return void
  184. */
  185. public function ajaxDelete($messageID)
  186. {
  187. if($messageID != 'all' && $messageID != 'allread') $messageID = (int)$messageID;
  188. $this->dao->delete()->from(TABLE_NOTIFY)->where('objectType')->eq('message')
  189. ->andWhere('toList')->eq(",{$this->app->user->account},")
  190. ->beginIF($messageID == 'allread')->andWhere('status')->eq('read')->fi()
  191. ->beginIF(is_int($messageID))->andWhere('id')->eq($messageID)->fi()
  192. ->exec();
  193. }
  194. /**
  195. * Ajax: 设置自己的消息配置。
  196. * Ajax: Set for oneself
  197. *
  198. * @access public
  199. * @return void
  200. */
  201. public function ajaxSetOneself()
  202. {
  203. if(empty($_POST)) return;
  204. $data = fixer::input('post')->setDefault('show', 0)->setDefault('count', 0)->get();
  205. if(!is_numeric($data->maxDays)) dao::$errors['maxDays'] = $this->lang->message->error->maxDaysFormat;
  206. if(strpos($data->maxDays, '.') !== false) dao::$errors['maxDays'] = $this->lang->message->error->maxDaysFormat;
  207. $data->maxDays = (int)$data->maxDays;
  208. if($data->maxDays < 0) dao::$errors['maxDays'] = $this->lang->message->error->maxDaysValue;
  209. if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
  210. $account = $this->app->user->account;
  211. $this->loadModel('setting')->setItems("{$account}.message.browser", $data);
  212. $this->config->message->browser->maxDays = $data->maxDays;
  213. $this->message->deleteExpired();
  214. $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'callback' => "reloadSettingModal({$data->count})"));
  215. }
  216. }