BxDolStudioRolesQuery.php 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. <?php defined('BX_DOL') or die('hack attempt');
  2. /**
  3. * Copyright (c) UNA, Inc - https://una.io
  4. * MIT License - https://opensource.org/licenses/MIT
  5. *
  6. * @defgroup UnaStudio UNA Studio
  7. * @{
  8. */
  9. class BxDolStudioRolesQuery extends BxDolDb implements iBxDolSingleton
  10. {
  11. public function __construct()
  12. {
  13. if (isset($GLOBALS['bxDolClasses'][get_class($this)]))
  14. trigger_error ('Multiple instances are not allowed for the class: ' . get_class($this), E_USER_ERROR);
  15. parent::__construct();
  16. }
  17. public function __clone()
  18. {
  19. if (isset($GLOBALS['bxDolClasses'][get_class($this)]))
  20. trigger_error('Clone is not allowed for the class: ' . get_class($this), E_USER_ERROR);
  21. }
  22. static function getInstance()
  23. {
  24. if(!isset($GLOBALS['bxDolClasses'][__CLASS__]))
  25. $GLOBALS['bxDolClasses'][__CLASS__] = new BxDolStudioRolesQuery();
  26. return $GLOBALS['bxDolClasses'][__CLASS__];
  27. }
  28. public function setRole ($iAccountId, $iRole)
  29. {
  30. $sBindings = array(
  31. 'account_id' => $iAccountId,
  32. 'role' => $iRole
  33. );
  34. if(!$this->query("REPLACE INTO `sys_std_roles_members` SET `account_id`=:account_id, `role`=:role", $sBindings))
  35. return false;
  36. $this->query("UPDATE `sys_accounts` SET `role`=:role WHERE `id`=:id", array(
  37. 'id' => $iAccountId,
  38. 'role' => $iRole == 0 ? 1 : 3
  39. ));
  40. return true;
  41. }
  42. public function getRoles($aParams)
  43. {
  44. $aMethod = array('name' => 'getAll', 'params' => array(0 => 'query'));
  45. $sSelectClause = $sJoinClause = $sWhereClause = $sOrderClause = $sLimitClause = "";
  46. if(!isset($aParams['order']) || empty($aParams['order']))
  47. $sOrderClause = "ORDER BY `tr`.`Order` ASC";
  48. switch($aParams['type']) {
  49. case 'by_id':
  50. $aMethod['name'] = 'getRow';
  51. $aMethod['params'][1] = array(
  52. 'id' => $aParams['id']
  53. );
  54. $sWhereClause .= "AND `tr`.`id`=:id";
  55. $sLimitClause .= "LIMIT 1";
  56. break;
  57. case 'all_active':
  58. $sWhereClause .= "AND `tr`.`active`=1";
  59. break;
  60. case 'all_active_pair':
  61. $aMethod['name'] = "getPairs";
  62. $aMethod['params'][1] = 'id';
  63. $aMethod['params'][2] = 'name';
  64. $sWhereClause .= "AND `tr`.`active`=1";
  65. break;
  66. case 'all_pair':
  67. $aMethod['name'] = "getPairs";
  68. $aMethod['params'][1] = 'id';
  69. $aMethod['params'][2] = 'title';
  70. break;
  71. case 'all_order_id':
  72. $sOrderClause = "ORDER BY `tr`.`id` ASC";
  73. break;
  74. case 'all':
  75. break;
  76. }
  77. $aMethod['params'][0] = "SELECT
  78. `tr`.`id` AS `id`,
  79. `tr`.`name` AS `name`,
  80. `tr`.`title` AS `title`,
  81. `tr`.`description` AS `description`,
  82. `tr`.`active` AS `active`,
  83. `tr`.`order` AS `order`" . $sSelectClause . "
  84. FROM `sys_std_roles` AS `tr` " . $sJoinClause . "
  85. WHERE 1 " . $sWhereClause . " " . $sOrderClause . " " . $sLimitClause;
  86. return call_user_func_array(array($this, $aMethod['name']), $aMethod['params']);
  87. }
  88. public function isRoleUsed($iId)
  89. {
  90. return (int)$this->getOne("SELECT `id` FROM `sys_std_roles_members` WHERE `role` & :role_id <> 0", array(
  91. 'role_id' => $iId
  92. )) > 0;
  93. }
  94. public function getRoleOrderMax()
  95. {
  96. return (int)$this->getOne("SELECT MAX(`order`) FROM `sys_std_roles` WHERE 1");
  97. }
  98. public function updateRoles($aSet, $aWhere)
  99. {
  100. if(empty($aSet) || empty($aWhere))
  101. return false;
  102. return (int)$this->query("UPDATE `sys_std_roles` SET " . $this->arrayToSQL($aSet) . " WHERE " . $this->arrayToSQL($aWhere)) > 0;
  103. }
  104. public function deleteRoles($aParams)
  105. {
  106. $aBindings = array();
  107. $sWhereClause = $sLimitClause = "";
  108. switch($aParams['type']) {
  109. case 'by_id':
  110. $aBindings = array(
  111. 'id' => $aParams['id']
  112. );
  113. $sWhereClause .= "AND `id`=:id";
  114. break;
  115. }
  116. $sSql = "DELETE FROM `sys_std_roles` WHERE 1 " . $sWhereClause . " " . $sLimitClause;
  117. return (int)$this->query($sSql, $aBindings) > 0;
  118. }
  119. public function getActions($aParams)
  120. {
  121. $sMemoryKey = '';
  122. $aMethod = array('name' => 'getAll', 'params' => array(0 => 'query'));
  123. $sSelectClause = $sJoinClause = $sWhereClause = $sGroupClause = $sOrderClause = $sLimitClause = "";
  124. if(!isset($aParams['order']) || empty($aParams['order']))
  125. $sOrderClause = "ORDER BY `tra`.`name` ASC";
  126. switch($aParams['type']) {
  127. case 'by_name':
  128. $aMethod['name'] = 'getRow';
  129. $aMethod['params'][1] = array(
  130. 'name' => $aParams['name'],
  131. );
  132. $sWhereClause .= "AND `tra`.`name`=:name ";
  133. break;
  134. case 'by_names':
  135. $aMethod['params'][1] = array();
  136. $sWhereClause .= "AND `tra`.`name` IN(" . $this->implode_escape($aParams['value']) . ") ";
  137. $sMemoryKey = 'BxDolStudioRolesQuery::getActions' . $aParams['type'] . $sWhereClause;
  138. break;
  139. case 'by_role_id':
  140. $aMethod['params'][1] = array(
  141. 'role_id' => $aParams['role_id']
  142. );
  143. $sJoinClause .= "LEFT JOIN `sys_std_roles_actions2roles` AS `trar` ON `tra`.`id`=`trar`.`action_id` ";
  144. $sWhereClause .= "AND `trar`.`role_id`=:role_id ";
  145. break;
  146. case 'by_role_id_key_id':
  147. $aMethod['name'] = 'getAllWithKey';
  148. $aMethod['params'][1] = 'id';
  149. $aMethod['params'][2] = array(
  150. 'role_id' => $aParams['role_id']
  151. );
  152. $sJoinClause .= "LEFT JOIN `sys_std_roles_actions2roles` AS `trar` ON `tra`.`id`=`trar`.`action_id` ";
  153. $sWhereClause .= "AND `trar`.`role_id`=:role_id";
  154. break;
  155. case 'counter_by_roles':
  156. $aMethod['name'] = 'getPairs';
  157. $aMethod['params'][1] = 'role_id';
  158. $aMethod['params'][2] = 'counter';
  159. $sSelectClause = ", `trar`.`role_id` AS `role_id`, COUNT(`trar`.`action_id`) AS `counter`";
  160. $sJoinClause = "LEFT JOIN `sys_std_roles_actions2roles` AS `trar` ON `tra`.`id`=`trar`.`action_id` ";
  161. $sGroupClause = "GROUP BY `trar`.`role_id`";
  162. break;
  163. }
  164. $aMethod['params'][0] = "SELECT
  165. `tra`.`id` AS `id`,
  166. `tra`.`name` AS `name`,
  167. `tra`.`title` AS `title`,
  168. `tra`.`description` AS `description`" . $sSelectClause . "
  169. FROM `sys_std_roles_actions` AS `tra` " . $sJoinClause . "
  170. WHERE 1 " . $sWhereClause . " " . $sGroupClause . " " . $sOrderClause . " " . $sLimitClause;
  171. if ($sMemoryKey) {
  172. array_unshift($aMethod['params'], $sMemoryKey, $aMethod['name']);
  173. return call_user_func_array(array($this, 'fromMemory'), $aMethod['params']);
  174. }
  175. return call_user_func_array(array($this, $aMethod['name']), $aMethod['params']);
  176. }
  177. public function switchAction($iRoleId, $iActionId, $bEnable)
  178. {
  179. $aBindings = array(
  180. 'role_id' => $iRoleId,
  181. 'action_id' => $iActionId
  182. );
  183. if($bEnable)
  184. $sSql = "INSERT INTO `sys_std_roles_actions2roles` SET `role_id`=:role_id, `action_id`=:action_id";
  185. else
  186. $sSql = "DELETE FROM `sys_std_roles_actions2roles` WHERE `role_id`=:role_id AND `action_id`=:action_id";
  187. return (int)$this->query($sSql, $aBindings) > 0;
  188. }
  189. public function isActionAllowed($iRole, $iActionId)
  190. {
  191. $aResult = $this->getRow("SELECT * FROM `sys_std_roles_actions2roles` WHERE :role & POW(2, (`role_id` - 1)) != 0 AND `action_id`=:action_id", array(
  192. 'role' => $iRole,
  193. 'action_id' => $iActionId
  194. ));
  195. return !empty($aResult) && is_array($aResult);
  196. }
  197. public function getMembers($aParams)
  198. {
  199. $aMethod = array('name' => 'getAll', 'params' => array(0 => 'query'));
  200. $sSelectClause = $sJoinClause = $sWhereClause = $sGroupClause = $sOrderClause = $sLimitClause = "";
  201. if(!isset($aParams['order']) || empty($aParams['order']))
  202. $sOrderClause = "ORDER BY `trm`.`id` ASC";
  203. switch($aParams['type']) {
  204. case 'by_account_id':
  205. $aMethod['name'] = 'getRow';
  206. $aMethod['params'][1] = array(
  207. 'account_id' => $aParams['account_id']
  208. );
  209. $sWhereClause .= "AND `trm`.`account_id`=:account_id ";
  210. break;
  211. case 'by_role_id':
  212. $aMethod['params'][1] = array(
  213. 'role_id' => $aParams['role_id']
  214. );
  215. $sWhereClause .= "AND `trm`.`role_id`=:role_id ";
  216. break;
  217. }
  218. $aMethod['params'][0] = "SELECT
  219. `trm`.`id` AS `id`,
  220. `trm`.`account_id` AS `account_id`,
  221. `trm`.`role` AS `role`" . $sSelectClause . "
  222. FROM `sys_std_roles_members` AS `trm` " . $sJoinClause . "
  223. WHERE 1 " . $sWhereClause . " " . $sGroupClause . " " . $sOrderClause . " " . $sLimitClause;
  224. return call_user_func_array(array($this, $aMethod['name']), $aMethod['params']);
  225. }
  226. }
  227. /** @} */