BxDolFormQuery.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370
  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 UnaCore UNA Core
  7. * @{
  8. */
  9. bx_import('BxDolForm');
  10. /**
  11. * Database queries for forms.
  12. * @see BxDolForm
  13. */
  14. class BxDolFormQuery extends BxDolDb
  15. {
  16. protected $_aObject;
  17. protected static $TYPES_SET = array (
  18. 'select_multiple' => 1,
  19. 'checkbox_set' => 1,
  20. );
  21. protected static $TYPES_TRANSLATABLE = array (
  22. 'submit' => 1,
  23. 'reset' => 1,
  24. 'button' => 1,
  25. );
  26. public function __construct($aObject)
  27. {
  28. parent::__construct();
  29. $this->_aObject = $aObject;
  30. }
  31. static public function getFormObject ($sObject)
  32. {
  33. $oDb = BxDolDb::getInstance();
  34. $sQuery = $oDb->prepare("SELECT * FROM `sys_objects_form` WHERE `object` = ?", $sObject);
  35. return $oDb->fromMemory('sys_objects_form_' . $sObject, 'getRow', $sQuery);
  36. }
  37. static public function getNestedFormObjects ($sParentObject)
  38. {
  39. $oDb = BxDolDb::getInstance();
  40. $sQuery = $oDb->prepare("SELECT * FROM `sys_objects_form` WHERE `parent_form` = ?", $sParentObject);
  41. return $oDb->fromMemory('sys_objects_form_' . $sParentObject . '_nested', 'getAll', $sQuery);
  42. }
  43. static public function deleteDataFromNestedForm ($sTableName, $iContentId)
  44. {
  45. $oDb = BxDolDb::getInstance();
  46. $sQuery = $oDb->prepare("DELETE FROM `" . $sTableName ."` WHERE `content_id` = ?", $iContentId);
  47. $oDb->query($sQuery);
  48. }
  49. static public function getFormArray ($sObject, $sDisplayName)
  50. {
  51. $oDb = BxDolDb::getInstance();
  52. $sQuery = $oDb->prepare("SELECT * FROM `sys_objects_form` WHERE `active` = 1 AND `object` = ?", $sObject);
  53. $aObject = $oDb->fromMemory('sys_objects_form_' . $sObject, 'getRow', $sQuery);
  54. if (!$aObject || !is_array($aObject))
  55. return false;
  56. $sQuery = $oDb->prepare("SELECT * FROM `sys_form_displays` WHERE `object` = ? AND `display_name` = ?", $sObject, $sDisplayName);
  57. $aDisplay = $oDb->fromMemory('sys_form_displays_' . $sObject . '_' . $sDisplayName, 'getRow', $sQuery);
  58. if (!$aDisplay || !is_array($aDisplay))
  59. return false;
  60. $aForm = array ();
  61. // form attrs
  62. if (!empty($aObject['form_attrs']))
  63. $aAddFormAttrs = unserialize($aObject['form_attrs']);
  64. $aDefaultsFormAttrs = array(
  65. 'action' => $aObject['action'],
  66. 'name' => $aObject['object'],
  67. 'id' => $aObject['object'],
  68. );
  69. $aForm['form_attrs'] = array_merge($aDefaultsFormAttrs, !empty($aAddFormAttrs) && is_array($aAddFormAttrs) ? $aAddFormAttrs : array());
  70. // form action
  71. if (!empty($aForm['form_attrs']['action']) && 0 !== strncasecmp($aForm['form_attrs']['action'], 'http://', 7) && 0 !== strncasecmp($aForm['form_attrs']['action'], 'https://', 8))
  72. $aForm['form_attrs']['action'] = bx_absolute_url(BxDolPermalinks::getInstance()->permalink($aForm['form_attrs']['action']));
  73. // params
  74. if (!empty($aObject['params']))
  75. $aAddFormParams = unserialize($aObject['params']);
  76. $mixedSubminName = '';
  77. if (!empty($aObject['submit_name'])) {
  78. $mixedSubminName = @unserialize($aObject['submit_name']);
  79. if($mixedSubminName === false)
  80. $mixedSubminName = $aObject['submit_name'];
  81. }
  82. $aDefaultsFormParams = array(
  83. 'db' => array(
  84. 'submit_name' => $mixedSubminName,
  85. 'table' => $aObject['table'],
  86. 'key' => $aObject['key'],
  87. 'uri' => $aObject['uri'],
  88. 'uri_title' => $aObject['uri_title'],
  89. ),
  90. 'module' => $aObject['module'],
  91. 'object' => $sObject,
  92. 'display' => $sDisplayName,
  93. 'view_mode' => $aDisplay['view_mode'],
  94. );
  95. $aForm['params'] = array_merge_recursive($aDefaultsFormParams, !empty($aAddFormParams) && is_array($aAddFormParams) ? $aAddFormParams : array());
  96. // form inputs
  97. $sQuery = $oDb->prepare("SELECT `i`.*, `d`.`visible_for_levels` FROM `sys_form_inputs` AS `i` INNER JOIN `sys_form_display_inputs` AS `d` ON (`d`.`input_name` = `i`.`name`) WHERE `d`.`active` = 1 AND `d`.`display_name` = ? AND `i`.`object` = ? ORDER BY `d`.`order` ASC", $aDisplay['display_name'], $sObject);
  98. $aInputs = $oDb->getAllWithKey($sQuery, 'name');
  99. $aForm['inputs'] = array();
  100. $aInputSets = array();
  101. foreach ($aInputs as $a) {
  102. // main attributes
  103. $aInput = array (
  104. 'id' => $a['id'],
  105. 'type' => $a['type'],
  106. 'name' => $a['name'],
  107. 'caption_system_src' => $a['caption_system'],
  108. 'caption_src' => $a['caption'],
  109. 'caption' => _t($a['caption']),
  110. 'info_src' => $a['info'] ? $a['info'] : '',
  111. 'info' => $a['info'] ? _t($a['info']) : '',
  112. 'help_src' => $a['help'] ? $a['help'] : '',
  113. 'help' => $a['help'] ? _t($a['help']) : '',
  114. 'icon' => $a['icon'],
  115. 'required' => $a['required'] ? true : false,
  116. 'unique' => $a['unique'] ? true : false,
  117. 'collapsed' => $a['collapsed'] ? true : false,
  118. 'privacy' => $a['privacy'] ? true : false,
  119. 'rateable' => $a['rateable'],
  120. 'html' => $a['html'],
  121. 'attrs' => $a['attrs'] ? unserialize($a['attrs']) : [],
  122. 'tr_attrs' => $a['attrs_tr'] ? unserialize($a['attrs_tr']) : [],
  123. 'attrs_wrapper' => $a['attrs_wrapper'] ? unserialize($a['attrs_wrapper']) : [],
  124. 'visible_for_levels' => $a['visible_for_levels'],
  125. );
  126. // if type is input set stop to process other attribnutes
  127. if ('input_set' == $a['type']) {
  128. $aForm['inputs'][$a['name']] = $aInput;
  129. $aInputSets[] = $a['name'];
  130. continue;
  131. }
  132. // default value
  133. if (!empty($a['value']))
  134. $aInput['value'] = isset(self::$TYPES_TRANSLATABLE[$aInput['type']]) ? _t($a['value']) : $a['value'];
  135. if (!empty($a['values'])) {
  136. $aInput['values_src'] = $a['values'];
  137. if (0 === strncmp(BX_DATA_LISTS_KEY_PREFIX, $a['values'], 2)) {
  138. $aInput['values_list_name'] = trim($a['values'], BX_DATA_LISTS_KEY_PREFIX . ' ');
  139. $aInput['values'] = self::getDataItems(trim($a['values'], BX_DATA_LISTS_KEY_PREFIX . ' '), isset(self::$TYPES_SET[$aInput['type']]));
  140. } else {
  141. $aInput['values'] = unserialize($a['values']);
  142. }
  143. }
  144. $aInput['checked'] = $a['checked'] ? true : false;
  145. // checker function options
  146. if (!empty($a['checker_func'])) {
  147. $aChecker = array ('func' => $a['checker_func']);
  148. if ($a['checker_error'])
  149. $aChecker['error'] = _t($a['checker_error']);
  150. if ($a['checker_params'])
  151. $aChecker['params'] = unserialize($a['checker_params']);
  152. $aInput['checker'] = $aChecker;
  153. }
  154. // db processing options
  155. if (!empty($a['db_pass'])) {
  156. $aDb = array ('pass' => $a['db_pass']);
  157. if ($a['db_params'])
  158. $a['params'] = unserialize($a['db_params']);
  159. $aInput['db'] = $aDb;
  160. }
  161. $aForm['inputs'][$a['name']] = $aInput;
  162. }
  163. foreach ($aInputSets as $sName) {
  164. $a = explode(',', $aInputs[$sName]['values']);
  165. foreach ($a as $sInputName) {
  166. if (!isset($aForm['inputs'][$sInputName]))
  167. continue;
  168. $aForm['inputs'][$sName][] = $aForm['inputs'][$sInputName];
  169. unset($aForm['inputs'][$sInputName]);
  170. }
  171. }
  172. $aForm['override_class_name'] = $aObject['override_class_name'];
  173. $aForm['override_class_file'] = $aObject['override_class_file'];
  174. return $aForm;
  175. }
  176. static public function getDataItems($sKey, $isUseForSet = false, $sUseValues = BX_DATA_VALUES_DEFAULT)
  177. {
  178. $oDb = BxDolDb::getInstance();
  179. if(!in_array($sUseValues, array(BX_DATA_VALUES_DEFAULT, BX_DATA_VALUES_ADDITIONAL, BX_DATA_VALUES_ALL)))
  180. $sUseValues = BX_DATA_VALUES_DEFAULT;
  181. $sQuery = $oDb->prepare("SELECT `Value`, `LKey`, `LKey2`, `Data` FROM `sys_form_pre_values` WHERE `Key` = ? ORDER BY `Order` ASC", $sKey);
  182. if($sUseValues == BX_DATA_VALUES_ALL)
  183. return $oDb->getAllWithKey($sQuery, 'Value');
  184. $a = $oDb->getAll($sQuery);
  185. $iMaxValue = 0;
  186. if ($isUseForSet)
  187. $iMaxValue = log(BX_DOL_INT_MAX, 2) + 1;
  188. $aRet = array();
  189. foreach ($a as $r) {
  190. if ($isUseForSet && (!is_numeric($r['Value']) || $r['Value'] < 1 || $r['Value'] > $iMaxValue))
  191. continue;
  192. $aRet[$r['Value']] = BX_DATA_VALUES_ADDITIONAL == $sUseValues && !empty($r[BX_DATA_VALUES_ADDITIONAL]) ? _t($r[BX_DATA_VALUES_ADDITIONAL]) : _t($r[BX_DATA_VALUES_DEFAULT]);
  193. }
  194. return $aRet;
  195. }
  196. static public function fieldCheckUnique($sTable, $sField, $sValue)
  197. {
  198. return uriCheckUniq($sValue, $sTable, $sField);
  199. }
  200. static public function fieldGetValue($sTable, $sField, $sFieldKey, $sFieldKeyValue)
  201. {
  202. return BxDolDb::getInstance()->getOne("SELECT `" . $sField . "` FROM `" . $sTable . "` WHERE `" . $sFieldKey . "`=:field_key LIMIT 1", array(
  203. 'field_key' => $sFieldKeyValue
  204. ));
  205. }
  206. static public function getInputByName($sObject, $sName)
  207. {
  208. return BxDolDb::getInstance()->getRow("SELECT * FROM `sys_form_inputs` WHERE `object`=:object AND `name`=:name LIMIT 1", array(
  209. 'object' => $sObject,
  210. 'name' => $sName
  211. ));
  212. }
  213. static public function getInputPrivacy($iInputId, $iAuthorId, $sPrivacyField = '')
  214. {
  215. $sMethod = 'getRow';
  216. $sSelectClause = '*';
  217. if(!empty($sPrivacyField)) {
  218. $sMethod = 'getOne';
  219. $sSelectClause = '`' . $sPrivacyField . '`';
  220. }
  221. return BxDolDb::getInstance()->$sMethod("SELECT " . $sSelectClause . " FROM `sys_form_inputs_privacy` WHERE `input_id`=:input_id AND `author_id`=:author_id LIMIT 1", array(
  222. 'input_id' => $iInputId,
  223. 'author_id' => $iAuthorId,
  224. ));
  225. }
  226. static public function setInputPrivacy($iInputId, $iAuthorId, $sPrivacyField, $sPrivacyValue)
  227. {
  228. $oDb = BxDolDb::getInstance();
  229. $sTable = 'sys_form_inputs_privacy';
  230. $aBindingsSet = array(
  231. $sPrivacyField => $sPrivacyValue
  232. );
  233. $aBindingsWhere = array(
  234. 'input_id' => $iInputId,
  235. 'author_id' => $iAuthorId,
  236. );
  237. $bResult = false;
  238. if((int)$oDb->getOne("SELECT `id` FROM `" . $sTable . "` WHERE `input_id`=:input_id AND `author_id`=:author_id LIMIT 1", $aBindingsWhere) != 0)
  239. $bResult = $oDb->query("UPDATE `" . $sTable . "` SET " . $oDb->arrayToSQL($aBindingsSet) . " WHERE " . $oDb->arrayToSQL($aBindingsWhere, ' AND ')) !== false;
  240. else
  241. $bResult = (int)$oDb->query("INSERT `" . $sTable . "` SET " . $oDb->arrayToSQL(array_merge($aBindingsSet, $aBindingsWhere))) > 0;
  242. return $bResult;
  243. }
  244. static public function addFormField($sObjectForm, $sFieldName, $iContentId, $iAuthorId, $sModuleName, $iNestedContentId = 0)
  245. {
  246. $oDb = BxDolDb::getInstance();
  247. $aBindings = array(
  248. 'object_form' => $sObjectForm,
  249. 'field_name' => $sFieldName,
  250. 'content_id' => $iContentId,
  251. 'author_id' => $iAuthorId,
  252. 'module' => $sModuleName,
  253. 'nested_content_id' => $iNestedContentId
  254. );
  255. $oDb->query("INSERT `sys_form_fields_ids` SET `object_form`=:object_form, `field_name`=:field_name, `content_id`=:content_id, `author_id`=:author_id, `module`=:module, nested_content_id=:nested_content_id", $aBindings);
  256. }
  257. static public function getFormField($sObjectForm, $sFieldName, $iContentId, $iNestedContentId = 0)
  258. {
  259. $oDb = BxDolDb::getInstance();
  260. $aBindings = array(
  261. 'object_form' => $sObjectForm,
  262. 'field_name' => $sFieldName,
  263. 'content_id' => $iContentId,
  264. 'nested_content_id' => $iNestedContentId
  265. );
  266. return $oDb->getOne("SELECT `id` FROM `sys_form_fields_ids` WHERE `object_form`=:object_form AND `field_name`=:field_name AND `content_id`=:content_id AND nested_content_id=:nested_content_id", $aBindings);
  267. }
  268. static public function removeFormField($sObjectForm, $iContentId = 0)
  269. {
  270. $oDb = BxDolDb::getInstance();
  271. if ($iContentId > 0){
  272. $aBindings = array(
  273. 'object_form' => $sObjectForm,
  274. 'content_id' => $iContentId
  275. );
  276. $oDb->query("DELETE FROM `sys_form_fields_ids` WHERE `object_form` = :object_form AND `content_id` = :content_id", $aBindings);
  277. }
  278. else{
  279. $aBindings = array(
  280. 'object_form' => $sObjectForm
  281. );
  282. $oDb->query("DELETE FROM `sys_form_fields_ids` WHERE `object_form` = :object_form", $aBindings);
  283. }
  284. }
  285. static public function removeFormFields($sModule)
  286. {
  287. $oDb = BxDolDb::getInstance();
  288. $aBindings = array(
  289. 'module' => $sModule,
  290. );
  291. $oDb->query("DELETE FROM `sys_form_fields_ids` WHERE `module` = :module", $aBindings);
  292. }
  293. static public function getFormInputs($sObject, $mDisplay = '')
  294. {
  295. $oDb = BxDolDb::getInstance();
  296. if ($mDisplay == ''){
  297. $sQuery = $oDb->prepare("SELECT * FROM `sys_form_inputs` WHERE `object` = ?", $sObject);
  298. return $oDb->getAll($sQuery);
  299. }
  300. else{
  301. if (!is_array($mDisplay))
  302. $mDisplay = [$mDisplay];
  303. $sQuery = $oDb->prepare("
  304. SELECT DISTINCT `sys_form_inputs`.* FROM `sys_form_inputs`
  305. INNER JOIN `sys_form_display_inputs` ON `sys_form_display_inputs`.`input_name` =`sys_form_inputs`.`name`
  306. WHERE `sys_form_display_inputs`.`display_name` IN (" . $oDb->implode_escape($mDisplay) . ")
  307. AND `sys_form_inputs`.`object` = ? AND `sys_form_display_inputs`.`active` = 1", $sObject);
  308. return $oDb->getAll($sQuery);
  309. }
  310. }
  311. }
  312. /** @} */