1
0

BxDevBuilderPage.php 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541
  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 Developer Developer
  7. * @ingroup UnaModules
  8. *
  9. * @{
  10. */
  11. class BxDevBuilderPage extends BxTemplStudioBuilderPage
  12. {
  13. protected $sActionPageExport = 'page_export';
  14. protected $oModule;
  15. protected $aParams;
  16. function __construct($aParams)
  17. {
  18. parent::__construct(isset($aParams['type']) ? $aParams['type'] : '', isset($aParams['page']) ? $aParams['page'] : '');
  19. $this->bPageMenuTitle = false;
  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. $this->oModule = BxDolModule::getInstance('bx_developer');
  25. $this->oModule->_oTemplate->addStudioCss(array('builder_page.css'));
  26. }
  27. function getPageCode($sPage = '', $bWrap = true)
  28. {
  29. return $this->oModule->_oTemplate->getJsCode('main') . parent::getPageCode($sPage, $bWrap);
  30. }
  31. function getBlockPanelTop($aBlock)
  32. {
  33. return BxBaseStudioWidget::getBlockPanelTop(
  34. array('panel_top' => $this->oModule->_oTemplate->parseHtmlByName('bp_block_panel_top.html', $this->_getTmplVarsBlockPanelTop()))
  35. );
  36. }
  37. protected function actionPageCreate()
  38. {
  39. $sFormObject = $this->oModule->_oConfig->getObject('form_bp_page');
  40. $sFormDisplay = $this->oModule->_oConfig->getObject('form_display_bp_page_add');
  41. $oForm = BxDolForm::getObjectInstance($sFormObject, $sFormDisplay, $this->oModule->_oTemplate);
  42. $oForm->aFormAttrs['action'] = sprintf($this->sPageUrl, $this->sType, $this->sPage) . '&bp_action=' . $this->sActionPageCreate;
  43. $oForm->aInputs['module']['values'] = array_merge(array('' => _t('_bx_dev_bp_txt_select_module')), BxDolStudioUtils::getModules());
  44. $oForm->aInputs['layout_id']['values'] = array(
  45. array('key' => '', 'value' => _t('_bx_dev_bp_txt_page_layout_id_select'))
  46. );
  47. $aLayouts = array();
  48. $this->oDb->getLayouts(array('type' => 'all'), $aLayouts, false);
  49. foreach($aLayouts as $aLayout)
  50. $oForm->aInputs['layout_id']['values'][] = array('key' => $aLayout['id'], 'value' => _t($aLayout['title']));
  51. if(($sKey = 'config_api') && isset($oForm->aInputs[$sKey]))
  52. $oForm->aInputs[$sKey] = array_merge($oForm->aInputs[$sKey], [
  53. 'code' => 1
  54. ]);
  55. $oForm->initChecker();
  56. if($oForm->isSubmittedAndValid()) {
  57. $sObject = $oForm->getCleanValue('object');
  58. $sModule = $oForm->getCleanValue('module');
  59. if(($iId = (int)$oForm->insert()) != 0)
  60. return array('eval' => $this->getPageJsObject() . '.onCreatePage(\'' . $sModule . '\', \'' . $sObject . '\')');
  61. else
  62. return array('msg' => _t('_bx_dev_bp_err_page_create'));
  63. }
  64. $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(
  65. 'form_id' => $oForm->aFormAttrs['id'],
  66. 'form' => $oForm->getCode(true)
  67. )));
  68. return array('popup' => $sContent);
  69. }
  70. protected function actionPageExport()
  71. {
  72. $sContentInsert = $sContentDelete = "";
  73. $aPage = $this->oDb->getPages(array('type' => 'by_object', 'value' => $this->sPage));
  74. if(empty($aPage) || !is_array($aPage))
  75. return array();
  76. $sContentInsert .= ($this->oModule->_oDb->getQueryInsert('sys_objects_page', array($aPage), "Dumping data for '" . $aPage['object'] . "' page"));
  77. $sContentDelete .= ($this->oModule->_oDb->getQueryDelete('sys_objects_page', 'object', array($aPage), "Deleting data for '" . $aPage['object'] . "' page"));
  78. $aBlocks = array();
  79. $this->oDb->getBlocks(array('type' => 'by_object', 'value' => $aPage['object']), $aBlocks, false);
  80. $sContentInsert .= $this->oModule->_oDb->getQueryInsert('sys_pages_blocks', $aBlocks, false, array('id', 'name'));
  81. $sContentDelete .= $this->oModule->_oDb->getQueryDelete('sys_pages_blocks', 'object', array($aPage), false);
  82. $aForm = array(
  83. 'form_attrs' => array(),
  84. 'inputs' => array (
  85. 'insert' => array(
  86. 'type' => 'textarea',
  87. 'name' => 'insert',
  88. 'caption' => _t('_bx_dev_bp_txt_page_export_insert'),
  89. 'value' => $sContentInsert,
  90. ),
  91. 'delete' => array(
  92. 'type' => 'textarea',
  93. 'name' => 'delete',
  94. 'caption' => _t('_bx_dev_bp_txt_page_export_delete'),
  95. 'value' => $sContentDelete,
  96. ),
  97. 'done' => array (
  98. 'type' => 'button',
  99. 'name' => 'done',
  100. 'value' => _t('_bx_dev_bp_btn_page_done'),
  101. 'attrs' => array(
  102. 'onclick' => "$('.bx-popup-applied:visible').dolPopupHide()",
  103. ),
  104. )
  105. )
  106. );
  107. $oForm = new BxTemplStudioFormView($aForm);
  108. $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(
  109. 'content' => $oForm->getCode()
  110. )));
  111. return array('popup' => $sContent);
  112. }
  113. protected function actionBlockEdit()
  114. {
  115. $sFormObject = $this->oModule->_oConfig->getObject('form_bp_block');
  116. $sFormDisplay = $this->oModule->_oConfig->getObject('form_display_bp_block_edit');
  117. $iId = (int)bx_get('id');
  118. if(!$iId)
  119. return array();
  120. $aBlock = array();
  121. $this->oDb->getBlocks(array('type' => 'by_id', 'value' => $iId), $aBlock, false);
  122. if(empty($aBlock) || !is_array($aBlock))
  123. return array('msg' => _t('_bx_dev_bp_err_block_not_found'));
  124. $oForm = BxDolForm::getObjectInstance($sFormObject, $sFormDisplay, $this->oModule->_oTemplate);
  125. $this->onLoadBlock($oForm, $aBlock);
  126. $oForm->initChecker($aBlock);
  127. if($oForm->isSubmittedAndValid()) {
  128. $this->onSaveBlock($oForm, $aBlock);
  129. if($oForm->update($iId) !== false)
  130. return array('eval' => $this->getPageJsObject() . '.onEditBlock(oData)');
  131. else
  132. return array('msg' => _t('_bx_dev_bp_err_block_edit'));
  133. }
  134. $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(
  135. 'form_id' => $oForm->aFormAttrs['id'],
  136. 'form' => $oForm->getCode(true)
  137. )));
  138. return array('popup' => $sContent);
  139. }
  140. protected function actionBlockDelete()
  141. {
  142. $sJsObject = $this->getPageJsObject();
  143. $iId = (int)bx_get('id');
  144. $aBlock = array();
  145. $this->oDb->getBlocks(array('type' => 'by_id', 'value' => $iId), $aBlock, false);
  146. if(empty($aBlock) || !is_array($aBlock))
  147. return array('msg' => _t('_bx_dev_bp_err_block_not_found'));
  148. if(!$this->oDb->deleteBlocks(array('type' => 'by_id', 'value' => $iId)))
  149. return array('msg' => _t('_bx_dev_bp_err_block_delete'));
  150. $this->onBlockDelete($aBlock);
  151. return array('eval' => $sJsObject . '.onDeleteBlock(' . $iId . ', oData)');
  152. }
  153. protected function getSettingsOptions($aPage = array(), $bCreate = true, $bInputsOnly = false)
  154. {
  155. $aForm = array(
  156. 'form_attrs' => array(
  157. 'id' => 'adm-bp-settings-seo',
  158. ),
  159. 'params' => array (
  160. 'remove_form' => '1',
  161. 'csrf' => array(
  162. 'disable' => true
  163. )
  164. ),
  165. 'inputs' => array(
  166. 'object' => array(
  167. 'type' => 'text',
  168. 'name' => 'object',
  169. 'caption' => _t('_bx_dev_bp_txt_page_object'),
  170. 'info' => '',
  171. 'value' => $this->aPageRebuild['object'],
  172. 'required' => '',
  173. 'attrs' => array(
  174. 'disabled' => 'disabled'
  175. ),
  176. )
  177. )
  178. );
  179. $aForm['inputs'] += parent::getSettingsOptions($aPage, $bCreate, true);
  180. $aForm['inputs']['title_system']['type'] = 'text';
  181. $aForm['inputs']['title_system']['caption'] = _t('_bx_dev_bp_txt_page_title_system');
  182. $aForm['inputs']['title']['type'] = 'text';
  183. $aUri = array(
  184. 'uri' => array(
  185. 'type' => 'text',
  186. 'name' => 'uri',
  187. 'caption' => _t('_bx_dev_bp_txt_page_uri'),
  188. 'info' => '',
  189. 'value' => $this->aPageRebuild['uri'],
  190. 'required' => '',
  191. 'db' => array (
  192. 'pass' => 'Xss',
  193. ),
  194. )
  195. );
  196. $aForm['inputs'] = bx_array_insert_before($aUri, $aForm['inputs'], 'url');
  197. $aForm['inputs']['url']['caption'] = _t('_bx_dev_bp_txt_page_url');
  198. $aForm['inputs']['url']['value'] = isset($aPage['url']) ? $aPage['url'] : '';
  199. $aForm['inputs']['url']['db'] = array (
  200. 'pass' => 'Xss',
  201. );
  202. unset($aForm['inputs']['url']['attrs']['disabled']);
  203. $aConfigApi = array(
  204. 'config_api' => array(
  205. 'type' => 'textarea',
  206. 'name' => 'config_api',
  207. 'caption' => _t('_bx_dev_bp_txt_page_config_api'),
  208. 'info' => '',
  209. 'value' => $this->aPageRebuild['config_api'],
  210. 'required' => '',
  211. 'code' => '1',
  212. 'db' => array (
  213. 'pass' => 'XssHtml',
  214. ),
  215. )
  216. );
  217. $aForm['inputs'] = bx_array_insert_before($aConfigApi, $aForm['inputs'], 'sticky_columns');
  218. $aForm['inputs']['deletable'] = array(
  219. 'type' => 'switcher',
  220. 'name' => 'deletable',
  221. 'caption' => _t('_bx_dev_bp_txt_page_deletable'),
  222. 'info' => '',
  223. 'value' => '1',
  224. 'checked' => (int)$this->aPageRebuild['deletable'] == 1,
  225. 'required' => '',
  226. 'db' => array (
  227. 'pass' => 'Int',
  228. )
  229. );
  230. $aForm['inputs']['override_class_name'] = array(
  231. 'type' => 'text',
  232. 'name' => 'override_class_name',
  233. 'caption' => _t('_bx_dev_bp_txt_page_override_class_name'),
  234. 'info' => '',
  235. 'value' => $this->aPageRebuild['override_class_name'],
  236. 'required' => '0',
  237. 'db' => array (
  238. 'pass' => 'Xss',
  239. )
  240. );
  241. $aForm['inputs']['override_class_file'] = array(
  242. 'type' => 'text',
  243. 'name' => 'override_class_file',
  244. 'caption' => _t('_bx_dev_bp_txt_page_override_class_file'),
  245. 'info' => '',
  246. 'value' => $this->aPageRebuild['override_class_file'],
  247. 'required' => '0',
  248. 'db' => array (
  249. 'pass' => 'Xss',
  250. )
  251. );
  252. if($bInputsOnly)
  253. return $aForm['inputs'];
  254. $oForm = new BxTemplStudioFormView($aForm);
  255. return $oForm->getCode();
  256. }
  257. protected function getSettingsCache($aPage = array(), $bCreate = true, $bInputsOnly = false)
  258. {
  259. $aForm = array(
  260. 'form_attrs' => array(
  261. 'id' => 'adm-bp-settings-cache',
  262. ),
  263. 'params' => array (
  264. 'remove_form' => '1',
  265. 'csrf' => array(
  266. 'disable' => true
  267. )
  268. ),
  269. 'inputs' => parent::getSettingsCache($aPage, $bCreate, true)
  270. );
  271. unset($aForm['inputs']['cache_lifetime']['attrs']);
  272. $aForm['inputs']['cache_editable'] = array(
  273. 'type' => 'switcher',
  274. 'name' => 'cache_editable',
  275. 'caption' => _t('_bx_dev_bp_txt_page_cache_editable'),
  276. 'info' => '',
  277. 'value' => '1',
  278. 'checked' => (int)$this->aPageRebuild['cache_editable'] == 1,
  279. 'required' => '',
  280. 'db' => array (
  281. 'pass' => 'Int',
  282. )
  283. );
  284. if($bInputsOnly)
  285. return $aForm['inputs'];
  286. $oForm = new BxTemplStudioFormView($aForm);
  287. return $oForm->getCode();
  288. }
  289. protected function getBlockModule($aBlock)
  290. {
  291. return $aBlock['module'] != BX_DOL_STUDIO_BP_SKELETONS ? $aBlock['module'] : $this->aPageRebuild['module'];
  292. }
  293. protected function getBlockContent($aBlock)
  294. {
  295. $aFields = array();
  296. switch($aBlock['type']) {
  297. case BX_DOL_STUDIO_BP_BLOCK_SERVICE:
  298. $aFields = array(
  299. 'content' => array(
  300. 'type' => 'textarea',
  301. 'name' => 'content',
  302. 'caption' => _t('_bx_dev_bp_txt_block_content_service'),
  303. 'info' => '',
  304. 'value' => $aBlock['content'],
  305. 'required' => '0',
  306. 'db' => array (
  307. 'pass' => 'Xss',
  308. ),
  309. )
  310. );
  311. break;
  312. case BX_DOL_STUDIO_BP_BLOCK_LANG:
  313. $aFields = array(
  314. 'content' => array(
  315. 'type' => 'text',
  316. 'name' => 'content',
  317. 'caption' => _t('_bx_dev_bp_txt_block_content_lang'),
  318. 'info' => _t('_bx_dev_bp_dsc_block_content_lang'),
  319. 'value' => $aBlock['content'],
  320. 'required' => '0',
  321. 'db' => array (
  322. 'pass' => 'Xss',
  323. ),
  324. ),
  325. );
  326. break;
  327. default:
  328. $aFields = parent::getBlockContent($aBlock);
  329. break;
  330. }
  331. return $aFields;
  332. }
  333. protected function getBlocks($sModule)
  334. {
  335. $aBlocks = parent::getBlocks($sModule);
  336. if($sModule == BX_DOL_STUDIO_BP_SKELETONS) {
  337. $aBlock = array();
  338. $this->oDb->getBlocks(array('type' => 'skeleton_by_type', 'value' => 'service'), $aBlock, false);
  339. if(!empty($aBlock) && is_array($aBlock))
  340. $aBlocks[] = $aBlock;
  341. }
  342. return $aBlocks;
  343. }
  344. protected function onLoadBlock(&$oForm, &$aBlock)
  345. {
  346. $oForm->aFormAttrs['action'] = sprintf($this->sPageUrl, $this->sType, $this->sPage) . '&bp_action=' . $this->sActionBlockEdit;
  347. $oForm->aInputs['module']['values'] = array_merge(array('' => _t('_bx_dev_bp_txt_select_module')), BxDolStudioUtils::getModules());
  348. if(($sKey = 'icon') && isset($oForm->aInputs[$sKey]))
  349. $oForm->aInputs[$sKey] = array_merge($oForm->aInputs[$sKey], [
  350. 'code' => 1
  351. ]);
  352. $aDBoxes = array();
  353. $this->oDb->getDesignBoxes(array('type' => 'ordered'), $aDBoxes, false);
  354. foreach($aDBoxes as $aDBox)
  355. $oForm->aInputs['designbox_id']['values'][] = array('key' => $this->sSelectKeyPrefix . $aDBox['id'], 'value' => _t($aDBox['title']));
  356. $oForm->aInputs['class']['value'] = $aBlock['class'];
  357. $aContentPlaceholders = $this->oDb->getContentPlaceholders();
  358. $oForm->aInputs['async']['values'] = array(
  359. array('key' => 0, 'value' => _t('_sys_no_async'))
  360. );
  361. foreach ($aContentPlaceholders as $iKey => $sTitle)
  362. $oForm->aInputs['async']['values'][] = array('key' => $iKey, 'value' => _t($sTitle));
  363. $oForm->aInputs['hidden_on']['values'] = array(
  364. BX_DB_HIDDEN_PHONE => _t('_bx_dev_bp_txt_block_hidden_on_phone'),
  365. BX_DB_HIDDEN_TABLET => _t('_bx_dev_bp_txt_block_hidden_on_tablet'),
  366. BX_DB_HIDDEN_DESKTOP => _t('_bx_dev_bp_txt_block_hidden_on_desktop'),
  367. BX_DB_HIDDEN_MOBILE => _t('_bx_dev_bp_txt_block_hidden_on_mobile')
  368. );
  369. $aSubmenus = $this->oDb->getBlockSubmenus();
  370. $oForm->aInputs['submenu']['values'] = array(
  371. array('key' => '', 'value' => _t('_sys_no_menu'))
  372. );
  373. foreach ($aSubmenus as $sObject => $sTitle)
  374. $oForm->aInputs['submenu']['values'][] = array('key' => $sObject, 'value' => _t($sTitle));
  375. $oForm->aInputs['visible_for']['value'] = $aBlock['visible_for_levels'] == BX_DOL_INT_MAX ? BX_DOL_STUDIO_VISIBLE_ALL : BX_DOL_STUDIO_VISIBLE_SELECTED;
  376. $oForm->aInputs['visible_for']['values'] = array(
  377. array('key' => BX_DOL_STUDIO_VISIBLE_ALL, 'value' => _t('_bx_dev_bp_txt_block_visible_for_all')),
  378. array('key' => BX_DOL_STUDIO_VISIBLE_SELECTED, 'value' => _t('_bx_dev_bp_txt_block_visible_for_selected')),
  379. );
  380. $oForm->aInputs['visible_for']['attrs']['onchange'] = $this->getPageJsObject() . '.onChangeVisibleFor(this)';
  381. $oForm->aInputs['visible_for_levels']['tr_attrs']['style'] = $aBlock['visible_for_levels'] == BX_DOL_INT_MAX ? 'display:none' : '';
  382. BxDolStudioUtils::getVisibilityValues($aBlock['visible_for_levels'], $oForm->aInputs['visible_for_levels']['values'], $oForm->aInputs['visible_for_levels']['value']);
  383. $aBlock['visible_for_levels'] = $oForm->aInputs['visible_for_levels']['value'];
  384. $oForm->aInputs = $this->addInArray($oForm->aInputs, 'visible_for_levels', $this->getBlockContent($aBlock));
  385. if(($sKey = 'config_api') && isset($oForm->aInputs[$sKey]))
  386. $oForm->aInputs[$sKey] = array_merge($oForm->aInputs[$sKey], [
  387. 'code' => 1
  388. ]);
  389. $oForm->aInputs['controls'][0]['value'] = _t('_bx_dev_bp_btn_block_save');
  390. $oForm->aInputs['controls'][2]['attrs']['onclick'] = $this->getPageJsObject() . ".deleteBlock(" . $aBlock['id'] . ")";
  391. if($aBlock['type'] == BX_DOL_STUDIO_BP_BLOCK_SERVICE)
  392. $aBlock['content'] = BxDevFunctions::unserializeString($aBlock['content']);
  393. $aBlock['designbox_id'] = $this->sSelectKeyPrefix . $aBlock['designbox_id'];
  394. }
  395. protected function onSavePage(&$oForm, &$aPage)
  396. {
  397. if(($sConfigApi = $oForm->getCleanValue('config_api')) && !$this->oModule->isValidJson($sConfigApi))
  398. BxDolForm::setSubmittedValue('config_api', '', $oForm->aFormAttrs['method']);
  399. }
  400. protected function onSaveBlock(&$oForm, &$aBlock)
  401. {
  402. parent::onSaveBlock($oForm, $aBlock);
  403. if($aBlock['type'] == BX_DOL_STUDIO_BP_BLOCK_SERVICE && isset($oForm->aInputs['content']))
  404. $this->onSaveBlockService($oForm, $aBlock);
  405. if(($sConfigApi = $oForm->getCleanValue('config_api')) && !$this->oModule->isValidJson($sConfigApi))
  406. BxDolForm::setSubmittedValue('config_api', '', $oForm->aFormAttrs['method']);
  407. }
  408. protected function onSaveBlockLang(&$oForm, &$aBlock)
  409. {
  410. $sValue = $oForm->getCleanValue('content');
  411. BxDolForm::setSubmittedValue('content', $sValue, $oForm->aFormAttrs['method']);
  412. }
  413. protected function onSaveBlockService(&$oForm, &$aBlock)
  414. {
  415. $sValue = $oForm->getCleanValue('content');
  416. $sValue = BxDevFunctions::serializeString($sValue);
  417. BxDolForm::setSubmittedValue('content', $sValue, $oForm->aFormAttrs['method']);
  418. }
  419. protected function _getPageEditForm()
  420. {
  421. $oForm = parent::_getPageEditForm();
  422. $oForm->addCssJsCodeMirror();
  423. return $oForm;
  424. }
  425. protected function _getTmplVarsBlockPanelTop()
  426. {
  427. $aResult = parent::_getTmplVarsBlockPanelTop();
  428. $aResult['bx_if:show_actions_global'] = [
  429. 'condition' => $this->sPage == '' || empty($this->aPageRebuild),
  430. 'content' => [
  431. 'js_object' => $this->oModule->_oConfig->getJsObject('main'),
  432. 'action_page_import' => 'import',
  433. 'action_page_export' => 'export'
  434. ]
  435. ];
  436. return $aResult;
  437. }
  438. protected function _getTmplVarsBlockPanelTopActions()
  439. {
  440. $sJsObject = $this->getPageJsObject();
  441. $oPermalinks = BxDolPermalinks::getInstance();
  442. return array(
  443. 'js_object' => $sJsObject,
  444. 'url_view' => bx_absolute_url($oPermalinks->permalink($this->aPageRebuild['url'])),
  445. 'action_page_export' => $this->sActionPageExport,
  446. 'action_page_edit' => $this->sActionPageEdit,
  447. 'action_block_create' => $this->sActionBlockCreate,
  448. );
  449. }
  450. }
  451. /** @} */