BxBaseStudioNavigationItems.php 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916
  1. <?php
  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 DolphinView Dolphin Studio Representation classes
  7. * @ingroup DolphinStudio
  8. * @{
  9. */
  10. defined('BX_DOL') or die('hack attempt');
  11. bx_import('BxDolStudioNavigationItems');
  12. bx_import('BxTemplStudioFormView');
  13. class BxBaseStudioNavigationItems extends BxDolStudioNavigationItems {
  14. protected $sUrlPage;
  15. protected $sUrlViewItems;
  16. function __construct($aOptions, $oTemplate = false) {
  17. parent::__construct($aOptions, $oTemplate);
  18. $this->_aOptions['actions_single']['edit']['attr']['title'] = _t('_adm_nav_btn_items_edit');
  19. $this->_aOptions['actions_single']['delete']['attr']['title'] = _t('_adm_nav_btn_items_delete');
  20. $this->sUrlPage = BX_DOL_URL_STUDIO . 'builder_menu.php?page=items';
  21. $this->sUrlViewItems = $this->sUrlPage . '&module=%s&set=%s';
  22. }
  23. public function performActionImport() {
  24. bx_import('BxDolGrid');
  25. $oGrid = BxDolGrid::getObjectInstance('sys_studio_nav_import');
  26. if(!$oGrid)
  27. return '';
  28. bx_import('BxTemplFunctions');
  29. $sContent = BxTemplFunctions::getInstance()->popupBox('adm-nav-item-import-popup', _t('_adm_nav_txt_items_import_popup'), $this->_oTemplate->parseHtmlByName('nav_import_item.html', array(
  30. 'grid' => $oGrid->getCode()
  31. )));
  32. $this->_echoResultJson(array('popup' => array('html' => $sContent, 'options' => array('closeOnOuterClick' => false))), true);
  33. }
  34. public function performActionAdd() {
  35. $sAction = 'add';
  36. $aForm = array(
  37. 'form_attrs' => array(
  38. 'id' => 'adm-nav-item-create',
  39. 'action' => BX_DOL_URL_ROOT . 'grid.php?o=' . $this->_sObject . '&a=' . $sAction . '&set=' . $this->sSet,
  40. 'method' => BX_DOL_STUDIO_METHOD_DEFAULT,
  41. 'enctype' => 'multipart/form-data',
  42. ),
  43. 'params' => array (
  44. 'db' => array(
  45. 'table' => 'sys_menu_items',
  46. 'key' => 'id',
  47. 'uri' => '',
  48. 'uri_title' => '',
  49. 'submit_name' => 'do_submit'
  50. ),
  51. ),
  52. 'inputs' => array (
  53. 'set_name' => array(
  54. 'type' => 'hidden',
  55. 'name' => 'set_name',
  56. 'value' => $this->sSet,
  57. 'db' => array (
  58. 'pass' => 'Xss',
  59. ),
  60. ),
  61. 'onclick' => array(
  62. 'type' => 'hidden',
  63. 'name' => 'onclick',
  64. 'value' => '',
  65. 'db' => array (
  66. 'pass' => 'Xss',
  67. ),
  68. ),
  69. 'title_system' => array(
  70. 'type' => 'text_translatable',
  71. 'name' => 'title_system',
  72. 'caption' => _t('_adm_nav_txt_items_title_system'),
  73. 'info' => _t('_adm_nav_dsc_items_title_system'),
  74. 'value' => '_adm_nav_txt_item',
  75. 'required' => '1',
  76. 'db' => array (
  77. 'pass' => 'Xss',
  78. ),
  79. 'checker' => array (
  80. 'func' => 'LengthTranslatable',
  81. 'params' => array(3, 100, 'title_system'),
  82. 'error' => _t('_adm_nav_err_items_title_system'),
  83. ),
  84. ),
  85. 'title' => array(
  86. 'type' => 'text_translatable',
  87. 'name' => 'title',
  88. 'caption' => _t('_adm_nav_txt_items_title'),
  89. 'info' => _t('_adm_nav_dsc_items_title'),
  90. 'value' => '_adm_nav_txt_item',
  91. 'required' => '0',
  92. 'db' => array (
  93. 'pass' => 'Xss',
  94. ),
  95. ),
  96. 'submenu_object' => array(
  97. 'type' => 'select',
  98. 'name' => 'submenu_object',
  99. 'caption' => _t('_adm_nav_txt_items_submenu'),
  100. 'info' => _t('_adm_nav_dsc_items_submenu'),
  101. 'value' => '',
  102. 'values' => array(),
  103. 'required' => '0',
  104. 'attrs' => array(
  105. 'onChange' => 'javascript:' . $this->getJsObject() . '.onChangeSubmenu(this)'
  106. ),
  107. 'db' => array (
  108. 'pass' => 'Xss',
  109. ),
  110. ),
  111. 'link' => array(
  112. 'type' => 'text',
  113. 'name' => 'link',
  114. 'caption' => _t('_adm_nav_txt_items_link'),
  115. 'info' => _t('_adm_nav_dsc_items_link'),
  116. 'value' => '',
  117. 'required' => '0',
  118. 'db' => array (
  119. 'pass' => 'Xss',
  120. ),
  121. 'checker' => array (
  122. 'func' => '',
  123. 'params' => array(),
  124. 'error' => _t('_adm_nav_err_items_link'),
  125. ),
  126. ),
  127. 'target' => array(
  128. 'type' => 'select',
  129. 'name' => 'target',
  130. 'caption' => _t('_adm_nav_txt_items_target'),
  131. 'info' => _t('_adm_nav_dsc_items_target'),
  132. 'value' => '_self',
  133. 'values' => array(
  134. array('key' => '', 'value' => _t('_adm_nav_txt_items_target_self')),
  135. array('key' => '_blank', 'value' => _t('_adm_nav_txt_items_target_blank'))
  136. ),
  137. 'required' => '0',
  138. 'db' => array (
  139. 'pass' => 'Xss',
  140. )
  141. ),
  142. 'icon' => array(
  143. 'type' => 'file',
  144. 'name' => 'icon',
  145. 'caption' => _t('_adm_nav_txt_items_icon'),
  146. 'info' => _t('_adm_nav_dsc_items_icon'),
  147. 'value' => '',
  148. 'checker' => array (
  149. 'func' => '',
  150. 'params' => '',
  151. 'error' => _t('_adm_nav_err_items_icon'),
  152. ),
  153. ),
  154. 'controls' => array(
  155. 'name' => 'controls',
  156. 'type' => 'input_set',
  157. array(
  158. 'type' => 'submit',
  159. 'name' => 'do_submit',
  160. 'value' => _t('_adm_nav_btn_items_add'),
  161. ),
  162. array (
  163. 'type' => 'reset',
  164. 'name' => 'close',
  165. 'value' => _t('_adm_nav_btn_items_cancel'),
  166. 'attrs' => array(
  167. 'onclick' => "$('.bx-popup-applied:visible').dolPopupHide()",
  168. 'class' => 'bx-def-margin-sec-left',
  169. ),
  170. )
  171. )
  172. )
  173. );
  174. $aMenus = array();
  175. $this->oDb->getMenus(array('type' => 'all'), $aMenus, false);
  176. foreach($aMenus as $aMenu)
  177. $aForm['inputs']['submenu_object']['values'][$aMenu['object']] = _t($aMenu['title']);
  178. asort($aForm['inputs']['submenu_object']['values']);
  179. $aForm['inputs']['submenu_object']['values'] = array_merge(array('' => _t('_adm_nav_txt_items_submenu_empty')), $aForm['inputs']['submenu_object']['values']);
  180. $oForm = new BxTemplStudioFormView($aForm);
  181. $oForm->initChecker();
  182. if($oForm->isSubmittedAndValid()) {
  183. $mixedIcon = '';
  184. if(!empty($_FILES['icon']['tmp_name'])) {
  185. bx_import('BxDolStorage');
  186. $oStorage = BxDolStorage::getObjectInstance(BX_DOL_STORAGE_OBJ_IMAGES);
  187. $mixedIcon = $oStorage->storeFileFromForm($_FILES['icon'], false, 0);
  188. if($mixedIcon === false) {
  189. $this->_echoResultJson(array('msg' => _t('_adm_nav_err_items_icon') . $oStorage->getErrorString()), true);
  190. return;
  191. }
  192. $oStorage->afterUploadCleanup($mixedIcon, 0);
  193. }
  194. bx_import('BxDolPermalinks');
  195. $oPermalinks = BxDolPermalinks::getInstance();
  196. $sLink = $oForm->getCleanValue('link');
  197. $sLink = $oPermalinks->unpermalink($sLink);
  198. BxDolForm::setSubmittedValue('link', $sLink, $aForm['form_attrs']['method']);
  199. $sName = $oPermalinks->getPageNameFromLink($sLink);
  200. if($sName == '') {
  201. bx_import('BxDolStudioLanguagesUtils');
  202. $sLanguage = BxDolStudioLanguagesUtils::getInstance()->getCurrentLangName(false);
  203. $sName = BxDolForm::getSubmittedValue('title-' . $sLanguage, $aForm['form_attrs']['method']);
  204. $sName = uriGenerate($sName, 'sys_menu_items', 'name', 'item');
  205. }
  206. $sSubmenu = $oForm->getCleanValue('submenu_object');
  207. if(!empty($sSubmenu)) {
  208. BxDolForm::setSubmittedValue('link', 'javascript:void(0)', $aForm['form_attrs']['method']);
  209. BxDolForm::setSubmittedValue('target', '', $aForm['form_attrs']['method']);
  210. BxDolForm::setSubmittedValue('onclick', 'bx_menu_popup(\'' . $sSubmenu . '\', this);', $aForm['form_attrs']['method']);
  211. }
  212. $iId = (int)$oForm->insert(array('module' => BX_DOL_STUDIO_MODULE_CUSTOM, 'name' => $sName, 'icon' => $mixedIcon, 'active' => 1, 'order' => $this->oDb->getItemOrderMax($this->sSet) + 1));
  213. if($iId != 0)
  214. $aRes = array('grid' => $this->getCode(false), 'blink' => $iId);
  215. else
  216. $aRes = array('msg' => _t('_adm_nav_err_items_create'));
  217. $this->_echoResultJson($aRes, true);
  218. }
  219. else {
  220. bx_import('BxTemplStudioFunctions');
  221. $sContent = BxTemplStudioFunctions::getInstance()->popupBox('adm-nav-item-create-popup', _t('_adm_nav_txt_items_create_popup'), $this->_oTemplate->parseHtmlByName('nav_add_item.html', array(
  222. 'form_id' => $aForm['form_attrs']['id'],
  223. 'form' => $oForm->getCode(true),
  224. 'object' => $this->_sObject,
  225. 'action' => $sAction
  226. )));
  227. $this->_echoResultJson(array('popup' => array('html' => $sContent, 'options' => array('closeOnOuterClick' => false))), true);
  228. }
  229. }
  230. public function performActionEdit($bUpdateGrid = false) {
  231. $sAction = 'edit';
  232. $aIds = bx_get('ids');
  233. if(!$aIds || !is_array($aIds)) {
  234. $iId = (int)bx_get('id');
  235. if(!$iId) {
  236. $this->_echoResultJson(array());
  237. exit;
  238. }
  239. $aIds = array($iId);
  240. }
  241. $iId = $aIds[0];
  242. $aItem = array();
  243. $iItem = $this->oDb->getItems(array('type' => 'by_id', 'value' => $iId), $aItem);
  244. if($iItem != 1 || empty($aItem)){
  245. $this->_echoResultJson(array());
  246. exit;
  247. }
  248. $sSubmenu = "";
  249. $aForm = array(
  250. 'form_attrs' => array(
  251. 'id' => 'adm-nav-item-create',
  252. 'action' => BX_DOL_URL_ROOT . 'grid.php?o=' . $this->_sObject . '&a=' . $sAction . '&set=' . $this->sSet,
  253. 'method' => BX_DOL_STUDIO_METHOD_DEFAULT,
  254. 'enctype' => 'multipart/form-data',
  255. ),
  256. 'params' => array (
  257. 'db' => array(
  258. 'table' => 'sys_menu_items',
  259. 'key' => 'id',
  260. 'uri' => '',
  261. 'uri_title' => '',
  262. 'submit_name' => 'do_submit'
  263. ),
  264. ),
  265. 'inputs' => array (
  266. 'id' => array(
  267. 'type' => 'hidden',
  268. 'name' => 'id',
  269. 'value' => $iId,
  270. 'db' => array (
  271. 'pass' => 'Int',
  272. ),
  273. ),
  274. 'onclick' => array(
  275. 'type' => 'hidden',
  276. 'name' => 'onclick',
  277. 'value' => $aItem['onclick'],
  278. 'db' => array (
  279. 'pass' => 'Xss',
  280. ),
  281. ),
  282. 'title_system' => array(
  283. 'type' => 'text_translatable',
  284. 'name' => 'title_system',
  285. 'caption' => _t('_adm_nav_txt_items_title_system'),
  286. 'info' => _t('_adm_nav_dsc_items_title_system'),
  287. 'value' => $aItem['title_system'],
  288. 'required' => '1',
  289. 'db' => array (
  290. 'pass' => 'Xss',
  291. ),
  292. 'checker' => array (
  293. 'func' => 'LengthTranslatable',
  294. 'params' => array(3, 100, 'title_system'),
  295. 'error' => _t('_adm_nav_err_items_title_system'),
  296. ),
  297. ),
  298. 'title' => array(
  299. 'type' => 'text_translatable',
  300. 'name' => 'title',
  301. 'caption' => _t('_adm_nav_txt_items_title'),
  302. 'info' => _t('_adm_nav_dsc_items_title'),
  303. 'value' => $aItem['title'],
  304. 'required' => '0',
  305. 'db' => array (
  306. 'pass' => 'Xss',
  307. )
  308. ),
  309. 'submenu_object' => array(
  310. 'type' => 'select',
  311. 'name' => 'submenu_object',
  312. 'caption' => _t('_adm_nav_txt_items_submenu'),
  313. 'info' => _t('_adm_nav_dsc_items_submenu'),
  314. 'value' => $aItem['submenu_object'],
  315. 'values' => array(),
  316. 'required' => '0',
  317. 'attrs' => array(
  318. 'onChange' => 'javascript:' . $this->getJsObject() . '.onChangeSubmenu(this)'
  319. ),
  320. 'db' => array (
  321. 'pass' => 'Xss',
  322. ),
  323. ),
  324. 'link' => array(
  325. 'type' => 'text',
  326. 'name' => 'link',
  327. 'caption' => _t('_adm_nav_txt_items_link'),
  328. 'info' => _t('_adm_nav_dsc_items_link'),
  329. 'value' => $aItem['link'],
  330. 'required' => '0',
  331. 'db' => array (
  332. 'pass' => 'Xss',
  333. ),
  334. 'checker' => array (
  335. 'func' => '',
  336. 'params' => array(),
  337. 'error' => _t('_adm_nav_err_items_link'),
  338. ),
  339. ),
  340. 'target' => array(
  341. 'type' => 'select',
  342. 'name' => 'target',
  343. 'caption' => _t('_adm_nav_txt_items_target'),
  344. 'info' => _t('_adm_nav_dsc_items_target'),
  345. 'value' => $aItem['target'],
  346. 'values' => array(
  347. array('key' => '', 'value' => _t('_adm_nav_txt_items_target_self')),
  348. array('key' => '_blank', 'value' => _t('_adm_nav_txt_items_target_blank'))
  349. ),
  350. 'required' => '0',
  351. 'db' => array (
  352. 'pass' => 'Xss',
  353. )
  354. ),
  355. 'icon_preview' => array(
  356. 'type' => 'custom',
  357. 'name' => 'icon_preview',
  358. 'caption' => _t('_adm_nav_txt_items_icon_old'),
  359. 'content' => ''
  360. ),
  361. 'icon' => array(
  362. 'type' => 'file',
  363. 'name' => 'icon',
  364. 'caption' => _t('_adm_nav_txt_items_icon_new'),
  365. 'info' => _t('_adm_nav_dsc_items_icon'),
  366. 'value' => '',
  367. 'checker' => array (
  368. 'func' => '',
  369. 'params' => '',
  370. 'error' => _t('_adm_nav_err_items_icon'),
  371. ),
  372. ),
  373. 'controls' => array(
  374. 'name' => 'controls',
  375. 'type' => 'input_set',
  376. array(
  377. 'type' => 'submit',
  378. 'name' => 'do_submit',
  379. 'value' => _t('_adm_nav_btn_items_save'),
  380. ),
  381. array (
  382. 'type' => 'reset',
  383. 'name' => 'close',
  384. 'value' => _t('_adm_nav_btn_items_cancel'),
  385. 'attrs' => array(
  386. 'onclick' => "$('.bx-popup-applied:visible').dolPopupHide()",
  387. 'class' => 'bx-def-margin-sec-left',
  388. ),
  389. )
  390. )
  391. )
  392. );
  393. $aMenus = array();
  394. $this->oDb->getMenus(array('type' => 'all'), $aMenus, false);
  395. foreach($aMenus as $aMenu)
  396. $aForm['inputs']['submenu_object']['values'][$aMenu['object']] = _t($aMenu['title']);
  397. asort($aForm['inputs']['submenu_object']['values']);
  398. $aForm['inputs']['submenu_object']['values'] = array_merge(array('' => _t('_adm_nav_txt_items_submenu_empty')), $aForm['inputs']['submenu_object']['values']);
  399. if(($bSubmenu = !empty($aItem['submenu_object'])) === true) {
  400. $aForm['inputs']['link']['tr_attrs']['style'] = 'display:none;';
  401. $aForm['inputs']['target']['tr_attrs']['style'] = 'display:none;';
  402. }
  403. if(!$bSubmenu && ($aItem['onclick'] != "" || !in_array($aItem['target'], array('', '_blank')))) {
  404. $aForm['inputs']['submenu_object']['tr_attrs']['style'] = 'display:none;';
  405. $aForm['inputs']['link']['tr_attrs']['style'] = 'display:none;';
  406. $aForm['inputs']['target']['tr_attrs']['style'] = 'display:none;';
  407. }
  408. $sFileUrl = "";
  409. if(!empty($aItem['icon'])) {
  410. if((int)$aItem['icon'] != 0) {
  411. bx_import('BxDolStorage');
  412. $oStorage = BxDolStorage::getObjectInstance(BX_DOL_STORAGE_OBJ_IMAGES);
  413. $sFileUrl = $oStorage->getFileUrlById((int)$aItem['icon']);
  414. }
  415. else
  416. $sFileUrl = $this->_oTemplate->getIconUrl($aItem['icon']);
  417. }
  418. $aTmplVars = array(
  419. 'bx_if:show_empty' => array(
  420. 'condition' => true,
  421. 'content' => array()
  422. ),
  423. 'bx_if:show_image' => array(
  424. 'condition' => false,
  425. 'content' => array()
  426. )
  427. );
  428. if(!empty($sFileUrl))
  429. $aTmplVars = array(
  430. 'bx_if:show_empty' => array(
  431. 'condition' => false,
  432. 'content' => array()
  433. ),
  434. 'bx_if:show_image' => array(
  435. 'condition' => true,
  436. 'content' => array(
  437. 'js_object' => $this->getJsObject(),
  438. 'url' => $sFileUrl,
  439. 'id' => $aItem['id']
  440. )
  441. )
  442. );
  443. $aForm['inputs']['icon_preview']['content'] = $this->_oTemplate->parseHtmlByName('nav_item_icon_preview.html', $aTmplVars);
  444. $oForm = new BxTemplStudioFormView($aForm);
  445. $oForm->initChecker();
  446. if($oForm->isSubmittedAndValid()) {
  447. $mixedIcon = 0;
  448. if(!empty($_FILES['icon']['tmp_name'])) {
  449. bx_import('BxDolStorage');
  450. $oStorage = BxDolStorage::getObjectInstance(BX_DOL_STORAGE_OBJ_IMAGES);
  451. if(is_numeric($aItem['icon']) && (int)$aItem['icon'] != 0 && !$oStorage->deleteFile((int)$aItem['icon'], 0)) {
  452. $this->_echoResultJson(array('msg' => _t('_adm_nav_err_items_icon_remove')), true);
  453. return;
  454. }
  455. if(($mixedIcon = $oStorage->storeFileFromForm($_FILES['icon'], false, 0)) === false) {
  456. $this->_echoResultJson(array('msg' => _t('_adm_nav_err_items_icon') . $oStorage->getErrorString()), true);
  457. return;
  458. }
  459. $oStorage->afterUploadCleanup($mixedIcon, 0);
  460. }
  461. bx_import('BxDolPermalinks');
  462. $sLink = $oForm->getCleanValue('link');
  463. $sLink = BxDolPermalinks::getInstance()->unpermalink($sLink);
  464. BxDolForm::setSubmittedValue('link', $sLink, $aForm['form_attrs']['method']);
  465. $sSubmenu = $oForm->getCleanValue('submenu_object');
  466. if(!empty($sSubmenu)) {
  467. BxDolForm::setSubmittedValue('link', 'javascript:void(0)', $aForm['form_attrs']['method']);
  468. BxDolForm::setSubmittedValue('target', '', $aForm['form_attrs']['method']);
  469. BxDolForm::setSubmittedValue('onclick', 'bx_menu_popup(\'' . $sSubmenu . '\', this);', $aForm['form_attrs']['method']);
  470. }
  471. else {
  472. $sOnClick = $oForm->getCleanValue('onclick');
  473. if(mb_substr($sOnClick, 0, 13) == 'bx_menu_popup')
  474. BxDolForm::setSubmittedValue('onclick', '', $aForm['form_attrs']['method']);
  475. }
  476. $sTarget = $oForm->getCleanValue('target');
  477. if($sTarget === false && !in_array($aItem['target'], array('', '_blank')))
  478. unset($oForm->aInputs['target']);
  479. if($oForm->update($iId, (int)$mixedIcon != 0 ? array('icon' => $mixedIcon) : array()) !== false)
  480. $aRes = array('grid' => $this->getCode(false), 'blink' => $iId);
  481. else
  482. $aRes = array('msg' => _t('_adm_nav_err_items_edit'));
  483. $this->_echoResultJson($aRes, true);
  484. }
  485. else {
  486. $sTitle = _t($aItem['title']);
  487. bx_import('BxTemplStudioFunctions');
  488. $sContent = BxTemplStudioFunctions::getInstance()->popupBox('adm-nav-item-edit-popup', _t('_adm_nav_txt_items_edit_popup', ($sTitle != "" ? '"' . $sTitle . '"' : '')), $this->_oTemplate->parseHtmlByName('nav_add_item.html', array(
  489. 'form_id' => $aForm['form_attrs']['id'],
  490. 'form' => $oForm->getCode(true),
  491. 'object' => $this->_sObject,
  492. 'action' => $sAction
  493. )));
  494. $aRes = array('popup' => array('html' => $sContent, 'options' => array('closeOnOuterClick' => false)));
  495. if($bUpdateGrid)
  496. $aRes = array_merge($aRes, array('grid' => $this->getCode(false), 'blink' => $iId));
  497. $this->_echoResultJson($aRes, true);
  498. }
  499. }
  500. public function performActionDelete() {
  501. $iAffected = 0;
  502. $aIds = bx_get('ids');
  503. if(!$aIds || !is_array($aIds)) {
  504. $this->_echoResultJson(array());
  505. exit;
  506. }
  507. $aIdsAffected = array ();
  508. foreach($aIds as $iId) {
  509. if(!$this->deleteById($iId))
  510. continue;
  511. $aIdsAffected[] = $iId;
  512. $iAffected++;
  513. }
  514. $this->_echoResultJson($iAffected ? array('grid' => $this->getCode(false), 'blink' => $aIdsAffected) : array('msg' => _t('_adm_nav_err_items_delete')));
  515. }
  516. public function performActionShowTo() {
  517. $sAction = 'show_to';
  518. $aIds = bx_get('ids');
  519. if(!$aIds || !is_array($aIds)) {
  520. $iId = (int)bx_get('id');
  521. if(!$iId) {
  522. $this->_echoResultJson(array());
  523. exit;
  524. }
  525. $aIds = array($iId);
  526. }
  527. $iId = $aIds[0];
  528. $aItem = array();
  529. $iItem = $this->oDb->getItems(array('type' => 'by_id', 'value' => $iId), $aItem);
  530. if($iItem != 1 || empty($aItem)){
  531. $this->_echoResultJson(array());
  532. exit;
  533. }
  534. $aForm = array(
  535. 'form_attrs' => array(
  536. 'id' => 'adm-nav-item-create',
  537. 'action' => BX_DOL_URL_ROOT . 'grid.php?o=' . $this->_sObject . '&a=' . $sAction . '&set=' . $this->sSet,
  538. 'method' => 'post'
  539. ),
  540. 'params' => array (
  541. 'db' => array(
  542. 'table' => 'sys_menu_items',
  543. 'key' => 'id',
  544. 'uri' => '',
  545. 'uri_title' => '',
  546. 'submit_name' => 'do_submit'
  547. ),
  548. ),
  549. 'inputs' => array (
  550. 'id' => array(
  551. 'type' => 'hidden',
  552. 'name' => 'id',
  553. 'value' => $iId,
  554. 'db' => array (
  555. 'pass' => 'Int',
  556. ),
  557. ),
  558. 'visible_for' => array(
  559. 'type' => 'select',
  560. 'name' => 'visible_for',
  561. 'caption' => _t('_adm_nav_txt_items_visible_for'),
  562. 'info' => '',
  563. 'value' => $aItem['visible_for_levels'] == BX_DOL_INT_MAX ? BX_DOL_STUDIO_VISIBLE_ALL : BX_DOL_STUDIO_VISIBLE_SELECTED,
  564. 'values' => array(
  565. array('key' => BX_DOL_STUDIO_VISIBLE_ALL, 'value' => _t('_adm_nav_txt_items_visible_for_all')),
  566. array('key' => BX_DOL_STUDIO_VISIBLE_SELECTED, 'value' => _t('_adm_nav_txt_items_visible_for_selected')),
  567. ),
  568. 'required' => '0',
  569. 'attrs' => array(
  570. 'onchange' => $this->getJsObject() . '.onChangeVisibleFor(this)'
  571. ),
  572. 'db' => array (
  573. 'pass' => 'Xss',
  574. )
  575. ),
  576. 'visible_for_levels' => array(
  577. 'type' => 'checkbox_set',
  578. 'name' => 'visible_for_levels',
  579. 'caption' => _t('_adm_nav_txt_items_visible_for_levels'),
  580. 'info' => _t('_adm_nav_dsc_items_visible_for_levels'),
  581. 'value' => '',
  582. 'values' => array(),
  583. 'tr_attrs' => array(
  584. 'style' => $aItem['visible_for_levels'] == BX_DOL_INT_MAX ? 'display:none' : ''
  585. ),
  586. 'db' => array (
  587. 'pass' => 'Int',
  588. ),
  589. ),
  590. 'controls' => array(
  591. 'name' => 'controls',
  592. 'type' => 'input_set',
  593. array(
  594. 'type' => 'submit',
  595. 'name' => 'do_submit',
  596. 'value' => _t('_adm_nav_btn_items_save'),
  597. ),
  598. array (
  599. 'type' => 'reset',
  600. 'name' => 'close',
  601. 'value' => _t('_adm_nav_btn_items_cancel'),
  602. 'attrs' => array(
  603. 'onclick' => "$('.bx-popup-applied:visible').dolPopupHide()",
  604. 'class' => 'bx-def-margin-sec-left',
  605. ),
  606. )
  607. )
  608. )
  609. );
  610. BxDolStudioUtils::getVisibilityValues($aItem['visible_for_levels'], $aForm['inputs']['visible_for_levels']['values'], $aForm['inputs']['visible_for_levels']['value']);
  611. bx_import('BxTemplStudioFormView');
  612. $oForm = new BxTemplStudioFormView($aForm);
  613. $oForm->initChecker();
  614. if($oForm->isSubmittedAndValid()) {
  615. $iVisibleFor = BxDolStudioUtils::getVisibilityValue($oForm->getCleanValue('visible_for'), $oForm->getCleanValue('visible_for_levels'));
  616. BxDolForm::setSubmittedValue('visible_for_levels', $iVisibleFor, $aForm['form_attrs']['method']);
  617. unset($oForm->aInputs['visible_for']);
  618. if($oForm->update($iId) !== false)
  619. $aRes = array('grid' => $this->getCode(false), 'blink' => $iId);
  620. else
  621. $aRes = array('msg' => _t('_adm_nav_err_items_show_to'));
  622. $this->_echoResultJson($aRes, true);
  623. }
  624. else {
  625. bx_import('BxTemplStudioFunctions');
  626. $sContent = BxTemplStudioFunctions::getInstance()->popupBox('adm-nav-item-hide-from-popup', _t('_adm_nav_txt_items_show_to_popup', _t($aItem['title'])), $this->_oTemplate->parseHtmlByName('nav_add_item.html', array(
  627. 'form_id' => $aForm['form_attrs']['id'],
  628. 'form' => $oForm->getCode(true),
  629. 'object' => $this->_sObject,
  630. 'action' => $sAction
  631. )));
  632. $this->_echoResultJson(array('popup' => $sContent), true);
  633. }
  634. }
  635. public function performActionDeleteIcon() {
  636. $sAction = 'delete_icon';
  637. $aIds = bx_get('ids');
  638. if(!isset($aIds[0]) || ($iId = (int)$aIds[0]) == 0) {
  639. $this->_echoResultJson(array());
  640. exit;
  641. }
  642. $aItem = array();
  643. $iItem = $this->oDb->getItems(array('type' => 'by_id', 'value' => $iId), $aItem);
  644. if($iItem != 1 || empty($aItem)){
  645. $this->_echoResultJson(array());
  646. exit;
  647. }
  648. if(is_numeric($aItem['icon']) && (int)$aItem['icon'] != 0) {
  649. bx_import('BxDolStorage');
  650. if(!BxDolStorage::getObjectInstance(BX_DOL_STORAGE_OBJ_IMAGES)->deleteFile((int)$aItem['icon'], 0)) {
  651. $this->_echoResultJson(array());
  652. exit;
  653. }
  654. }
  655. if($this->oDb->updateItem($aItem['id'], array('icon' => '')) !== false)
  656. $this->performActionEdit(true);
  657. }
  658. function getJsObject() {
  659. return 'oBxDolStudioNavigationItems';
  660. }
  661. function getSetsSelector($sModule = '') {
  662. bx_import('BxTemplStudioFormView');
  663. $oForm = new BxTemplStudioFormView(array());
  664. $aInputSets = array(
  665. 'type' => 'select',
  666. 'name' => 'set',
  667. 'attrs' => array(
  668. 'id' => 'bx-grid-set-' . $this->_sObject,
  669. 'onChange' => 'javascript:' . $this->getJsObject() . '.onChangeSet()'
  670. ),
  671. 'value' => $this->sSet,
  672. 'values' => array()
  673. );
  674. $aSets = array();
  675. if(!empty($sModule))
  676. $this->oDb->getSets(array('type' => 'by_module', 'value' => $sModule), $aSets, false);
  677. else
  678. $aInputSets['attrs']['disabled'] = 'disabled';
  679. if(!empty($aSets)) {
  680. $aCounter = array();
  681. $this->oDb->getItems(array('type' => 'counter_by_sets'), $aCounter, false);
  682. foreach($aSets as $aSet)
  683. $aInputSets['values'][$aSet['name']] = _t($aSet['title']) . " (" . (isset($aCounter[$aSet['name']]) ? $aCounter[$aSet['name']] : "0") . ")";
  684. asort($aInputSets['values']);
  685. }
  686. $aInputSets['values'] = array_merge(array('' => _t('_adm_nav_txt_select_set')), $aInputSets['values']);
  687. return $oForm->genRow($aInputSets);
  688. }
  689. function getCode($isDisplayHeader = true) {
  690. return $this->_oTemplate->parseHtmlByName('nav_items.html', array(
  691. 'content' => parent::getCode($isDisplayHeader),
  692. 'js_object' => $this->getJsObject(),
  693. 'page_url' => $this->sUrlPage,
  694. 'grid_object' => $this->_sObject,
  695. 'params_divider' => $this->sParamsDivider
  696. ));
  697. }
  698. protected function _addJsCss() {
  699. parent::_addJsCss();
  700. $this->_oTemplate->addJs(array('jquery.form.js', 'navigation_items.js', 'navigation_import.js'));
  701. bx_import('BxTemplStudioFormView');
  702. $oForm = new BxTemplStudioFormView(array());
  703. $oForm->addCssJs();
  704. }
  705. protected function _getCellIcon ($mixedValue, $sKey, $aField, $aRow) {
  706. $mixedValue = $this->_oTemplate->getIcon($mixedValue, array('class' => 'bx-nav-item-icon bx-def-border'));
  707. return parent::_getCellDefault($mixedValue, $sKey, $aField, $aRow);
  708. }
  709. protected function _getCellLink ($mixedValue, $sKey, $aField, $aRow) {
  710. if($aRow['submenu_object'] != "") {
  711. $aMenu = array();
  712. $this->oDb->getMenus(array('type' => 'by_object', 'value' => $aRow['submenu_object']), $aMenu, false);
  713. $sPrefix = _t('_adm_nav_txt_items_gl_link_menu');
  714. $aField['chars_limit'] -= strlen($sPrefix);
  715. $aValue = $this->_limitMaxLength(_t($aMenu['title']), $sKey, $aField, $aRow, $this->_isDisplayPopupOnTextOverflow, false);
  716. $mixedValue = $sPrefix . ' ' . $this->_oTemplate->parseHtmlByName('bx_a.html', array(
  717. 'href' => sprintf($this->sUrlViewItems, $aMenu['module'], $aMenu['set_name']),
  718. 'title' => _t('_adm_nav_txt_manage_items'),
  719. 'bx_repeat:attrs' => array(),
  720. 'content' => $aValue[0]
  721. )) . (isset($aValue[1]) ? $aValue[1] : '');
  722. }
  723. else if($aRow['submenu_object'] == "" && $aRow['onclick'] != "")
  724. $mixedValue = $this->_limitMaxLength(_t('_adm_nav_txt_items_gl_link_custom'), $sKey, $aField, $aRow, $this->_isDisplayPopupOnTextOverflow);
  725. else {
  726. bx_import('BxDolPermalinks');
  727. $mixedValue = BxDolPermalinks::getInstance()->permalink($mixedValue);
  728. }
  729. return parent::_getCellDefault($mixedValue, $sKey, $aField, $aRow);
  730. }
  731. protected function _getCellModule($mixedValue, $sKey, $aField, $aRow) {
  732. $mixedValue = $this->_limitMaxLength($this->getModuleTitle($aRow['module']), $sKey, $aField, $aRow, $this->_isDisplayPopupOnTextOverflow);
  733. return parent::_getCellDefault($mixedValue, $sKey, $aField, $aRow);
  734. }
  735. protected function _getCellVisibleForLevels ($mixedValue, $sKey, $aField, $aRow) {
  736. $mixedValue = $this->_oTemplate->parseHtmlByName('bx_a.html', array(
  737. 'href' => 'javascript:void(0)',
  738. 'title' => _t('_adm_nav_txt_manage_visibility'),
  739. 'bx_repeat:attrs' => array(
  740. array('key' => 'bx_grid_action_single', 'value' => 'show_to'),
  741. array('key' => 'bx_grid_action_data', 'value' => $aRow['id'])
  742. ),
  743. 'content' => BxDolStudioUtils::getVisibilityTitle($aRow['visible_for_levels'])
  744. ));
  745. return parent::_getCellDefault ($mixedValue, $sKey, $aField, $aRow);
  746. }
  747. protected function _getActionImport ($sType, $sKey, $a, $isSmall = false, $isDisabled = false, $aRow = array()) {
  748. if($this->sSet == '')
  749. $isDisabled = true;
  750. return parent::_getActionDefault($sType, $sKey, $a, false, $isDisabled, $aRow);
  751. }
  752. protected function _getActionAdd ($sType, $sKey, $a, $isSmall = false, $isDisabled = false, $aRow = array()) {
  753. if($this->sSet == '')
  754. $isDisabled = true;
  755. return parent::_getActionDefault($sType, $sKey, $a, false, $isDisabled, $aRow);
  756. }
  757. protected function _getActionDelete ($sType, $sKey, $a, $isSmall = false, $isDisabled = false, $aRow = array()) {
  758. if ($sType == 'single' && $aRow['module'] == BX_DOL_STUDIO_MODULE_SYSTEM)
  759. return '';
  760. return parent::_getActionDefault($sType, $sKey, $a, false, $isDisabled, $aRow);
  761. }
  762. protected function _getActionShowTo ($sType, $sKey, $a, $isSmall = false, $isDisabled = false, $aRow = array()) {
  763. return '';
  764. }
  765. protected function _getActionDeleteIcon ($sType, $sKey, $a, $isSmall = false, $isDisabled = false, $aRow = array()) {
  766. return '';
  767. }
  768. protected function _getActionsDisabledBehavior($aRow) {
  769. return false;
  770. }
  771. protected function _getFilterControls () {
  772. parent::_getFilterControls();
  773. $sContent = "";
  774. bx_import('BxTemplStudioFormView');
  775. $oForm = new BxTemplStudioFormView(array());
  776. $aInputModules = array(
  777. 'type' => 'select',
  778. 'name' => 'module',
  779. 'attrs' => array(
  780. 'id' => 'bx-grid-module-' . $this->_sObject,
  781. 'onChange' => 'javascript:' . $this->getJsObject() . '.onChangeModule()'
  782. ),
  783. 'value' => $this->sModule,
  784. 'values' => $this->getModules()
  785. );
  786. $aCounter = array();
  787. $this->oDb->getItems(array('type' => 'counter_by_modules'), $aCounter, false);
  788. foreach($aInputModules['values'] as $sKey => $sValue)
  789. $aInputModules['values'][$sKey] = $aInputModules['values'][$sKey] . " (" . (isset($aCounter[$sKey]) ? $aCounter[$sKey] : "0") . ")";
  790. $aInputModules['values'] = array_merge(array('' => _t('_adm_nav_txt_select_module')), $aInputModules['values']);
  791. $sContent .= $oForm->genRow($aInputModules);
  792. $sContent .= $this->getSetsSelector($this->sModule);
  793. $aInputSearch = array(
  794. 'type' => 'text',
  795. 'name' => 'keyword',
  796. 'attrs' => array(
  797. 'id' => 'bx-grid-search-' . $this->_sObject,
  798. ),
  799. 'tr_attrs' => array(
  800. 'style' => 'display:none;'
  801. )
  802. );
  803. $sContent .= $oForm->genRow($aInputSearch);
  804. return $sContent;
  805. }
  806. }
  807. /** @} */