BxDevBuilderPage.php 17 KB

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