Msgs.php 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. <?php
  2. Lib::loadClass('RouteBase');
  3. /*
  4. ## Flash message system:
  5. System for automatic and custom messages for users.
  6. - `app_className` - for automatic msgs to search for msg text
  7. - `msg` - msg to show or to parse by `app_className`
  8. - `uiTargetType` - where to show this msg eg. 'default_db_table', 'after_login', 'everywhere'
  9. - `uiTargetName` - eg. database table name (if from default_db)
  10. - `userTargetType` - type of users allowed to see this msg eg. 'everyone', 'admin' (ADMIN_LEVEL=0?), 'user', 'group'
  11. - `userTargetName` - login, group name
  12. - `actionExecuted` - execution time if msg require user to run specific action (send msg.id in request)
  13. - `actionNotes` - notes/msgs/dbg for user actions executed from this msg
  14. Messages created by db triggers must define `app_className` that should parse `msg`. For example to use in FixProjectPath and FixZasobPath to keep correct paths.
  15. */
  16. class Route_Msgs extends RouteBase {
  17. public function handleAuth() {
  18. if (!User::logged()) {
  19. throw new HttpException('Unauthorized', 401);
  20. }
  21. }
  22. public function defaultAction() {
  23. SE_Layout::gora();
  24. ?>
  25. <div class="container">
  26. <h1>Messages system</h1>
  27. ...
  28. </div>
  29. <?php
  30. SE_Layout::dol();
  31. }
  32. public function reinstallAction() {
  33. $this->reinstall();
  34. die('OK');
  35. }
  36. public function runAction() {
  37. $msgId = V::get('_msgId', 0, $_REQUEST, 'int');
  38. if ($msgId > 0) {
  39. $this->runByMessageId($msgId);
  40. }
  41. $jsonData = new stdClass();
  42. $jsonData->type = 'success';
  43. $jsonData->msg = 'Gotowe';
  44. echo json_encode($jsonData);
  45. exit;
  46. }
  47. public function addTestMsgAction() {
  48. $sql = "INSERT INTO `CRM_UI_MSGS` (`ID`, `app_className`, `msg`, `msgType`, `uiTargetType`, `uiTargetName`, `userTargetType`, `userTargetName`, `actionExecutedTime`, `actionNotes`, `A_RECORD_CREATE_DATE`, `A_RECORD_CREATE_AUTHOR`, `A_RECORD_UPDATE_DATE`, `A_RECORD_UPDATE_AUTHOR`)
  49. VALUES (NULL, 'FixZasobPath', 'Update all paths', 'danger', 'default_db_table', 'CRM_LISTA_ZASOBOW', 'user', 'plabudda', NULL, '', NULL, 'plabudda', NULL, '')";
  50. $db = DB::getDB();
  51. $db->query($sql);
  52. die('OK');
  53. }
  54. public function reinstall() {
  55. $sqlList = array();
  56. $sqlList['RemoveTable'] = "DROP TABLE IF EXISTS `CRM_UI_MSGS`";
  57. $sqlList['InstallTable'] = "
  58. CREATE TABLE IF NOT EXISTS `CRM_UI_MSGS` (
  59. `ID` int(11) NOT NULL AUTO_INCREMENT
  60. -- app_className - for automatic msgs to search for msg text
  61. , `app_className` varchar(255) DEFAULT NULL
  62. -- msg - msg to show or to parse by app_className
  63. , `msg` varchar(255) NOT NULL
  64. , `msgType` enum('info','danger','warning','success') NOT NULL DEFAULT 'info'
  65. -- uiTargetType - where to show this msg eg. 'default_db_table', 'after_login', 'everywhere'
  66. , `uiTargetType` varchar(255) NOT NULL DEFAULT ''
  67. -- uiTargetName - eg. database table name (if from default_db)
  68. , `uiTargetName` varchar(255) NOT NULL DEFAULT ''
  69. -- userTargetType - type of users allowed to see this msg eg. 'everyone', 'admin' (ADMIN_LEVEL=0?), 'user', 'group'
  70. , `userTargetType` enum('none','everyone','admin','user','group') NOT NULL DEFAULT 'none'
  71. -- userTargetName - login, group name
  72. , `userTargetName` varchar(255) NOT NULL DEFAULT ''
  73. -- actionExecutedTime - execution time if msg require user to run specific action (send msg.id in request)
  74. , `actionExecutedTime` datetime DEFAULT NULL
  75. -- actionNotes - notes/msgs/dbg for user actions executed from this msg
  76. , `actionNotes` varchar(255) NOT NULL DEFAULT ''
  77. , `A_STATUS` enum('WAITING','NORMAL','OFF_HARD','DELETED') NOT NULL DEFAULT 'WAITING'
  78. , `A_RECORD_CREATE_DATE` datetime DEFAULT NULL
  79. , `A_RECORD_CREATE_AUTHOR` varchar(40) NOT NULL DEFAULT ''
  80. , `A_RECORD_UPDATE_DATE` datetime DEFAULT NULL
  81. , `A_RECORD_UPDATE_AUTHOR` varchar(40) NOT NULL DEFAULT ''
  82. , PRIMARY KEY (`ID`)
  83. , KEY `app_className` (`app_className`)
  84. ) ENGINE=MyISAM DEFAULT CHARSET=latin2
  85. ";
  86. $db = DB::getDB();
  87. if ($db->has_errors()) {
  88. throw new Exception("DB Errors: " . implode("\n<br>", $db->get_errors()));
  89. }
  90. foreach ($sqlList as $sqlName => $sql) {
  91. $res = $db->query($sql);
  92. if ($db->has_errors()) {
  93. throw new Exception("DB Errors at sql '{$sqlName}': " . implode("\n<br>", $db->get_errors()));
  94. }
  95. }
  96. }
  97. public function getActiveMessagesForTable($tblName) {
  98. if (empty($tblName)) return;
  99. $db = DB::getDB();
  100. $tblName = $db->_($tblName);
  101. $usrLogin = User::getLogin();
  102. $msgs = null;
  103. $sql = "select m.*
  104. from `CRM_UI_MSGS` m
  105. where m.`uiTargetType`='default_db_table'
  106. and m.`A_STATUS`='WAITING'
  107. and m.`uiTargetName`='{$tblName}'
  108. and (m.`userTargetType` in('everyone')
  109. or (m.`userTargetType`='user' and m.`userTargetName`='{$usrLogin}')
  110. -- TODO: use 'admin', 'group'
  111. )
  112. ";
  113. $db = DB::getDB();
  114. $res = $db->query($sql);
  115. while ($r = $db->fetch($res)) {
  116. if ($msg = $this->parseMessage($r)) {
  117. $msg['link'] = 'index.php?_route=Msgs&_task=run&_msgId=' . $r->ID;
  118. $msg['linkType'] = 'ajax';
  119. $msgs[$r->ID] = $msg;
  120. }
  121. }
  122. return $msgs;
  123. }
  124. public function parseMessage($r) {
  125. $msg = null;// ['type'=>'info', 'message'=>'...']
  126. // $r->app_className - for automatic msgs to search for msg text
  127. // $r->msg - for automatic msgs to search for msg text
  128. // $r->msgType - 'info','danger','warning','success'
  129. if (!empty($r->app_className)) {
  130. $route = Router::getRoute($r->app_className);
  131. $msg = array();
  132. $msg['message'] = $route->parseMessageFromMsgsSystem($r->msg);
  133. $msg['type'] = $r->msgType;
  134. } else {
  135. $msg = array();
  136. $msg['message'] = $this->parseMessageFromMsgsSystem($r->msg);
  137. $msg['type'] = $r->msgType;
  138. }
  139. return $msg;
  140. }
  141. public function parseMessageFromMsgsSystem($msg) {
  142. return $msg;
  143. }
  144. public function runByMessageId($id) {
  145. $msgRow = $this->getActiveMessage($id);
  146. $execNotes = '';
  147. if (!empty($msgRow->app_className)) {
  148. $route = Router::getRoute($msgRow->app_className);
  149. $route->runByMessageFromMsgsSystem($msgRow->msg, $execNotes);
  150. }
  151. $this->forceFinishMessage($id, $execNotes);
  152. }
  153. public function getMessage($id) {
  154. if (empty($id)) return;
  155. $id = intval($id);
  156. if ($id <= 0) return;
  157. $msg = null;
  158. $sql = "select * from `CRM_UI_MSGS` where `ID`='{$id}' ";
  159. $db = DB::getDB();
  160. $res = $db->query($sql);
  161. if ($r = $db->fetch($res)) {
  162. $msg = $r;
  163. }
  164. return $msg;
  165. }
  166. public function getActiveMessage($id) {
  167. if (empty($id)) return;
  168. $id = intval($id);
  169. if ($id <= 0) return;
  170. $msg = null;
  171. $sql = "select m.*
  172. from `CRM_UI_MSGS` m
  173. where m.`ID`='{$id}'
  174. and m.`A_STATUS`='WAITING'
  175. ";
  176. $db = DB::getDB();
  177. $res = $db->query($sql);
  178. if ($r = $db->fetch($res)) {
  179. $msg = $r;
  180. }
  181. if (!$msg) {
  182. throw new HttpException("Message not found", 404);
  183. }
  184. return $msg;
  185. }
  186. public function forceFinishMessage($id, $execNotes) {
  187. if (empty($id)) return;
  188. $id = intval($id);
  189. if ($id <= 0) return;
  190. $usrLogin = User::getLogin();
  191. $db = DB::getDB();
  192. $execNotes = $db->_($execNotes);
  193. $sql = "update `CRM_UI_MSGS`
  194. set `A_STATUS`='OFF_HARD'
  195. , `actionExecutedTime`=NOW()
  196. , `actionNotes`='{$execNotes}'
  197. , `A_RECORD_UPDATE_DATE`=NOW()
  198. , `A_RECORD_UPDATE_AUTHOR`='{$usrLogin}'
  199. where `ID`='{$id}'
  200. ";
  201. $db->query($sql);
  202. return;
  203. }
  204. public function removeMessage($id) {
  205. if (empty($id)) return;
  206. $id = intval($id);
  207. if ($id <= 0) return;
  208. $sql = "update `CRM_UI_MSGS` set `A_STATUS`='DELETED' where `ID`='{$id}' ";
  209. $db = DB::getDB();
  210. $db->query($sql);
  211. }
  212. }