BxDevBuilderPage.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439
  1. <? defined('BX_DOL') or die('hack attempt');
  2. /**
  3. * Copyright (c) BoonEx Pty Limited - http://www.boonex.com/
  4. * CC-BY License - http://creativecommons.org/licenses/by/3.0/
  5. *
  6. * @defgroup Developer Developer
  7. * @ingroup DolphinModules
  8. *
  9. * @{
  10. */
  11. bx_import('BxTemplStudioBuilderPage');
  12. class BxDevBuilderPage extends BxTemplStudioBuilderPage {
  13. protected $sActionPageExport = 'page_export';
  14. protected $oModule;
  15. protected $aParams;
  16. function __construct($aParams) {
  17. parent::__construct(isset($aParams['type']) ? $aParams['type'] : '', isset($aParams['page']) ? $aParams['page'] : '');
  18. $this->aParams = $aParams;
  19. $this->sBaseUrl = $this->aParams['url'];
  20. $this->sTypeUrl = $this->sBaseUrl . '&bp_type=%s';
  21. $this->sPageUrl = $this->sTypeUrl . '&bp_page=%s';
  22. bx_import('BxDolModule');
  23. $this->oModule = BxDolModule::getInstance('bx_developer');
  24. $this->oModule->_oTemplate->addStudioCss(array('builder_page.css'));
  25. }
  26. function getBlockPanelTop($aParams = array()) {
  27. $sJsObject = $this->getPageJsObject();
  28. $oForm = new BxTemplStudioFormView(array());
  29. $aInputPages = array(
  30. 'type' => 'select',
  31. 'name' => 'page',
  32. 'attrs' => array(
  33. 'onChange' => 'javascript:' . $this->getPageJsObject() . '.onChangePage(this)'
  34. ),
  35. 'value' => $this->sPage,
  36. 'values' => array(
  37. array('key' => '', 'value' => _t('_adm_bp_txt_select_page'))
  38. )
  39. );
  40. $aPages = $aCounter = array();
  41. $this->oDb->getPages(array('type' => 'by_module', 'value' => $this->sType), $aPages, false);
  42. $this->oDb->getBlocks(array('type' => 'counter_by_pages'), $aCounter, false);
  43. foreach($aPages as $aPage)
  44. $aInputPages['values'][] = array('key' => $aPage['object'], 'value' => _t($aPage['title_system']) . " (" . (isset($aCounter[$aPage['object']]) ? $aCounter[$aPage['object']] : "0") . ")");
  45. bx_import('BxDolPermalinks');
  46. $oPermalinks = BxDolPermalinks::getInstance();
  47. $aTmplVarsActions = array();
  48. if(($this->sPage != '' && !empty($this->aPageRebuild)) !== false)
  49. $aTmplVarsActions = array(
  50. 'js_object' => $sJsObject,
  51. 'url_view' => BX_DOL_URL_ROOT . $oPermalinks->permalink($this->aPageRebuild['url']),
  52. 'action_page_export' => $this->sActionPageExport,
  53. 'action_page_edit' => $this->sActionPageEdit,
  54. 'action_block_create' => $this->sActionBlockCreate,
  55. );
  56. $aTmplVars = array(
  57. 'js_object' => $this->getPageJsObject(),
  58. 'selector' => $oForm->genRow($aInputPages),
  59. 'action_page_create' => $this->sActionPageCreate,
  60. 'bx_if:show_actions' => array(
  61. 'condition' => $this->sPage != '',
  62. 'content' => $aTmplVarsActions
  63. )
  64. );
  65. return BxBaseStudioPage::getBlockPanelTop(
  66. array('panel_top' => $this->oModule->_oTemplate->parseHtmlByName('bp_block_panel_top.html', $aTmplVars))
  67. );
  68. }
  69. protected function actionPageCreate() {
  70. bx_import('BxDolForm');
  71. $oForm = BxDolForm::getObjectInstance('mod_dev_bp_page', 'mod_dev_bp_page_add');
  72. $oForm->aFormAttrs['action'] = sprintf($this->sPageUrl, $this->sType, $this->sPage) . '&bp_action=' . $this->sActionPageCreate;
  73. $oForm->aInputs['module']['values'] = array_merge(array('' => _t('_bx_dev_bp_txt_select_module')), BxDolStudioUtils::getModules());
  74. $oForm->aInputs['layout_id']['values'] = array(
  75. array('key' => '', 'value' => _t('_bx_dev_bp_txt_page_layout_id_select'))
  76. );
  77. $aLayouts = array();
  78. $this->oDb->getLayouts(array('type' => 'all'), $aLayouts, false);
  79. foreach($aLayouts as $aLayout)
  80. $oForm->aInputs['layout_id']['values'][] = array('key' => $aLayout['id'], 'value' => _t($aLayout['title']));
  81. $oForm->initChecker();
  82. if($oForm->isSubmittedAndValid()) {
  83. $sObject = $oForm->getCleanValue('object');
  84. $sModule = $oForm->getCleanValue('module');
  85. if(($iId = (int)$oForm->insert()) != 0)
  86. return array('eval' => $this->getPageJsObject() . '.onCreatePage(\'' . $sModule . '\', \'' . $sObject . '\')');
  87. else
  88. return array('msg' => _t('_bx_dev_bp_err_page_create'));
  89. }
  90. bx_import('BxTemplStudioFunctions');
  91. $sContent = BxTemplStudioFunctions::getInstance()->popupBox($this->aHtmlIds['create_popup_id'], _t('_bx_dev_bp_txt_page_create_popup'), $this->oModule->_oTemplate->parseHtmlByName('bp_add_page.html', array(
  92. 'form_id' => $oForm->aFormAttrs['id'],
  93. 'form' => $oForm->getCode(true)
  94. )));
  95. return array('popup' => $sContent);
  96. }
  97. protected function actionPageExport() {
  98. $sContentInsert = $sContentDelete = "";
  99. $aPage = array();
  100. $this->oDb->getPages(array('type' => 'by_object', 'value' => $this->sPage), $aPage, false);
  101. if(empty($aPage) || !is_array($aPage))
  102. return array();
  103. $sContentInsert .= ($this->oModule->_oDb->getQueryInsert('sys_objects_page', array($aPage), "Dumping data for '" . $aPage['object'] . "' page"));
  104. $sContentDelete .= ($this->oModule->_oDb->getQueryDelete('sys_objects_page', 'object', array($aPage), "Deleting data for '" . $aPage['object'] . "' page"));
  105. $aBlocks = array();
  106. $this->oDb->getBlocks(array('type' => 'by_object', 'value' => $aPage['object']), $aBlocks, false);
  107. $sContentInsert .= $this->oModule->_oDb->getQueryInsert('sys_pages_blocks', $aBlocks, false, array('id', 'name'));
  108. $sContentDelete .= $this->oModule->_oDb->getQueryDelete('sys_pages_blocks', 'object', array($aPage), false);
  109. $aForm = array(
  110. 'form_attrs' => array(),
  111. 'inputs' => array (
  112. 'insert' => array(
  113. 'type' => 'textarea',
  114. 'name' => 'insert',
  115. 'caption' => _t('_bx_dev_bp_txt_page_export_insert'),
  116. 'value' => $sContentInsert,
  117. ),
  118. 'delete' => array(
  119. 'type' => 'textarea',
  120. 'name' => 'delete',
  121. 'caption' => _t('_bx_dev_bp_txt_page_export_delete'),
  122. 'value' => $sContentDelete,
  123. ),
  124. 'done' => array (
  125. 'type' => 'button',
  126. 'name' => 'done',
  127. 'value' => _t('_bx_dev_bp_btn_page_done'),
  128. 'attrs' => array(
  129. 'onclick' => "$('.bx-popup-applied:visible').dolPopupHide()",
  130. ),
  131. )
  132. )
  133. );
  134. $oForm = new BxTemplStudioFormView($aForm);
  135. bx_import('BxTemplStudioFunctions');
  136. $sContent = BxTemplStudioFunctions::getInstance()->popupBox('bx-dev-bp-page-export-popup', _t('_bx_dev_bp_txt_page_export_popup', _t($aPage['title'])), $this->oModule->_oTemplate->parseHtmlByName('bp_export.html', array(
  137. 'content' => $oForm->getCode()
  138. )));
  139. return array('popup' => $sContent);
  140. }
  141. protected function actionBlockEdit() {
  142. $iId = (int)bx_get('id');
  143. if(!$iId)
  144. return array();
  145. $aBlock = array();
  146. $this->oDb->getBlocks(array('type' => 'by_id', 'value' => $iId), $aBlock, false);
  147. if(empty($aBlock) || !is_array($aBlock))
  148. return array('msg' => _t('_bx_dev_bp_err_block_not_found'));
  149. bx_import('BxDolForm');
  150. $oForm = BxDolForm::getObjectInstance('mod_dev_bp_block', 'mod_dev_bp_block_edit');
  151. $this->onLoadBlock($oForm, $aBlock);
  152. $oForm->initChecker($aBlock);
  153. if($oForm->isSubmittedAndValid()) {
  154. $this->onSaveBlock($oForm, $aBlock);
  155. if($oForm->update($iId) !== false)
  156. return array('eval' => $this->getPageJsObject() . '.onEditBlock(oData)');
  157. else
  158. return array('msg' => _t('_bx_dev_bp_err_block_edit'));
  159. }
  160. bx_import('BxTemplStudioFunctions');
  161. $sContent = BxTemplStudioFunctions::getInstance()->popupBox($this->aHtmlIds['edit_block_popup_id'], _t('_bx_dev_bp_txt_block_edit_popup', _t($aBlock['title'])), $this->oModule->_oTemplate->parseHtmlByName('bp_add_block.html', array(
  162. 'form_id' => $oForm->aFormAttrs['id'],
  163. 'form' => $oForm->getCode(true)
  164. )));
  165. return array('popup' => $sContent);
  166. }
  167. protected function actionBlockDelete() {
  168. $sJsObject = $this->getPageJsObject();
  169. $iId = (int)bx_get('id');
  170. $aBlock = array();
  171. $this->oDb->getBlocks(array('type' => 'by_id', 'value' => $iId), $aBlock, false);
  172. if(empty($aBlock) || !is_array($aBlock))
  173. return array('msg' => _t('_bx_dev_bp_err_block_not_found'));
  174. if(!$this->oDb->deleteBlocks(array('type' => 'by_id', 'value' => $iId)))
  175. return array('msg' => _t('_bx_dev_bp_err_block_delete'));
  176. $this->onBlockDelete($aBlock);
  177. return array('eval' => $sJsObject . '.onDeleteBlock(' . $iId . ', oData)');
  178. }
  179. protected function getSettingsOptions($bInputsOnly = false) {
  180. $aForm = array(
  181. 'form_attrs' => array(
  182. 'id' => 'adm-bp-settings-seo',
  183. ),
  184. 'params' => array (
  185. 'remove_form' => '1',
  186. 'csrf' => array(
  187. 'disable' => true
  188. )
  189. ),
  190. 'inputs' => array(
  191. 'object' => array(
  192. 'type' => 'text',
  193. 'name' => 'object',
  194. 'caption' => _t('_bx_dev_bp_txt_page_object'),
  195. 'info' => '',
  196. 'value' => $this->aPageRebuild['object'],
  197. 'required' => '',
  198. 'attrs' => array(
  199. 'disabled' => 'disabled'
  200. ),
  201. )
  202. )
  203. );
  204. $aForm['inputs'] += parent::getSettingsOptions(true);
  205. $aForm['inputs']['title_system']['type'] = 'text';
  206. $aForm['inputs']['title_system']['caption'] = _t('_bx_dev_bp_txt_page_title_system');
  207. $aForm['inputs']['title']['type'] = 'text';
  208. $aUri = array(
  209. 'uri' => array(
  210. 'type' => 'text',
  211. 'name' => 'uri',
  212. 'caption' => _t('_bx_dev_bp_txt_page_uri'),
  213. 'info' => '',
  214. 'value' => $this->aPageRebuild['uri'],
  215. 'required' => '',
  216. 'db' => array (
  217. 'pass' => 'Xss',
  218. ),
  219. )
  220. );
  221. $aForm['inputs'] = bx_array_insert_before($aUri, $aForm['inputs'], 'url');
  222. $aForm['inputs']['url']['caption'] = _t('_bx_dev_bp_txt_page_url');
  223. $aForm['inputs']['url']['db'] = array (
  224. 'pass' => 'Xss',
  225. );
  226. unset($aForm['inputs']['url']['attrs']['disabled']);
  227. $aForm['inputs']['deletable'] = array(
  228. 'type' => 'checkbox',
  229. 'name' => 'deletable',
  230. 'caption' => _t('_bx_dev_bp_txt_page_deletable'),
  231. 'info' => '',
  232. 'value' => '1',
  233. 'checked' => (int)$this->aPageRebuild['deletable'] == 1,
  234. 'required' => '',
  235. 'db' => array (
  236. 'pass' => 'Int',
  237. )
  238. );
  239. $aForm['inputs']['override_class_name'] = array(
  240. 'type' => 'text',
  241. 'name' => 'override_class_name',
  242. 'caption' => _t('_bx_dev_bp_txt_page_override_class_name'),
  243. 'info' => '',
  244. 'value' => $this->aPageRebuild['override_class_name'],
  245. 'required' => '0',
  246. 'db' => array (
  247. 'pass' => 'Xss',
  248. )
  249. );
  250. $aForm['inputs']['override_class_file'] = array(
  251. 'type' => 'text',
  252. 'name' => 'override_class_file',
  253. 'caption' => _t('_bx_dev_bp_txt_page_override_class_file'),
  254. 'info' => '',
  255. 'value' => $this->aPageRebuild['override_class_file'],
  256. 'required' => '0',
  257. 'db' => array (
  258. 'pass' => 'Xss',
  259. )
  260. );
  261. if($bInputsOnly)
  262. return $aForm['inputs'];
  263. $oForm = new BxTemplStudioFormView($aForm);
  264. return $oForm->getCode();
  265. }
  266. protected function getSettingsCache($bInputsOnly = false) {
  267. $aForm = array(
  268. 'form_attrs' => array(
  269. 'id' => 'adm-bp-settings-cache',
  270. ),
  271. 'params' => array (
  272. 'remove_form' => '1',
  273. 'csrf' => array(
  274. 'disable' => true
  275. )
  276. ),
  277. 'inputs' => parent::getSettingsCache(true)
  278. );
  279. unset($aForm['inputs']['cache_lifetime']['attrs']);
  280. $aForm['inputs']['cache_editable'] = array(
  281. 'type' => 'checkbox',
  282. 'name' => 'cache_editable',
  283. 'caption' => _t('_bx_dev_bp_txt_page_cache_editable'),
  284. 'info' => '',
  285. 'value' => '1',
  286. 'checked' => (int)$this->aPageRebuild['cache_editable'] == 1,
  287. 'required' => '',
  288. 'db' => array (
  289. 'pass' => 'Int',
  290. )
  291. );
  292. if($bInputsOnly)
  293. return $aForm['inputs'];
  294. $oForm = new BxTemplStudioFormView($aForm);
  295. return $oForm->getCode();
  296. }
  297. protected function getBlockModule($aBlock) {
  298. return $this->aPageRebuild['module'];
  299. }
  300. protected function getBlockContent($aBlock) {
  301. $aFields = array();
  302. switch($aBlock['type']) {
  303. case BX_DOL_STUDIO_BP_BLOCK_SERVICE:
  304. $aFields = array(
  305. 'content' => array(
  306. 'type' => 'textarea',
  307. 'name' => 'content',
  308. 'caption' => _t('_bx_dev_bp_txt_block_content_service'),
  309. 'info' => '',
  310. 'value' => $aBlock['content'],
  311. 'required' => '0',
  312. 'db' => array (
  313. 'pass' => 'Xss',
  314. ),
  315. )
  316. );
  317. break;
  318. default:
  319. $aFields = parent::getBlockContent($aBlock);
  320. break;
  321. }
  322. return $aFields;
  323. }
  324. protected function getBlocks($sModule) {
  325. $aBlocks = parent::getBlocks($sModule);
  326. if($sModule == BX_DOL_STUDIO_BP_SKELETONS) {
  327. $aBlock = array();
  328. $this->oDb->getBlocks(array('type' => 'skeleton_by_type', 'value' => 'service'), $aBlock, false);
  329. if(!empty($aBlock) && is_array($aBlock))
  330. $aBlocks[] = $aBlock;
  331. }
  332. return $aBlocks;
  333. }
  334. protected function onLoadBlock(&$oForm, &$aBlock) {
  335. $oForm->aFormAttrs['action'] = sprintf($this->sPageUrl, $this->sType, $this->sPage) . '&bp_action=' . $this->sActionBlockEdit;
  336. $oForm->aInputs['module']['values'] = array_merge(array('' => _t('_bx_dev_bp_txt_select_module')), BxDolStudioUtils::getModules());
  337. $aDBoxes = array();
  338. $this->oDb->getDesignBoxes(array('type' => 'ordered'), $aDBoxes, false);
  339. foreach($aDBoxes as $aDBox)
  340. $oForm->aInputs['designbox_id']['values'][] = array('key' => $this->sSelectKeyPrefix . $aDBox['id'], 'value' => _t($aDBox['title']));
  341. $oForm->aInputs['visible_for']['value'] = $aBlock['visible_for_levels'] == BX_DOL_INT_MAX ? BX_DOL_STUDIO_VISIBLE_ALL : BX_DOL_STUDIO_VISIBLE_SELECTED;
  342. $oForm->aInputs['visible_for']['values'] = array(
  343. array('key' => BX_DOL_STUDIO_VISIBLE_ALL, 'value' => _t('_bx_dev_bp_txt_block_visible_for_all')),
  344. array('key' => BX_DOL_STUDIO_VISIBLE_SELECTED, 'value' => _t('_bx_dev_bp_txt_block_visible_for_selected')),
  345. );
  346. $oForm->aInputs['visible_for']['attrs']['onchange'] = $this->getPageJsObject() . '.onChangeVisibleFor(this)';
  347. $oForm->aInputs['visible_for_levels']['tr_attrs']['style'] = $aBlock['visible_for_levels'] == BX_DOL_INT_MAX ? 'display:none' : '';
  348. BxDolStudioUtils::getVisibilityValues($aBlock['visible_for_levels'], $oForm->aInputs['visible_for_levels']['values'], $oForm->aInputs['visible_for_levels']['value']);
  349. $aBlock['visible_for_levels'] = $oForm->aInputs['visible_for_levels']['value'];
  350. $oForm->aInputs = $this->addInArray($oForm->aInputs, 'visible_for_levels', $this->getBlockContent($aBlock));
  351. $oForm->aInputs['controls'][0]['value'] = _t('_bx_dev_bp_btn_block_save');
  352. $oForm->aInputs['controls'][2]['attrs']['onclick'] = $this->getPageJsObject() . ".deleteBlock(" . $aBlock['id'] . ")";
  353. if($aBlock['type'] == BX_DOL_STUDIO_BP_BLOCK_SERVICE)
  354. $aBlock['content'] = BxDevFunctions::unserializeString($aBlock['content']);
  355. if((int)$aBlock['designbox_id'] != 0)
  356. $aBlock['designbox_id'] = $this->sSelectKeyPrefix . $aBlock['designbox_id'];
  357. }
  358. protected function onSaveBlock(&$oForm, &$aBlock) {
  359. parent::onSaveBlock($oForm, $aBlock);
  360. if($aBlock['type'] == BX_DOL_STUDIO_BP_BLOCK_SERVICE && isset($oForm->aInputs['content'])) {
  361. $sValue = $oForm->getCleanValue('content');
  362. $sValue = BxDevFunctions::serializeString($sValue);
  363. BxDolForm::setSubmittedValue('content', $sValue, $oForm->aFormAttrs['method']);
  364. }
  365. }
  366. }
  367. /** @} */