BxDolStudioFormsQuery.php 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937
  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 BxDolStudioFormsQuery extends BxDolDb
  10. {
  11. function __construct()
  12. {
  13. parent::__construct();
  14. }
  15. function getForms($aParams, &$aItems, $bReturnCount = true)
  16. {
  17. $aMethod = array('name' => 'getAll', 'params' => array(0 => 'query'));
  18. $sSelectClause = "
  19. `tf`.`id` AS `id`,
  20. `tf`.`object` AS `object`,
  21. `tf`.`module` AS `module`,
  22. `tf`.`title` AS `title`,
  23. `tf`.`action` AS `action`,
  24. `tf`.`form_attrs` AS `form_attrs`,
  25. `tf`.`table` AS `table`,
  26. `tf`.`key` AS `key`,
  27. `tf`.`uri` AS `uri`,
  28. `tf`.`uri_title` AS `uri_title`,
  29. `tf`.`submit_name` AS `submit_name`,
  30. `tf`.`params` AS `params`,
  31. `tf`.`deletable` AS `deletable`,
  32. `tf`.`active` AS `active`,
  33. `tf`.`override_class_name` AS `override_class_name`,
  34. `tf`.`override_class_file` AS `override_class_file`";
  35. $sJoinClause = $sWhereClause = $sGroupClause = $sOrderClause = $sLimitClause = "";
  36. if(!isset($aParams['order']) || empty($aParams['order']))
  37. $sOrderClause = "ORDER BY `tf`.`title` ASC";
  38. switch($aParams['type']) {
  39. case 'by_id':
  40. $aMethod['name'] = 'getRow';
  41. $aMethod['params'][1] = array(
  42. 'id' => $aParams['value']
  43. );
  44. $sWhereClause = " AND `tf`.`id`=:id ";
  45. break;
  46. case 'by_object':
  47. $aMethod['name'] = 'getRow';
  48. $aMethod['params'][1] = [
  49. 'object' => $aParams['value'],
  50. ];
  51. $sWhereClause = "AND `tf`.`object`=:object ";
  52. break;
  53. case 'by_object_display':
  54. $aMethod['name'] = 'getRow';
  55. $aMethod['params'][1] = array(
  56. 'object' => $aParams['object'],
  57. 'display_name' => $aParams['display']
  58. );
  59. $sJoinClause = "LEFT JOIN `sys_form_displays` AS `td` ON `tf`.`object`=`td`.`object` ";
  60. $sWhereClause = "AND `td`.`object`=:object AND `td`.`display_name`=:display_name ";
  61. break;
  62. case 'by_module':
  63. $aMethod['params'][1] = array(
  64. 'module' => $aParams['value']
  65. );
  66. $sWhereClause = "AND `tf`.`module`=:module";
  67. break;
  68. case 'counter_by_modules':
  69. $aMethod['name'] = 'getPairs';
  70. $aMethod['params'][1] = 'module';
  71. $aMethod['params'][2] = 'counter';
  72. $sSelectClause .= ", COUNT(*) AS `counter`";
  73. $sGroupClause = "GROUP BY `tf`.`module`";
  74. break;
  75. case 'nested':
  76. $aMethod['name'] = 'getPairs';
  77. $aMethod['params'][1] = 'object';
  78. $aMethod['params'][2] = 'title';
  79. $aMethod['params'][3] = array(
  80. 'parent_form' => $aParams['parent_form']
  81. );
  82. $sSubQuery = "SELECT `value` FROM `sys_form_inputs` sfi WHERE `type`='nested_form' AND `object` = :parent_form ";
  83. if (!@empty($aParams['ids'])){
  84. $sSubQuery = "SELECT `value` FROM `sys_form_inputs` sfi WHERE `type`='nested_form' AND `object` = :parent_form AND `name` NOT IN (SELECT `input_name` FROM `sys_form_display_inputs` WHERE `id` IN(" . $aParams['ids'] . "))";
  85. }
  86. $sWhereClause = "AND `tf`.`parent_form`=:parent_form AND `object` NOT IN (" . $sSubQuery . ")";
  87. break;
  88. case 'export':
  89. $sSelectClause = "`tf`.*";
  90. break;
  91. case 'all':
  92. break;
  93. }
  94. $aMethod['params'][0] = "SELECT " . ($bReturnCount ? "SQL_CALC_FOUND_ROWS" : "") . $sSelectClause . "
  95. FROM `sys_objects_form` AS `tf` " . $sJoinClause . "
  96. WHERE 1 " . $sWhereClause . " " . $sGroupClause . " " . $sOrderClause . " " . $sLimitClause;
  97. $aItems = call_user_func_array(array($this, $aMethod['name']), $aMethod['params']);
  98. if(!$bReturnCount)
  99. return !empty($aItems);
  100. return (int)$this->getOne("SELECT FOUND_ROWS()");
  101. }
  102. function isForm($sName)
  103. {
  104. $aForm = [];
  105. $this->getForms(['type' => 'by_object', 'value' => $sName], $aForm, false);
  106. return !empty($aForm) && is_array($aForm);
  107. }
  108. function addForm($aFields)
  109. {
  110. return $this->query("INSERT INTO `sys_objects_form` SET " . $this->arrayToSQL($aFields));
  111. }
  112. function updateFormByObject($sObject, $aFields)
  113. {
  114. return $this->query("UPDATE `sys_objects_form` SET " . $this->arrayToSQL($aFields) . " WHERE `object`=:object", [
  115. 'object' => $sObject
  116. ]);
  117. }
  118. function getDisplays($aParams, &$aItems, $bReturnCount = true)
  119. {
  120. $aMethod = array('name' => 'getAll', 'params' => array(0 => 'query'));
  121. $sSelectClause = "
  122. `td`.`id` AS `id`,
  123. `td`.`object` AS `object`,
  124. `td`.`display_name` AS `name`,
  125. `td`.`display_name` AS `display_name`,
  126. `td`.`module` AS `module`,
  127. `td`.`view_mode` AS `view_mode`,
  128. `td`.`title` AS `title`";
  129. $sJoinClause = $sWhereClause = $sGroupClause = $sOrderClause = $sLimitClause = "";
  130. if(!isset($aParams['order']) || empty($aParams['order']))
  131. $sOrderClause = "ORDER BY `td`.`title` ASC";
  132. switch($aParams['type']) {
  133. case 'by_id':
  134. $aMethod['name'] = 'getRow';
  135. $aMethod['params'][1] = array(
  136. 'id' => $aParams['value']
  137. );
  138. $sWhereClause = " AND `td`.`id`=:id ";
  139. $sLimitClause = "LIMIT 1";
  140. break;
  141. case 'by_object_display':
  142. $aMethod['name'] = 'getRow';
  143. $aMethod['params'][1] = array(
  144. 'object' => $aParams['object'],
  145. 'display_name' => $aParams['display']
  146. );
  147. $sWhereClause = " AND `td`.`object`=:object AND `td`.`display_name`=:display_name ";
  148. $sLimitClause = "LIMIT 1";
  149. break;
  150. case 'by_name':
  151. $aMethod['params'][1] = array(
  152. 'display_name' => $aParams['value']
  153. );
  154. $sWhereClause = " AND `td`.`display_name`=:display_name ";
  155. $sLimitClause = "LIMIT 1";
  156. break;
  157. case 'by_module':
  158. $aMethod['params'][1] = array(
  159. 'module' => $aParams['value']
  160. );
  161. $sWhereClause = " AND `td`.`module`=:module ";
  162. break;
  163. case 'by_module_with_forms':
  164. $aMethod['params'][1] = array(
  165. 'module' => $aParams['value']
  166. );
  167. $sSelectClause .= ", `tf`.`title` AS `form_title`";
  168. $sJoinClause = "LEFT JOIN `sys_objects_form` AS `tf` ON `td`.`object`=`tf`.`object` ";
  169. $sWhereClause = " AND `td`.`module`=:module ";
  170. $sOrderClause = "ORDER BY `td`.`object` ASC, `td`.`title` ASC";
  171. break;
  172. case 'by_object':
  173. $aMethod['params'][1] = array(
  174. 'object' => $aParams['value']
  175. );
  176. $sWhereClause = " AND `td`.`object`=:object ";
  177. break;
  178. case 'export_by_object':
  179. $aMethod['params'][1] = [
  180. 'object' => $aParams['value']
  181. ];
  182. $sSelectClause = "`td`.*";
  183. $sWhereClause = " AND `td`.`object`=:object ";
  184. break;
  185. case 'counter_by_forms':
  186. $aMethod['name'] = 'getPairs';
  187. $aMethod['params'][1] = 'object';
  188. $aMethod['params'][2] = 'counter';
  189. $sSelectClause .= ", COUNT(*) AS `counter`";
  190. $sGroupClause = "GROUP BY `td`.`object`";
  191. break;
  192. case 'counter_by_modules':
  193. $aMethod['name'] = 'getPairs';
  194. $aMethod['params'][1] = 'module';
  195. $aMethod['params'][2] = 'counter';
  196. $sSelectClause .= ", COUNT(*) AS `counter`";
  197. $sGroupClause = "GROUP BY `td`.`module`";
  198. break;
  199. case 'all':
  200. break;
  201. case 'all_with_forms':
  202. $sSelectClause .= ", `tf`.`title` AS `form_title`";
  203. $sJoinClause = "LEFT JOIN `sys_objects_form` AS `tf` ON `td`.`object`=`tf`.`object` ";
  204. $sOrderClause = "ORDER BY `td`.`object` ASC, `td`.`title` ASC";
  205. break;
  206. }
  207. $aMethod['params'][0] = "SELECT " . ($bReturnCount ? "SQL_CALC_FOUND_ROWS" : "") . $sSelectClause . "
  208. FROM `sys_form_displays` AS `td` " . $sJoinClause . "
  209. WHERE 1 " . $sWhereClause . " " . $sGroupClause . " " . $sOrderClause . " " . $sLimitClause;
  210. $aItems = call_user_func_array(array($this, $aMethod['name']), $aMethod['params']);
  211. if(!$bReturnCount)
  212. return !empty($aItems);
  213. return (int)$this->getOne("SELECT FOUND_ROWS()");
  214. }
  215. function isDisplay($sName, $sDisplay)
  216. {
  217. $aDisplay = [];
  218. $this->getDisplays(['type' => 'by_object_display', 'object' => $sName, 'display' => $sDisplay], $aDisplay, false);
  219. return !empty($aDisplay) && is_array($aDisplay);
  220. }
  221. function addDisplay($aFields)
  222. {
  223. return $this->query("INSERT INTO `sys_form_displays` SET " . $this->arrayToSQL($aFields));
  224. }
  225. function updateDisplayByObjectAndName($sObject, $sName, $aFields)
  226. {
  227. return $this->query("UPDATE `sys_form_displays` SET " . $this->arrayToSQL($aFields) . " WHERE `object`=:object AND `display_name`=:display_name ", [
  228. 'object' => $sObject,
  229. 'display_name' => $sName
  230. ]);
  231. }
  232. function getInputs($aParams, &$aItems, $bReturnCount = true)
  233. {
  234. $aMethod = array('name' => 'getAll', 'params' => array(0 => 'query'));
  235. $sSelectClause = $sFromClause = $sJoinClause = $sWhereClause = $sGroupClause = $sOrderClause = $sLimitClause = "";
  236. $sSelectClause = "
  237. `tdi`.`id` AS `id`,
  238. `ti`.`name` AS `name`,
  239. `ti`.`type` AS `type`,
  240. `ti`.`caption_system` AS `caption_system`,
  241. `ti`.`caption` AS `caption`,
  242. `tdi`.`visible_for_levels` AS `visible_for_levels`,
  243. `tdi`.`active` AS `active`,
  244. `tdi`.`order` AS `order`";
  245. $sFromClause = "`sys_form_display_inputs` AS `tdi`";
  246. $sJoinClause = "LEFT JOIN `sys_form_inputs` AS `ti` ON `tdi`.`input_name`=`ti`.`name` ";
  247. if(!isset($aParams['order']) || empty($aParams['order']))
  248. $sOrderClause = "ORDER BY `tdi`.`order` ASC";
  249. switch($aParams['type']) {
  250. case 'by_id':
  251. $aMethod['name'] = 'getRow';
  252. $aMethod['params'][1] = array(
  253. 'id' => $aParams['value']
  254. );
  255. $sWhereClause = " AND `tdi`.`id`=:id ";
  256. break;
  257. case 'by_object_id':
  258. $aMethod['name'] = 'getRow';
  259. $aMethod['params'][1] = array(
  260. 'object' => $aParams['object'],
  261. 'id' => $aParams['id']
  262. );
  263. $sSelectClause = "`ti`.*, `tdi`.`id` AS `di_id`, `tdi`.`display_name` AS `display_name`, `tdi`.`visible_for_levels` AS `visible_for_levels`";
  264. $sWhereClause = " AND `ti`.`object`=:object AND `tdi`.`id`=:id ";
  265. break;
  266. case 'by_object_display':
  267. $aMethod['params'][1] = array(
  268. 'object' => $aParams['object'],
  269. 'display_name' => $aParams['display']
  270. );
  271. $sWhereClause = " AND `ti`.`object`=:object AND `tdi`.`display_name`=:display_name ";
  272. if(isset($aParams['active'])) {
  273. $aMethod['params'][1]['active'] = (int)$aParams['active'];
  274. $sWhereClause .= " AND `tdi`.`active`=:active ";
  275. }
  276. break;
  277. case 'by_object_name_filter':
  278. $aMethod['name'] = 'getColumn';
  279. $aMethod['params'][1] = array(
  280. 'object' => $aParams['object'],
  281. 'name_filter' => $aParams['name_filter']
  282. );
  283. $sSelectClause = "DISTINCT `ti`.`name` AS `name`";
  284. $sWhereClause = " AND `ti`.`object`=:object AND `ti`.`name` LIKE (:name_filter) ";
  285. $sOrderClause = "ORDER BY LENGTH(`ti`.`name`) ASC, `ti`.`name` ASC";
  286. break;
  287. case 'dump_inputs':
  288. $aMethod['params'][1] = array(
  289. 'object' => $aParams['value']
  290. );
  291. $sSelectClause = "`ti`.*";
  292. $sFromClause = "`sys_form_inputs` AS `ti`";
  293. $sJoinClause = "";
  294. $sWhereClause = " AND `ti`.`object`=:object ";
  295. $sOrderClause = "";
  296. break;
  297. case 'dump_display_inputs':
  298. $sSelectClause = "`tdi`.*";
  299. $sJoinClause = "";
  300. $sWhereClause = " AND `tdi`.`display_name` IN (" . $this->implode_escape($aParams['displays']) . ") ";
  301. $sOrderClause = "";
  302. break;
  303. case 'dump_connections':
  304. $aMethod['params'][1] = array(
  305. 'object' => $aParams['value']
  306. );
  307. $sSelectClause = "`tdi`.*";
  308. $sJoinClause .= "LEFT JOIN `sys_form_displays` AS `td` ON `tdi`.`display_name`=`td`.`display_name` ";
  309. $sWhereClause = " AND `td`.`object`=:object AND `ti`.`object`=:object ";
  310. $sOrderClause = "ORDER BY `tdi`.`display_name` ASC, `tdi`.`order` ASC";
  311. break;
  312. case 'counter_by_displays':
  313. $aMethod['name'] = 'getPairs';
  314. $aMethod['params'][1] = 'display_name';
  315. $aMethod['params'][2] = 'counter';
  316. $sSelectClause = "`tdi`.`display_name` AS `display_name`, COUNT(`tdi`.`display_name`) AS `counter`";
  317. $sJoinClause = "";
  318. $sGroupClause = "GROUP BY `tdi`.`display_name`";
  319. break;
  320. case 'counter_by_modules':
  321. $aMethod['name'] = 'getPairs';
  322. $aMethod['params'][1] = 'module';
  323. $aMethod['params'][2] = 'counter';
  324. $sSelectClause = "`ti`.`module` AS `module`, COUNT(*) AS `counter`";
  325. $sFromClause = "`sys_form_inputs` AS `ti`";
  326. $sJoinClause = "";
  327. $sGroupClause = "GROUP BY `ti`.`module`";
  328. $sOrderClause = "";
  329. break;
  330. case 'all':
  331. break;
  332. }
  333. $aMethod['params'][0] = "SELECT " . ($bReturnCount ? "SQL_CALC_FOUND_ROWS" : "") . " " . $sSelectClause . "
  334. FROM " . $sFromClause . " " . $sJoinClause . "
  335. WHERE 1 " . $sWhereClause . " " . $sGroupClause . " " . $sOrderClause . " " . $sLimitClause;
  336. $aItems = call_user_func_array(array($this, $aMethod['name']), $aMethod['params']);
  337. if(!$bReturnCount)
  338. return !empty($aItems);
  339. return (int)$this->getOne("SELECT FOUND_ROWS()");
  340. }
  341. function isInput($sObject, $sName)
  342. {
  343. return (int)$this->getOne("SELECT `id` FROM `sys_form_inputs` WHERE `object`=:object AND `name`=:name LIMIT 1", [
  344. 'object' => $sObject,
  345. 'name' => $sName
  346. ]) > 0;
  347. }
  348. function isDisplayInput($sDisplay, $sInput)
  349. {
  350. return (int)$this->getOne("SELECT `id` FROM `sys_form_display_inputs` WHERE `display_name`=:display AND `input_name`=:input LIMIT 1", [
  351. 'display' => $sDisplay,
  352. 'input' => $sInput
  353. ]) > 0;
  354. }
  355. function addInput($aFields)
  356. {
  357. return $this->query("INSERT INTO `sys_form_inputs` SET " . $this->arrayToSQL($aFields));
  358. }
  359. function addDisplayInput($aFields)
  360. {
  361. return $this->query("INSERT INTO `sys_form_display_inputs` SET " . $this->arrayToSQL($aFields));
  362. }
  363. function updateInputByObjectAndName($sObject, $sName, $aFields)
  364. {
  365. return $this->query("UPDATE `sys_form_inputs` SET " . $this->arrayToSQL($aFields) . " WHERE `object`=:object AND `name`=:name ", [
  366. 'object' => $sObject,
  367. 'name' => $sName
  368. ]);
  369. }
  370. function updateDisplayInputByDisplayAndInput($sDisplay, $sInput, $aFields)
  371. {
  372. return $this->query("UPDATE `sys_form_display_inputs` SET " . $this->arrayToSQL($aFields) . " WHERE `display_name`=:display_name AND `input_name`=:input_name ", [
  373. 'display_name' => $sDisplay,
  374. 'input_name' => $sInput
  375. ]);
  376. }
  377. function deleteInputs($aParams)
  378. {
  379. $aBindings = array();
  380. $sWhereClause = $sLimitClause = "";
  381. switch($aParams['type']) {
  382. case 'by_id':
  383. if(isset($aParams['object'], $aParams['name'])) {
  384. $sSql = $this->prepare("DELETE FROM `tdi` USING `sys_form_display_inputs` AS `tdi` LEFT JOIN `sys_form_displays` AS `td` ON `tdi`.`display_name`=`td`.`display_name` WHERE `td`.`object`=? AND `tdi`.`input_name`=?", $aParams['object'], $aParams['name']);
  385. $this->query($sSql);
  386. }
  387. $aBindings['id'] = $aParams['value'];
  388. $sWhereClause = " AND `ti`.`id`=:id ";
  389. break;
  390. case 'all':
  391. break;
  392. }
  393. $sSql = "DELETE FROM `ti` USING `sys_form_inputs` AS `ti` WHERE 1 " . $sWhereClause . " " . $sLimitClause;
  394. return (int)$this->query($sSql, $aBindings) > 0;
  395. }
  396. function checkInputsInDisplays($sObject, $sDisplayName)
  397. {
  398. $aDisplay = array();
  399. $this->getDisplays(array('type' => 'by_object_display', 'object' => $sObject, 'display' => $sDisplayName), $aDisplay, false);
  400. if(empty($aDisplay) || !is_array($aDisplay))
  401. return false;
  402. $sSql = $this->prepare("DELETE FROM `tdi` USING `sys_form_display_inputs` AS `tdi` LEFT JOIN `sys_form_inputs` AS `ti` ON `tdi`.`input_name`=`ti`.`name` WHERE 1 AND `tdi`.`display_name`=? AND `ti`.`id` IS NULL", $sDisplayName);
  403. $this->query($sSql);
  404. $sSql = $this->prepare("INSERT INTO `sys_form_display_inputs`(`display_name`, `input_name`) SELECT ? AS `display_name`,`ti`.`name` AS `input_name` FROM `sys_form_inputs` AS `ti` LEFT JOIN `sys_form_display_inputs` AS `tdi` ON `ti`.`name`=`tdi`.`input_name` AND `tdi`.`display_name`=? WHERE 1 AND `ti`.`object`=? AND `tdi`.`id` IS NULL", $sDisplayName, $sDisplayName, $sObject);
  405. return (int)$this->query($sSql) > 0;
  406. }
  407. function getInputOrderMax($sDisplayName)
  408. {
  409. $sSql = $this->prepare("SELECT MAX(`order`) FROM `sys_form_display_inputs` WHERE `display_name`=? LIMIT 1", $sDisplayName);
  410. return (int)$this->getOne($sSql);
  411. }
  412. function getLists($aParams, &$aItems, $bReturnCount = true)
  413. {
  414. $aMethod = array('name' => 'getAll', 'params' => array(0 => 'query'));
  415. $sSelectClause = $sJoinClause = $sWhereClause = $sGroupClause = $sOrderClause = $sLimitClause = "";
  416. if(!isset($aParams['order']) || empty($aParams['order']))
  417. $sOrderClause = "ORDER BY `tl`.`key` ASC";
  418. switch($aParams['type']) {
  419. case 'by_id':
  420. $aMethod['name'] = 'getRow';
  421. $aMethod['params'][1] = array(
  422. 'id' => $aParams['value']
  423. );
  424. $sWhereClause = " AND `tl`.`id`=:id ";
  425. break;
  426. case 'by_key':
  427. $aMethod['name'] = 'getRow';
  428. $aMethod['params'][1] = array(
  429. 'key' => $aParams['value']
  430. );
  431. $sWhereClause = " AND `tl`.`key`=:key ";
  432. break;
  433. case 'by_module':
  434. $aMethod['params'][1] = array(
  435. 'module' => $aParams['value']
  436. );
  437. $sWhereClause = " AND `tl`.`module`=:module ";
  438. break;
  439. case 'pairs_list_values':
  440. $aMethod['name'] = 'getPairs';
  441. $aMethod['params'][1] = 'key';
  442. $aMethod['params'][2] = 'values';
  443. $sSelectClause = ",COUNT( `tv`.`id`) AS `values`";
  444. $sJoinClause = "LEFT JOIN `sys_form_pre_values` AS `tv` ON `tl`.`key`=`tv`.`Key`";
  445. $sGroupClause = "GROUP BY `tl`.`id`";
  446. break;
  447. case 'counter_by_modules':
  448. $aMethod['name'] = 'getPairs';
  449. $aMethod['params'][1] = 'module';
  450. $aMethod['params'][2] = 'counter';
  451. $sSelectClause = ", COUNT(*) AS `counter`";
  452. $sGroupClause = "GROUP BY `tl`.`module`";
  453. break;
  454. case 'all_for_sets':
  455. $sWhereClause = "AND `tl`.`use_for_sets`='1'";
  456. break;
  457. case 'all':
  458. break;
  459. }
  460. $aMethod['params'][0] = "SELECT " . ($bReturnCount ? "SQL_CALC_FOUND_ROWS" : "") . "
  461. `tl`.`id` AS `id`,
  462. `tl`.`module` AS `module`,
  463. `tl`.`key` AS `key`,
  464. `tl`.`title` AS `title`,
  465. `tl`.`use_for_sets` AS `use_for_sets`,
  466. `tl`.`extendable` AS `extendable`" . $sSelectClause . "
  467. FROM `sys_form_pre_lists` AS `tl` " . $sJoinClause . "
  468. WHERE 1 " . $sWhereClause . " " . $sGroupClause . " " . $sOrderClause . " " . $sLimitClause;
  469. $aItems = call_user_func_array(array($this, $aMethod['name']), $aMethod['params']);
  470. if(!$bReturnCount)
  471. return !empty($aItems);
  472. return (int)$this->getOne("SELECT FOUND_ROWS()");
  473. }
  474. function updateList($iId, $aFields)
  475. {
  476. $sSql = "UPDATE `sys_form_pre_lists` SET `" . implode("`=?, `", array_keys($aFields)) . "`=? WHERE `id`=?";
  477. $sSql = call_user_func_array(array($this, 'prepare'), array_merge(array($sSql), array_values($aFields), array($iId)));
  478. return $this->query($sSql);
  479. }
  480. function isListUsedInSet($sKey)
  481. {
  482. bx_import('BxDolForm');
  483. $sSql = $this->prepare("SELECT
  484. COUNT( DISTINCT `ti`.`id`) AS `id`
  485. FROM `sys_form_pre_lists` AS `tl`
  486. LEFT JOIN `sys_form_inputs` AS `ti` ON CONCAT('" . BX_DATA_LISTS_KEY_PREFIX . "', `tl`.`key`)=`ti`.`values` AND `ti`.`type` IN ('select_multiple', 'checkbox_set')
  487. WHERE 1 AND `tl`.`key`=?", $sKey);
  488. return (int)$this->getOne($sSql) > 0;
  489. }
  490. function getCategories($aParams, &$aItems, $bReturnCount = true)
  491. {
  492. $aMethod = array('name' => 'getAll', 'params' => array(0 => 'query'));
  493. $sSelectClause = $sJoinClause = $sWhereClause = $sGroupClause = $sOrderClause = $sLimitClause = "";
  494. if(!isset($aParams['order']) || empty($aParams['order']))
  495. $sOrderClause = "ORDER BY `tv`.`module` ASC";
  496. switch($aParams['type']) {
  497. case 'by_id':
  498. $aMethod['name'] = 'getRow';
  499. $aMethod['params'][1] = array(
  500. 'id' => $aParams['value']
  501. );
  502. $sWhereClause = " AND `tv`.`id`=:id ";
  503. break;
  504. case 'counter_by_modules':
  505. $aMethod['name'] = 'getPairs';
  506. $aMethod['params'][1] = 'module';
  507. $aMethod['params'][2] = 'counter';
  508. $sSelectClause = ", `tv`.`module` AS `module`, COUNT(`tv`.`id`) AS `counter`";
  509. $sGroupClause = "GROUP BY `tv`.`module`";
  510. break;
  511. case 'all':
  512. break;
  513. }
  514. $aMethod['params'][0] = "SELECT " . ($bReturnCount ? "SQL_CALC_FOUND_ROWS" : "") . "
  515. `tv`.`id` AS `id`,
  516. `tv`.`Value` AS `value`,
  517. `tv`.`Value` AS `Value` " . $sSelectClause . "
  518. FROM `sys_categories` AS `tv` " . $sJoinClause . "
  519. WHERE 1 " . $sWhereClause . " " . $sGroupClause . " " . $sOrderClause . " " . $sLimitClause;
  520. $aItems = call_user_func_array(array($this, $aMethod['name']), $aMethod['params']);
  521. if(!$bReturnCount)
  522. return !empty($aItems);
  523. return (int)$this->getOne("SELECT FOUND_ROWS()");
  524. }
  525. function deleteCategories($CategoryId)
  526. {
  527. $sSql = "DELETE FROM `sys_categories2objects` WHERE `category_id` = :category_id";
  528. $aBindings = array(
  529. 'category_id' => $CategoryId
  530. );
  531. return $this->query($sSql, $aBindings);
  532. }
  533. function getValues($aParams, &$aItems, $bReturnCount = true)
  534. {
  535. $aMethod = array('name' => 'getAll', 'params' => array(0 => 'query'));
  536. $sSelectClause = $sJoinClause = $sWhereClause = $sGroupClause = $sOrderClause = $sLimitClause = "";
  537. if(!isset($aParams['order']) || empty($aParams['order']))
  538. $sOrderClause = "ORDER BY `tv`.`Order` ASC";
  539. switch($aParams['type']) {
  540. case 'by_id':
  541. $aMethod['name'] = 'getRow';
  542. $aMethod['params'][1] = array(
  543. 'id' => $aParams['value']
  544. );
  545. $sWhereClause = " AND `tv`.`id`=:id ";
  546. break;
  547. case 'by_key':
  548. $aMethod['params'][1] = array(
  549. 'key' => $aParams['value']
  550. );
  551. $sWhereClause = " AND `tv`.`Key`=:key ";
  552. break;
  553. case 'by_key_key_value':
  554. $aMethod['name'] = 'getAllWithKey';
  555. $aMethod['params'][1] = 'value';
  556. $aMethod['params'][2] = array(
  557. 'key' => $aParams['value']
  558. );
  559. $sWhereClause = " AND `tv`.`Key`=:key ";
  560. break;
  561. case 'counter_by_lists':
  562. $aMethod['name'] = 'getPairs';
  563. $aMethod['params'][1] = 'key';
  564. $aMethod['params'][2] = 'counter';
  565. $sSelectClause = ", COUNT(*) AS `counter`";
  566. $sGroupClause = "GROUP BY `tv`.`Key`";
  567. break;
  568. case 'counter_by_modules':
  569. $aMethod['name'] = 'getPairs';
  570. $aMethod['params'][1] = 'module';
  571. $aMethod['params'][2] = 'counter';
  572. $sSelectClause = ", `tl`.`module` AS `module`, COUNT(`tv`.`id`) AS `counter`";
  573. $sJoinClause = "LEFT JOIN `sys_form_pre_lists` AS `tl` ON `tv`.`Key`=`tl`.`key`";
  574. $sGroupClause = "GROUP BY `tl`.`module`";
  575. break;
  576. case 'all':
  577. break;
  578. }
  579. $aMethod['params'][0] = "SELECT " . ($bReturnCount ? "SQL_CALC_FOUND_ROWS" : "") . "
  580. `tv`.`id` AS `id`,
  581. `tv`.`Key` AS `key`,
  582. `tv`.`Key` AS `Key`,
  583. `tv`.`Value` AS `value`,
  584. `tv`.`Value` AS `Value`,
  585. `tv`.`LKey` AS `lkey`,
  586. `tv`.`LKey` AS `LKey`,
  587. `tv`.`LKey2` AS `lkey2`,
  588. `tv`.`LKey2` AS `LKey2`,
  589. `tv`.`Data` AS `data`,
  590. `tv`.`Data` AS `Data`,
  591. `tv`.`Order` AS `order`,
  592. `tv`.`Order` AS `Order`" . $sSelectClause . "
  593. FROM `sys_form_pre_values` AS `tv` " . $sJoinClause . "
  594. WHERE 1 " . $sWhereClause . " " . $sGroupClause . " " . $sOrderClause . " " . $sLimitClause;
  595. $aItems = call_user_func_array(array($this, $aMethod['name']), $aMethod['params']);
  596. if(!$bReturnCount)
  597. return !empty($aItems);
  598. return (int)$this->getOne("SELECT FOUND_ROWS()");
  599. }
  600. function deleteValues($aParams)
  601. {
  602. $aBindings = array();
  603. $sWhereClause = $sLimitClause = "";
  604. switch($aParams['type']) {
  605. case 'by_key':
  606. $aBindings['key'] = $aParams['value'];
  607. $sWhereClause = " AND `tv`.`Key`=:key ";
  608. break;
  609. case 'all':
  610. break;
  611. }
  612. $sSql = "DELETE FROM `tv` USING `sys_form_pre_values` AS `tv` WHERE 1 " . $sWhereClause . " " . $sLimitClause;
  613. return $this->query($sSql, $aBindings) !== false;
  614. }
  615. function getValuesOrderMax($sKey)
  616. {
  617. $sSql = $this->prepare("SELECT MAX(`Order`) FROM `sys_form_pre_values` WHERE `Key`=? LIMIT 1", $sKey);
  618. return (int)$this->getOne($sSql);
  619. }
  620. function getSearchForms($aParams, &$aItems, $bReturnCount = true)
  621. {
  622. $aMethod = array('name' => 'getAll', 'params' => array(0 => 'query'));
  623. $sSelectClause = $sJoinClause = $sWhereClause = $sGroupClause = $sOrderClause = $sLimitClause = "";
  624. if(!isset($aParams['order']) || empty($aParams['order']))
  625. $sOrderClause = "ORDER BY `tf`.`title` ASC";
  626. switch($aParams['type']) {
  627. case 'by_id':
  628. $aMethod['name'] = 'getRow';
  629. $aMethod['params'][1] = array(
  630. 'id' => $aParams['id']
  631. );
  632. $sWhereClause = " AND `tf`.`id`=:id ";
  633. break;
  634. case 'by_module':
  635. $aMethod['params'][1] = array(
  636. 'module' => $aParams['module']
  637. );
  638. $sWhereClause = "AND `tf`.`module`=:module";
  639. break;
  640. case 'counter_by_modules':
  641. $aMethod['name'] = 'getPairs';
  642. $aMethod['params'][1] = 'module';
  643. $aMethod['params'][2] = 'counter';
  644. $sSelectClause = ", COUNT(*) AS `counter`";
  645. $sGroupClause = "GROUP BY `tf`.`module`";
  646. case 'all':
  647. break;
  648. }
  649. $aMethod['params'][0] = "SELECT " . ($bReturnCount ? "SQL_CALC_FOUND_ROWS" : "") . "
  650. `tf`.*" . $sSelectClause . "
  651. FROM `sys_objects_search_extended` AS `tf` " . $sJoinClause . "
  652. WHERE 1 " . $sWhereClause . " " . $sGroupClause . " " . $sOrderClause . " " . $sLimitClause;
  653. $aItems = call_user_func_array(array($this, $aMethod['name']), $aMethod['params']);
  654. if(!$bReturnCount)
  655. return !empty($aItems);
  656. return (int)$this->getOne("SELECT FOUND_ROWS()");
  657. }
  658. function getSearchFields($aParams, &$aItems, $bReturnCount = true)
  659. {
  660. $aMethod = array('name' => 'getAll', 'params' => array(0 => 'query'));
  661. $sSelectClause = $sFromClause = $sJoinClause = $sWhereClause = $sGroupClause = $sOrderClause = $sLimitClause = "";
  662. if(!isset($aParams['order']) || empty($aParams['order']))
  663. $sOrderClause = "ORDER BY `tfld`.`order` ASC";
  664. switch($aParams['type']) {
  665. case 'by_id':
  666. $aMethod['name'] = 'getRow';
  667. $aMethod['params'][1] = array(
  668. 'id' => $aParams['id']
  669. );
  670. $sWhereClause = " AND `tfld`.`id`=:id ";
  671. break;
  672. case 'by_object':
  673. $aMethod['params'][1] = array(
  674. 'object' => $aParams['object']
  675. );
  676. $sWhereClause = "AND `tfld`.`object`=:object";
  677. break;
  678. case 'counter_by_modules':
  679. $aMethod['name'] = 'getPairs';
  680. $aMethod['params'][1] = 'module';
  681. $aMethod['params'][2] = 'counter';
  682. $sSelectClause = ", COUNT(*) AS `counter`";
  683. $sGroupClause = "GROUP BY `tfld`.`module`";
  684. $sOrderClause = "";
  685. break;
  686. case 'all':
  687. break;
  688. }
  689. $aMethod['params'][0] = "SELECT " . ($bReturnCount ? "SQL_CALC_FOUND_ROWS" : "") . "
  690. `tfld`.*" . $sSelectClause . "
  691. FROM `sys_search_extended_fields` AS `tfld` " . $sJoinClause . "
  692. WHERE 1 " . $sWhereClause . " " . $sGroupClause . " " . $sOrderClause . " " . $sLimitClause;
  693. $aItems = call_user_func_array(array($this, $aMethod['name']), $aMethod['params']);
  694. if(!$bReturnCount)
  695. return !empty($aItems);
  696. return (int)$this->getOne("SELECT FOUND_ROWS()");
  697. }
  698. function getSortableFields($aParams, &$aItems, $bReturnCount = true)
  699. {
  700. $aMethod = array('name' => 'getAll', 'params' => array(0 => 'query'));
  701. $sSelectClause = $sFromClause = $sJoinClause = $sWhereClause = $sGroupClause = $sOrderClause = $sLimitClause = "";
  702. if(!isset($aParams['order']) || empty($aParams['order']))
  703. $sOrderClause = "ORDER BY `tfld`.`order` ASC";
  704. switch($aParams['type']) {
  705. case 'by_id':
  706. $aMethod['name'] = 'getRow';
  707. $aMethod['params'][1] = array(
  708. 'id' => $aParams['id']
  709. );
  710. $sWhereClause = " AND `tfld`.`id`=:id ";
  711. break;
  712. case 'by_object':
  713. $aMethod['params'][1] = array(
  714. 'object' => $aParams['object']
  715. );
  716. $sWhereClause = "AND `tfld`.`object`=:object";
  717. break;
  718. case 'counter_by_modules':
  719. $aMethod['name'] = 'getPairs';
  720. $aMethod['params'][1] = 'module';
  721. $aMethod['params'][2] = 'counter';
  722. $sSelectClause = ", COUNT(*) AS `counter`";
  723. $sGroupClause = "GROUP BY `tfld`.`module`";
  724. $sOrderClause = "";
  725. break;
  726. case 'all':
  727. break;
  728. }
  729. $aMethod['params'][0] = "SELECT " . ($bReturnCount ? "SQL_CALC_FOUND_ROWS" : "") . "
  730. `tfld`.*" . $sSelectClause . "
  731. FROM `sys_search_extended_sorting_fields` AS `tfld` " . $sJoinClause . "
  732. WHERE 1 " . $sWhereClause . " " . $sGroupClause . " " . $sOrderClause . " " . $sLimitClause;
  733. $aItems = call_user_func_array(array($this, $aMethod['name']), $aMethod['params']);
  734. if(!$bReturnCount)
  735. return !empty($aItems);
  736. return (int)$this->getOne("SELECT FOUND_ROWS()");
  737. }
  738. function alterAdd($sTable, $sField, $sType)
  739. {
  740. if($this->isFieldExists($sTable, $sField))
  741. return true;
  742. return (int)$this->query("ALTER TABLE `" . $sTable . "` ADD `" . $sField . "` " . $sType) > 0;
  743. }
  744. function alterChange($sTable, $sFieldOld, $sFieldNew, $sTypeNew)
  745. {
  746. if(!$this->isFieldExists($sTable, $sFieldOld))
  747. return false;
  748. if(strcmp($sFieldOld, $sFieldNew) !== 0 && $this->isFieldExists($sTable, $sFieldNew))
  749. return false;
  750. return (int)$this->query("ALTER TABLE `" . $sTable . "` CHANGE `" . $sFieldOld . "` `" . $sFieldNew . "` " . $sTypeNew) > 0;
  751. }
  752. function alterRemove($sTable, $sField)
  753. {
  754. if(!$this->isFieldExists($sTable, $sField))
  755. return true;
  756. return (int)$this->query("ALTER TABLE `" . $sTable . "` DROP `" . $sField . "`") > 0;
  757. }
  758. }
  759. /** @} */