PageRenderTime 75ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 1ms

/lib/packages/blocks/blocks.php

https://bitbucket.org/navigatecms/navigatecms
PHP | 3299 lines | 2911 code | 358 blank | 30 comment | 174 complexity | f7ce073a2e8adaef57443d06b6789311 MD5 | raw file
Possible License(s): GPL-2.0, MIT, LGPL-2.1, BSD-3-Clause, AGPL-3.0, Apache-2.0
  1. <?php
  2. require_once(NAVIGATE_PATH.'/lib/packages/blocks/block.class.php');
  3. require_once(NAVIGATE_PATH.'/lib/packages/blocks/block_group.class.php');
  4. require_once(NAVIGATE_PATH.'/lib/packages/properties/property.class.php');
  5. require_once(NAVIGATE_PATH.'/lib/packages/properties/property.layout.php');
  6. require_once(NAVIGATE_PATH.'/lib/packages/extensions/extension.class.php');
  7. require_once(NAVIGATE_PATH.'/lib/packages/webusers/webuser_group.class.php');
  8. function run()
  9. {
  10. global $layout;
  11. global $DB;
  12. global $website;
  13. $out = '';
  14. $item = new block();
  15. switch($_REQUEST['act'])
  16. {
  17. case 'json':
  18. case 1: // json data retrieval & operations
  19. switch($_REQUEST['oper'])
  20. {
  21. case 'del': // remove rows
  22. $ids = $_REQUEST['ids'];
  23. foreach($ids as $id)
  24. {
  25. $item->load($id);
  26. $item->delete();
  27. }
  28. echo json_encode(true);
  29. break;
  30. default: // list or search
  31. // translation of request search & order fields
  32. switch($_REQUEST['searchField'])
  33. {
  34. case 'id':
  35. $_REQUEST['searchField'] = 'b.id';
  36. break;
  37. case 'type':
  38. $_REQUEST['searchField'] = 'b.type';
  39. break;
  40. case 'title':
  41. $_REQUEST['searchField'] = 'd.text';
  42. break;
  43. case 'category':
  44. $_REQUEST['searchField'] = 'b.category';
  45. break;
  46. case 'dates':
  47. $_REQUEST['searchField'] = 'b.date_published';
  48. break;
  49. case 'enabled':
  50. $_REQUEST['searchField'] = 'b.enabled';
  51. break;
  52. case 'date_modified':
  53. default:
  54. $_REQUEST['searchField'] = 'b.date_modified';
  55. }
  56. if($_REQUEST['sidx']=='dates')
  57. $_REQUEST['sidx'] = 'b.date_published';
  58. $page = intval($_REQUEST['page']);
  59. $max = intval($_REQUEST['rows']);
  60. $offset = ($page - 1) * $max;
  61. $orderby= $_REQUEST['sidx'].' '.$_REQUEST['sord'];
  62. $where = " 1=1 ";
  63. if($_REQUEST['_search']=='true' || isset($_REQUEST['quicksearch']))
  64. {
  65. if(isset($_REQUEST['quicksearch']))
  66. $where .= $item->quicksearch($_REQUEST['quicksearch']);
  67. else if(isset($_REQUEST['filters']))
  68. {
  69. $where .= navitable::jqgridsearch($_REQUEST['filters']);
  70. // special case
  71. if( strpos($where, 'title LIKE')!== false)
  72. {
  73. $where = substr_replace($where, 'd.text', strpos($where, 'title LIKE'), 5);
  74. }
  75. }
  76. else // single search
  77. $where .= ' AND '.navitable::jqgridcompare($_REQUEST['searchField'], $_REQUEST['searchOper'], $_REQUEST['searchString']);
  78. }
  79. $sql = ' SELECT SQL_CALC_FOUND_ROWS b.*, d.text as title
  80. FROM nv_blocks b
  81. LEFT JOIN nv_webdictionary d
  82. ON b.id = d.node_id
  83. AND d.node_type = "block"
  84. AND d.subtype = "title"
  85. AND d.lang = "'.$website->languages_list[0].'"
  86. AND d.website = '.$website->id.'
  87. WHERE '.$where.'
  88. AND b.website = '.$website->id.'
  89. ORDER BY '.$orderby.'
  90. LIMIT '.$max.'
  91. OFFSET '.$offset;
  92. if(!$DB->query($sql, 'array'))
  93. {
  94. throw new Exception($DB->get_last_error());
  95. }
  96. $dataset = $DB->result();
  97. $total = $DB->foundRows();
  98. $block_types = block::types();
  99. $block_types_list = array();
  100. for($i=0; $i < count($block_types); $i++)
  101. {
  102. if(is_numeric($block_types[$i]['id']))
  103. $block_types_list[$block_types[$i]['code']] = $block_types[$i]['title'];
  104. else
  105. $block_types_list[$block_types[$i]['id']] = $block_types[$i]['title'];
  106. }
  107. $dataset = grid_notes::summary($dataset, 'block', 'id');
  108. // we need to format the values and retrieve the needed strings from the dictionary
  109. $out = array();
  110. for($i=0; $i < count($dataset); $i++)
  111. {
  112. if(empty($dataset[$i])) continue;
  113. $access = array(
  114. 0 => '<img src="img/icons/silk/page_white_go.png" align="absmiddle" title="'.t(254, 'Everybody').'" />',
  115. 1 => '<img src="img/icons/silk/lock.png" align="absmiddle" title="'.t(361, 'Web users only').'" />',
  116. 2 => '<img src="img/icons/silk/user_gray.png" align="absmiddle" title="'.t(363, 'Users who have not yet signed up or signed in').'" />',
  117. 3 => '<img src="img/icons/silk/group_key.png" align="absmiddle" title="'.t(512, "Selected web user groups").'" />'
  118. );
  119. if(empty($dataset[$i]['date_published']))
  120. $dataset[$i]['date_published'] = '&infin;';
  121. else
  122. $dataset[$i]['date_published'] = core_ts2date($dataset[$i]['date_published'], false);
  123. if(empty($dataset[$i]['date_unpublish']))
  124. $dataset[$i]['date_unpublish'] = '&infin;';
  125. else
  126. $dataset[$i]['date_unpublish'] = core_ts2date($dataset[$i]['date_unpublish'], false);
  127. if($dataset[$i]['category'] > 0)
  128. $dataset[$i]['category'] = $DB->query_single(
  129. 'text',
  130. 'nv_webdictionary',
  131. ' node_type = "structure" AND
  132. node_id = "'.$dataset[$i]['category'].'" AND
  133. subtype = "title" AND
  134. lang = "'.$website->languages_list[0].'"
  135. '
  136. );
  137. $out[$i] = array(
  138. 0 => $dataset[$i]['id'],
  139. 1 => $block_types_list[$dataset[$i]['type']],
  140. 2 => '<div class="list-row" data-enabled="'.$dataset[$i]['enabled'].'">'.$dataset[$i]['title'].'</div>',
  141. 3 => $dataset[$i]['date_published'].' - '.$dataset[$i]['date_unpublish'],
  142. 4 => $access[$dataset[$i]['access']],
  143. 5 => (($dataset[$i]['enabled']==1)? '<img src="img/icons/silk/accept.png" />' : '<img src="img/icons/silk/cancel.png" />'),
  144. 6 => $dataset[$i]['_grid_notes_html']
  145. );
  146. }
  147. navitable::jqgridJson($out, $page, $offset, $max, $total);
  148. break;
  149. }
  150. session_write_close();
  151. exit;
  152. break;
  153. case 'load':
  154. case 'edit':
  155. case 2:
  156. if(!empty($_REQUEST['id']))
  157. {
  158. $item->load(intval($_REQUEST['id']));
  159. }
  160. if(isset($_REQUEST['form-sent']))
  161. {
  162. $item->load_from_post();
  163. try
  164. {
  165. $item->save();
  166. property::save_properties_from_post('block', $item->id);
  167. $id = $item->id;
  168. // set block order
  169. if(!empty($item->type) && !empty($_REQUEST['blocks-order']))
  170. block::reorder($item->type, $_REQUEST['blocks-order'], $_REQUEST['blocks-order-fixed']);
  171. unset($item);
  172. $item = new block();
  173. $item->load($id);
  174. $layout->navigate_notification(t(53, "Data saved successfully."), false, false, 'fa fa-check');
  175. }
  176. catch(Exception $e)
  177. {
  178. $layout->navigate_notification($e->getMessage(), true, true);
  179. }
  180. users_log::action($_REQUEST['fid'], $item->id, 'save', $item->dictionary[$website->languages_list[0]]['title'], json_encode($_REQUEST));
  181. }
  182. else
  183. users_log::action($_REQUEST['fid'], $item->id, 'load', $item->dictionary[$website->languages_list[0]]['title']);
  184. $out = blocks_form($item);
  185. break;
  186. case 'delete':
  187. case 4: // remove
  188. if(!empty($_REQUEST['id']))
  189. {
  190. $item->load(intval($_REQUEST['id']));
  191. if($item->delete() > 0)
  192. {
  193. $layout->navigate_notification(t(55, 'Item removed successfully.'), false);
  194. $out = blocks_list();
  195. }
  196. else
  197. {
  198. $layout->navigate_notification(t(56, 'Unexpected error.'), false);
  199. $out = blocks_form($item);
  200. }
  201. users_log::action($_REQUEST['fid'], $item->id, 'remove', $item->dictionary[$website->languages_list[0]]['title']);
  202. }
  203. break;
  204. case 'duplicate':
  205. if(!empty($_REQUEST['id']))
  206. {
  207. $item->load(intval($_REQUEST['id']));
  208. $properties = property::load_properties_associative(
  209. 'block', $item->type,
  210. 'block', $item->id
  211. );
  212. // try to duplicate
  213. $item->id = 0;
  214. $ok = $item->insert();
  215. if($ok)
  216. {
  217. // also duplicate block properties
  218. $ok = property::save_properties_from_array('block', $item->id, $item->type, $properties);
  219. }
  220. if($ok)
  221. {
  222. $layout->navigate_notification(t(478, 'Item duplicated successfully.'), false, false, 'fa fa-check');
  223. $out = blocks_form($item);
  224. }
  225. else
  226. {
  227. $layout->navigate_notification(t(56, 'Unexpected error.'), false);
  228. $item = new block();
  229. $item->load(intval($_REQUEST['id']));
  230. $out = blocks_form($item);
  231. }
  232. users_log::action($_REQUEST['fid'], $item->id, 'duplicate', $item->dictionary[$website->languages_list[0]]['title'], json_encode($_REQUEST));
  233. }
  234. break;
  235. case 'path':
  236. case 5: // search an existing path
  237. $DB->query('SELECT path as id, path as label, path as value
  238. FROM nv_paths
  239. WHERE path LIKE '.protect('%'.$_REQUEST['term'].'%').'
  240. AND website = '.$website->id.'
  241. ORDER BY path ASC
  242. LIMIT 10',
  243. 'array');
  244. echo json_encode($DB->result());
  245. core_terminate();
  246. break;
  247. case 'block_groups_list':
  248. $out = block_groups_list();
  249. break;
  250. case 'block_groups_json': // block groups: json data retrieval
  251. $page = intval($_REQUEST['page']);
  252. $max = intval($_REQUEST['rows']);
  253. $offset = ($page - 1) * $max;
  254. list($rs, $total) = block_group::paginated_list($offset, $max, $_REQUEST['sidx'], $_REQUEST['sord']);
  255. $rs = grid_notes::summary($rs, 'block_group', 'id');
  256. // translate $rs to an array of ordered fields
  257. foreach($rs as $row)
  258. {
  259. if(substr($row['blocks'], 0, 2)=='a:') // nv < 2.1
  260. $row['blocks'] = mb_unserialize($row['blocks']);
  261. else // nv >= 2.1
  262. $row['blocks'] = json_decode($row['blocks'], true);
  263. $dataset[] = array(
  264. 'id' => $row['id'],
  265. 'code' => $row['code'],
  266. 'title' => $row['title'],
  267. 'blocks' => count($row['blocks']),
  268. 'notes' => $row['_grid_notes_html']
  269. );
  270. }
  271. navitable::jqgridJson($dataset, $page, $offset, $max, $total, 'id');
  272. session_write_close();
  273. exit;
  274. break;
  275. case 'block_group_edit':
  276. $item = new block_group();
  277. if(!empty($_REQUEST['id']))
  278. {
  279. $item->load(intval($_REQUEST['id']));
  280. }
  281. if(isset($_REQUEST['form-sent']))
  282. {
  283. $item->load_from_post();
  284. try
  285. {
  286. $item->save();
  287. $layout->navigate_notification(t(53, "Data saved successfully."), false, false, 'fa fa-check');
  288. }
  289. catch(Exception $e)
  290. {
  291. $layout->navigate_notification($e->getMessage(), true, true);
  292. }
  293. users_log::action($_REQUEST['fid'], $item->id, 'save', $item->title, json_encode($_REQUEST));
  294. }
  295. else if(!empty($_REQUEST['id']))
  296. users_log::action($_REQUEST['fid'], $item->id, 'edit', $item->title);
  297. $out = block_group_form($item);
  298. break;
  299. case 'block_group_delete':
  300. $item = new block_group();
  301. if(!empty($_REQUEST['id']))
  302. {
  303. $item->load(intval($_REQUEST['id']));
  304. if($item->delete() > 0)
  305. {
  306. $layout->navigate_notification(t(55, 'Item removed successfully.'), false);
  307. $out = block_groups_list();
  308. }
  309. else
  310. {
  311. $layout->navigate_notification(t(56, 'Unexpected error.'), false);
  312. $out = block_group_form($item);
  313. }
  314. users_log::action($_REQUEST['fid'], $item->id, 'remove', $item->title);
  315. }
  316. break;
  317. case 'block_types_list':
  318. $out = blocks_types_list();
  319. break;
  320. case 'block_types_json': // block types: json data retrieval
  321. $page = intval($_REQUEST['page']);
  322. $max = intval($_REQUEST['rows']);
  323. $offset = ($page - 1) * $max;
  324. $rs = block::types($_REQUEST['sidx'], $_REQUEST['sord']);
  325. $block_modes = block::modes();
  326. // translate $rs to an array of ordered fields
  327. foreach($rs as $row)
  328. {
  329. $dataset[] = array(
  330. 'id' => $row['id'],
  331. 'type' => $block_modes[$row['type']],
  332. 'code' => $row['code'],
  333. 'title' => $row['title'],
  334. 'width' => $row['width'],
  335. 'height' => $row['height']
  336. );
  337. }
  338. $total = count($dataset);
  339. navitable::jqgridJson($dataset, $page, $offset, $max, $total, 'id');
  340. session_write_close();
  341. exit;
  342. break;
  343. case 'block_type_edit':
  344. case 82: // edit/create block type
  345. $item = NULL;
  346. $position = NULL;
  347. $max_id = 0;
  348. $dataset = block::custom_types();
  349. for($i=0; $i < count($dataset); $i++)
  350. {
  351. if($dataset[$i]['id'] > $max_id)
  352. $max_id = $dataset[$i]['id'];
  353. if($dataset[$i]['id'] == $_REQUEST['id'])
  354. {
  355. $item = $dataset[$i];
  356. $position = $i;
  357. }
  358. }
  359. if(empty($item))
  360. {
  361. $layout->navigate_notification(t(599, "Sorry, can't display a theme block type info."));
  362. $out = blocks_types_list();
  363. }
  364. else
  365. {
  366. if(isset($_REQUEST['form-sent']))
  367. {
  368. if(empty($item))
  369. $item = array('id' => $max_id + 1);
  370. $item['type'] = $_REQUEST['type'];
  371. $item['title'] = $_REQUEST['title'];
  372. $item['code'] = $_REQUEST['code'];
  373. $item['width'] = $_REQUEST['width'];
  374. $item['height'] = $_REQUEST['height'];
  375. $item['order'] = $_REQUEST['order'];
  376. $item['maximum'] = $_REQUEST['maximum'];
  377. $item['notes'] = pquotes($_REQUEST['notes']);
  378. if(!is_null($position))
  379. $dataset[$position] = $item;
  380. else
  381. $dataset[] = $item;
  382. try
  383. {
  384. // save
  385. $ok = block::types_update($dataset);
  386. $layout->navigate_notification(t(53, "Data saved successfully."), false, false, 'fa fa-check');
  387. }
  388. catch(Exception $e)
  389. {
  390. $layout->navigate_notification($e->getMessage(), true, true);
  391. }
  392. }
  393. $out = blocks_type_form($item);
  394. }
  395. break;
  396. case 'block_type_delete':
  397. case 84: // remove block type
  398. $dataset = block::custom_types();
  399. $item = NULL;
  400. for($i=0; $i < count($dataset); $i++)
  401. {
  402. if($dataset[$i]['id'] == $_REQUEST['id'])
  403. {
  404. unset($dataset[$i]);
  405. break;
  406. }
  407. }
  408. try
  409. {
  410. block::types_update($dataset);
  411. $layout->navigate_notification(t(55, 'Item removed successfully.'), false);
  412. $out = blocks_types_list();
  413. }
  414. catch(Exception $e)
  415. {
  416. $out = $layout->navigate_message("error", t(23, 'Blocks'), t(56, 'Unexpected error.'));
  417. }
  418. break;
  419. case 'block_property_load':
  420. $property = new property();
  421. if(!empty($_REQUEST['id']))
  422. {
  423. if(is_numeric($_REQUEST['id']))
  424. $property->load(intval($_REQUEST['id']));
  425. else
  426. $property->load_from_theme($_REQUEST['id'], null, 'block', $_REQUEST['block']);
  427. }
  428. header('Content-type: text/json');
  429. $types = property::types();
  430. $property->type_text = $types[$property->type];
  431. echo json_encode($property);
  432. session_write_close();
  433. exit;
  434. break;
  435. case 'block_property_save': // save property details
  436. $property = new property();
  437. if(!empty($_REQUEST['property-id']))
  438. $property->load(intval($_REQUEST['property-id']));
  439. $property->load_from_post();
  440. $property->save();
  441. header('Content-type: text/json');
  442. $types = property::types();
  443. $property->type_text = $types[$property->type];
  444. echo json_encode($property);
  445. session_write_close();
  446. exit;
  447. break;
  448. case 'block_property_remove': // remove property
  449. $property = new property();
  450. if(!empty($_REQUEST['property-id']))
  451. $property->load(intval($_REQUEST['property-id']));
  452. $property->delete();
  453. session_write_close();
  454. exit;
  455. break;
  456. case 'block_group_block_options':
  457. $status = null;
  458. $block_group = $_REQUEST['block_group'];
  459. $block_code = $_REQUEST['code'];
  460. $block_uid = $_REQUEST['block_uid'];
  461. if(isset($_REQUEST['form-sent']))
  462. $status = property::save_properties_from_post('block_group_block', $block_code, $block_group, $block_code, $block_uid);
  463. $out = block_group_block_options($block_group, $block_code, $block_uid, $status);
  464. echo $out;
  465. core_terminate();
  466. break;
  467. case 'block_group_extension_block_options':
  468. $status = null;
  469. $block_group = $_REQUEST['block_group']; // block_group type
  470. $block_id = $_REQUEST['block_id']; // extension block id (type)
  471. $block_uid = $_REQUEST['block_uid']; // extension block unique id
  472. $block_extension = $_REQUEST['block_extension']; // extension name
  473. if(isset($_REQUEST['form-sent']))
  474. $status = property::save_properties_from_post('extension_block', $block_group, $block_id, null, $block_uid);
  475. $out = block_group_extension_block_options($block_group, $block_extension, $block_id, $block_uid, $status);
  476. echo $out;
  477. core_terminate();
  478. break;
  479. case 'list':
  480. case 0:
  481. default:
  482. $out = blocks_list();
  483. break;
  484. }
  485. return $out;
  486. }
  487. function blocks_list()
  488. {
  489. global $events;
  490. global $user;
  491. $navibars = new navibars();
  492. $navitable = new navitable("blocks_list");
  493. $navibars->title(t(23, 'Blocks'));
  494. // retrieve block groups, if more than 10, do not show quickmenu
  495. $group_blocks_links = array();
  496. list($bg_rs, $bg_total) = block_group::paginated_list(0, 10, 'title', 'desc');
  497. if($bg_total > 0 && $bg_total <= 10)
  498. {
  499. foreach($bg_rs as $bg)
  500. $group_blocks_links[] = '<a class="ui-menu-action-bigger" href="?fid=blocks&act=block_group_edit&id='.$bg['id'].'"><i class="fa fa-fw fa-caret-right"></i> '.$bg['title'].'</a>';
  501. $events->add_actions(
  502. 'blocks',
  503. array(
  504. 'item' => null,
  505. 'navibars' => &$navibars
  506. ),
  507. $group_blocks_links,
  508. '<a class="content-actions-submenu-trigger" href="?fid=blocks&act=block_groups_list">
  509. <img height="16" align="absmiddle" width="16" src="img/icons/silk/bricks.png"> '.t(506, 'Groups').' &#9662;
  510. </a>'
  511. );
  512. }
  513. $navibars->add_actions(
  514. array(
  515. (!empty($group_blocks_links)? '' : '<a href="?fid=blocks&act=block_groups_list"><img height="16" align="absmiddle" width="16" src="img/icons/silk/bricks.png"> '.t(506, 'Groups').'</a>'),
  516. '<a href="?fid=blocks&act=block_types_list"><img height="16" align="absmiddle" width="16" src="img/icons/silk/brick_edit.png"> '.t(167, 'Types').'</a>'
  517. )
  518. );
  519. $navibars->add_actions(
  520. array(
  521. '<a href="?fid=blocks&act=edit"><img height="16" align="absmiddle" width="16" src="img/icons/silk/add.png"> '.t(38, 'Create').'</a>',
  522. '<a href="?fid=blocks&act=list"><img height="16" align="absmiddle" width="16" src="img/icons/silk/application_view_list.png"> '.t(39, 'List').'</a>',
  523. 'search_form'
  524. )
  525. );
  526. if(@$_REQUEST['quicksearch']=='true')
  527. $navitable->setInitialURL("?fid=blocks&act=json&_search=true&quicksearch=".$_REQUEST['navigate-quicksearch']);
  528. $navitable->setURL('?fid=blocks&act=json');
  529. $navitable->sortBy('date_modified', 'desc');
  530. $navitable->setDataIndex('id');
  531. $navitable->setEditUrl('id', '?fid=blocks&act=edit&id=');
  532. $navitable->enableSearch();
  533. if($user->permission("blocks.delete") == 'true')
  534. $navitable->enableDelete();
  535. $navitable->setGridNotesObjectName("block");
  536. $navitable->addCol("ID", 'id', "40", "true", "left");
  537. $navitable->addCol(t(160, 'Type'), 'type', "120", "true", "center");
  538. $navitable->addCol(t(67, 'Title'), 'title', "400", "true", "left");
  539. $navitable->addCol(t(85, 'Date published'), 'dates', "100", "true", "center");
  540. $navitable->addCol(t(364, 'Access'), 'access', "40", "true", "center");
  541. $navitable->addCol(t(65, 'Enabled'), 'enabled', "40", "true", "center");
  542. $navitable->addCol(t(168, 'Notes'), 'note', "50", "false", "center");
  543. $navibars->add_content($navitable->generate());
  544. return $navibars->generate();
  545. }
  546. function blocks_form($item)
  547. {
  548. global $user;
  549. global $DB;
  550. global $website;
  551. global $layout;
  552. global $events;
  553. global $theme;
  554. $current_version = $_SESSION['current_version'];
  555. $extra_actions = array();
  556. $navibars = new navibars();
  557. $naviforms = new naviforms();
  558. $layout->navigate_media_browser(); // we can use media browser in this function
  559. if(empty($item->id))
  560. $navibars->title(t(23, 'Blocks').' / '.t(38, 'Create'));
  561. else
  562. $navibars->title(t(23, 'Blocks').' / '.t(170, 'Edit').' ['.$item->id.']');
  563. $navibars->add_actions(
  564. array(
  565. '<a href="#" onclick="javascript: navigate_media_browser();" title="Ctrl+M">
  566. <img height="16" align="absmiddle" width="16" src="img/icons/silk/images.png"> '.t(36, 'Media').'
  567. </a>'
  568. )
  569. );
  570. $layout->add_script("
  571. $(document).on('keydown.ctrl_s', function (evt) { navigate_tabform_submit(1); return false; } );
  572. $(document).on('keydown.ctrl_m', function (evt) { navigate_media_browser(); return false; } );
  573. ");
  574. if(!empty($item->id))
  575. {
  576. $notes = grid_notes::comments('block', $item->id);
  577. $navibars->add_actions(
  578. array(
  579. '<a href="#" onclick="javascript: navigate_display_notes_dialog();"><span class="navigate_grid_notes_span" style=" width: 20px; line-height: 16px; ">'.count($notes).'</span><img src="img/skins/badge.png" width="20px" height="18px" style="margin-top: -2px;" class="grid_note_edit" align="absmiddle" /> '.t(168, 'Notes').'</a>'
  580. )
  581. );
  582. }
  583. if(empty($item->id))
  584. {
  585. $navibars->add_actions(
  586. array(
  587. ($user->permission('blocks.create')=='true'?
  588. '<a href="#" onclick="navigate_tabform_submit(1);" title="Ctrl+S">
  589. <img height="16" align="absmiddle" width="16" src="img/icons/silk/accept.png"> '.t(34, 'Save').'
  590. </a>' : "")
  591. )
  592. );
  593. }
  594. else
  595. {
  596. $navibars->add_actions(
  597. array(
  598. (($user->permission('blocks.edit') == 'true') ?
  599. '<a href="#" onclick="navigate_tabform_submit(1);" title="Ctrl+S">
  600. <img height="16" align="absmiddle" width="16" src="img/icons/silk/accept.png"> '.t(34, 'Save').'
  601. </a>' : ""),
  602. ($user->permission("blocks.delete") == 'true' ?
  603. '<a href="#" onclick="navigate_delete_dialog();">
  604. <img height="16" align="absmiddle" width="16" src="img/icons/silk/cancel.png"> '.t(35, 'Delete').'
  605. </a>' : "")
  606. )
  607. );
  608. $layout->add_script('
  609. function navigate_delete_dialog()
  610. {
  611. navigate_confirmation_dialog(
  612. function() { window.location.href = "?fid=blocks&act=delete&id='.$item->id.'"; },
  613. null, null, "'.t(35, 'Delete').'"
  614. );
  615. }
  616. ');
  617. if($user->permission("blocks.create") == 'true')
  618. $extra_actions[] = '<a href="?fid=blocks&act=duplicate&id='.$item->id.'" onclick="$(this).attr(\'#\');"><img height="16" align="absmiddle" width="16" src="img/icons/silk/page_copy.png"> '.t(477, 'Duplicate').'</a>';
  619. }
  620. array_unshift($extra_actions, '<a href="?fid=blocks&act=block_types_list"><img height="16" align="absmiddle" width="16" src="img/icons/silk/brick_edit.png"> '.t(167, 'Types').'</a>');
  621. $events->add_actions(
  622. 'blocks',
  623. array(
  624. 'item' => null,
  625. 'navibars' => &$navibars
  626. ),
  627. $extra_actions
  628. );
  629. $group_blocks_links = array();
  630. list($bg_rs, $bg_total) = block_group::paginated_list(0, 10, 'title', 'desc');
  631. if($bg_total > 0 && $bg_total <= 10)
  632. {
  633. foreach($bg_rs as $bg)
  634. $group_blocks_links[] = '<a href="?fid=blocks&act=block_group_edit&id='.$bg['id'].'"><i class="fa fa-fw fa-caret-right"></i> '.$bg['title'].'</a>';
  635. $events->add_actions(
  636. 'blocks',
  637. array(
  638. 'item' => null,
  639. 'navibars' => &$navibars
  640. ),
  641. $group_blocks_links,
  642. '<a class="content-actions-submenu-trigger" href="?fid=blocks&act=block_groups_list"><img height="16" align="absmiddle" width="16" src="img/icons/silk/bricks.png"> '.t(506, 'Groups').' &#9662;</a>'
  643. );
  644. }
  645. else
  646. {
  647. $navibars->add_actions(
  648. array(
  649. '<a href="?fid=blocks&act=block_groups_list"><img height="16" align="absmiddle" width="16" src="img/icons/silk/bricks.png"> '.t(506, 'Groups').'</a>'
  650. )
  651. );
  652. }
  653. $navibars->add_actions(
  654. array(
  655. (!empty($item->id)? '<a href="?fid=blocks&act=edit"><img height="16" align="absmiddle" width="16" src="img/icons/silk/add.png"> '.t(38, 'Create').'</a>' : ''),
  656. '<a href="?fid=blocks&act=list"><img height="16" align="absmiddle" width="16" src="img/icons/silk/application_view_list.png"> '.t(39, 'List').'</a>',
  657. 'search_form'
  658. )
  659. );
  660. if(!empty($item->id))
  661. $layout->navigate_notes_dialog('block', $item->id);
  662. $navibars->form(NULL, '?fid=blocks&act=edit');
  663. $navibars->add_content('
  664. <script type="text/javascript" src="lib/packages/blocks/blocks.js?r='.$current_version->revision.'"></script>
  665. ');
  666. $navibars->add_tab(t(43, "Main"));
  667. $navibars->add_tab_content($naviforms->hidden('form-sent', 'true'));
  668. $navibars->add_tab_content($naviforms->hidden('id', $item->id));
  669. $navibars->add_tab_content_row(
  670. array(
  671. '<label>ID</label>',
  672. '<span>'.(!empty($item->id)? $item->id : t(52, '(new)')).'</span>'
  673. )
  674. );
  675. $block_types = block::types();
  676. $block_types_keys = array();
  677. $block_types_info = array();
  678. for($i=0; $i < count($block_types); $i++)
  679. {
  680. if($item->type == $block_types[$i]['code'])
  681. $block_type_width = $block_types[$i]['width'];
  682. $block_size_helper = '';
  683. if(!empty($block_types[$i]['width']) || !empty($block_types[$i]['height']))
  684. {
  685. if(empty($block_types[$i]['width'])) $block_types[$i]['width'] = '***';
  686. if(empty($block_types[$i]['height'])) $block_types[$i]['height'] = '***';
  687. $block_size_helper = ' ('.$block_types[$i]['width'].' x '.$block_types[$i]['height'].' px)';
  688. }
  689. if(is_numeric($block_types[$i]['id']))
  690. $block_types_keys[] = $block_types[$i]['code']; // block type created via navigate interface
  691. else
  692. $block_types_keys[] = $block_types[$i]['id']; // block described in theme definition
  693. $block_types_info[] = $block_types[$i]['title'].$block_size_helper;
  694. }
  695. $navibars->add_tab_content_row(
  696. array(
  697. '<label>'.t(160, 'Type').'</label>',
  698. $naviforms->selectfield('type', $block_types_keys, $block_types_info, $item->type)
  699. )
  700. );
  701. $navibars->add_tab_content_row(
  702. array(
  703. '<label>'.t(85, 'Date published').'</label>',
  704. $naviforms->datefield('date_published', $item->date_published, true),
  705. )
  706. );
  707. $navibars->add_tab_content_row(
  708. array(
  709. '<label>'.t(90, 'Date unpublished').'</label>',
  710. $naviforms->datefield('date_unpublish', $item->date_unpublish, true),
  711. )
  712. );
  713. // Notes field is deprecated, but we keep on showing the existing Notes
  714. if(!empty($item->notes))
  715. {
  716. $navibars->add_tab_content_row(
  717. array(
  718. '<label>'.t(168, 'Notes').'</label>',
  719. $naviforms->textarea('notes', $item->notes)
  720. )
  721. );
  722. }
  723. $navibars->add_tab_content_row(
  724. array(
  725. '<label>'.t(364, 'Access').'</label>',
  726. $naviforms->selectfield(
  727. 'access',
  728. array(
  729. 0 => 0,
  730. 1 => 2,
  731. 2 => 1,
  732. 3 => 3
  733. ),
  734. array(
  735. 0 => t(254, 'Everybody'),
  736. 1 => t(362, 'Not signed in'),
  737. 2 => t(361, 'Web users only'),
  738. 3 => t(512, 'Selected web user groups')
  739. ),
  740. $item->access,
  741. 'navigate_webuser_groups_visibility($(this).val());',
  742. false,
  743. array(
  744. 1 => t(363, 'Users who have not yet signed in')
  745. )
  746. )
  747. )
  748. );
  749. $webuser_groups = webuser_group::all_in_array();
  750. $navibars->add_tab_content_row(
  751. array(
  752. '<label>'.t(506, "Groups").'</label>',
  753. $naviforms->multiselect(
  754. 'groups',
  755. array_keys($webuser_groups),
  756. array_values($webuser_groups),
  757. $item->groups
  758. )
  759. ),
  760. 'webuser-groups-field'
  761. );
  762. $layout->add_script('
  763. function navigate_webuser_groups_visibility(access_value)
  764. {
  765. if(access_value==3)
  766. $("#webuser-groups-field").show();
  767. else
  768. $("#webuser-groups-field").hide();
  769. }
  770. navigate_webuser_groups_visibility('.$item->access.');
  771. ');
  772. if(empty($item->id)) $item->enabled = true;
  773. $navibars->add_tab_content_row(
  774. array(
  775. '<label>'.t(65, 'Enabled').'</label>',
  776. $naviforms->checkbox('enabled', $item->enabled),
  777. )
  778. );
  779. if($item->date_modified > 0)
  780. {
  781. $navibars->add_tab_content_row(
  782. array(
  783. '<label>'.t(227, 'Date modified').'</label>',
  784. core_ts2date($item->date_modified, true)
  785. )
  786. );
  787. }
  788. $navibars->add_tab(t(9, "Content"));
  789. switch($item->class)
  790. {
  791. case 'poll':
  792. $options = array();
  793. foreach($website->languages_list as $lang)
  794. $options[$lang] = language::name_by_code($lang);
  795. $navibars->add_tab_content_row(
  796. array(
  797. '<label>'.t(63, 'Languages').'</label>',
  798. $naviforms->buttonset('language_selector', $options, $website->languages_list[0], "navigate_items_select_language(this);")
  799. )
  800. );
  801. foreach($website->languages_list as $lang)
  802. {
  803. $navibars->add_tab_content('
  804. <div class="language_fields" id="language_fields_'.$lang.'" style=" display: none; ">
  805. ');
  806. $navibars->add_tab_content_row(
  807. array(
  808. '<label>'.t(558, 'Question').'</label>',
  809. $naviforms->textfield('title-'.$lang, @$item->dictionary[$lang]['title']),
  810. ''
  811. )
  812. );
  813. // Poll options
  814. $table = new naviorderedtable("poll_answers_table_".$lang);
  815. $table->setWidth("330px");
  816. $table->setHiddenInput("poll-answers-table-order-".$lang);
  817. $navibars->add_tab_content(
  818. $naviforms->hidden("poll-answers-table-order-".$lang, "")
  819. );
  820. $table->addHeaderColumn(t(67, 'Title'), 200);
  821. //$table->addHeaderColumn(t(237, 'Code'), 120);
  822. $table->addHeaderColumn(t(352, 'Votes'), 80);
  823. $table->addHeaderColumn(t(35, 'Remove'), 50);
  824. if(!empty($item->trigger[$lang]))
  825. {
  826. $poll_answers = $item->trigger[$lang];
  827. foreach($poll_answers as $pa)
  828. {
  829. $uid = uniqid();
  830. $table->addRow(
  831. "poll-answers-table-row-".$uid,
  832. array(
  833. array('content' => '<input type="text" name="poll-answers-table-title-'.$lang.'['.$uid.']" value="'.$pa['title'].'" style="width: 200px;" />', 'align' => 'left'),
  834. //array('content' => '<input type="text" name="poll-answers-table-code-'.$lang.'['.$uid.']" value="'.$pa['code'].'" style="width: 120px;" />', 'align' => 'left'),
  835. array('content' => '<input type="text" name="poll-answers-table-votes-'.$lang.'['.$uid.']" value="'.intval($pa['votes']).'" style="width: 80px;" />', 'align' => 'left'),
  836. array('content' => '<img src="'.NAVIGATE_URL.'/img/icons/silk/cancel.png" style="cursor: pointer;" onclick="navigate_blocks_poll_answers_table_row_remove(this);" />', 'align' => 'center')
  837. )
  838. );
  839. }
  840. }
  841. $uid = uniqid();
  842. $table->addRow(
  843. "poll-answers-table-row-model-".$lang,
  844. array(
  845. array('content' => '<input type="text" name="poll-answers-table-title-'.$lang.'['.$uid.']" value="" style="width: 200px;" />', 'align' => 'left'),
  846. //array('content' => '<input type="text" name="poll-answers-table-code-'.$lang.'['.$uid.']" value="'.$uid.'" style="width: 120px;" />', 'align' => 'left'),
  847. array('content' => '<input type="text" name="poll-answers-table-votes-'.$lang.'['.$uid.']" value="0" style="width: 80px;" />', 'align' => 'left'),
  848. array('content' => '<img src="'.NAVIGATE_URL.'/img/icons/silk/cancel.png" style="cursor: pointer;" onclick="navigate_blocks_poll_answers_table_row_remove(this);" />', 'align' => 'center')
  849. )
  850. );
  851. $navibars->add_tab_content_row(
  852. array(
  853. '<label>'.t(559, "Answers").'</label>',
  854. '<div id="poll-answers-'.$lang.'">'.$table->generate().'</div>',
  855. '<label>&nbsp;</label>',
  856. '<button id="poll-answers-table-add-'.$lang.'" data-lang="'.$lang.'"><img src="img/icons/silk/add.png" align="absmiddle" style="cursor:pointer;" /> '.t(472, 'Add').'</button>'
  857. )
  858. );
  859. $navibars->add_tab_content('
  860. </div>
  861. ');
  862. }
  863. foreach($website->languages_list as $alang)
  864. {
  865. $layout->add_script('
  866. $(window).on("load", function()
  867. {
  868. poll_answers_table_row_models["'.$alang.'"] = $("#poll-answers-table-row-model-'.$alang.'").html();
  869. if($("#poll_answers_table_'.$alang.'").find("tr").not(".nodrag").length > 1)
  870. $("#poll-answers-table-row-model-'.$alang.'").hide();
  871. navigate_naviorderedtable_poll_answers_table_'.$alang.'_reorder();
  872. });
  873. ');
  874. }
  875. $layout->add_script('
  876. var active_languages = ["'.implode('", "', array_keys($options)).'"];
  877. navigate_items_select_language("'.$website->languages_list[0].'");
  878. ');
  879. break;
  880. case 'block':
  881. case 'theme':
  882. default:
  883. $options = array();
  884. foreach($website->languages_list as $lang)
  885. $options[$lang] = language::name_by_code($lang);
  886. $navibars->add_tab_content_row(
  887. array(
  888. '<label>'.t(63, 'Languages').'</label>',
  889. $naviforms->buttonset('language_selector', $options, $website->languages_list[0], "navigate_items_select_language(this);")
  890. )
  891. );
  892. foreach($website->languages_list as $lang)
  893. {
  894. $navibars->add_tab_content('<div class="language_fields" id="language_fields_'.$lang.'" style=" display: none; ">');
  895. $navibars->add_tab_content_row(
  896. array(
  897. '<label>'.t(67, 'Title').'</label>',
  898. $naviforms->textfield('title-'.$lang, @$item->dictionary[$lang]['title']),
  899. ''
  900. )
  901. );
  902. $block_trigger_types = array(
  903. '' => t(181, 'Hidden'),
  904. 'title' => t(67, 'Title'),
  905. 'content' => t(9, 'Content'),
  906. 'image' => t(157, 'Image'),
  907. 'rollover' => t(182, 'Rollover'),
  908. 'video' => t(272, 'Video'),
  909. 'html' => 'HTML',
  910. 'links' => t(549, 'Links'),
  911. 'flash' => 'Flash'
  912. );
  913. // check block trigger restrictions in theme definition
  914. if(is_array($theme->blocks))
  915. {
  916. foreach($theme->blocks as $tb)
  917. {
  918. // navigate 1.x compatibility
  919. if(!isset($tb->id) && isset($tb->code))
  920. $tb->id = $tb->code;
  921. if($tb->id == $item->type && isset($tb->trigger))
  922. {
  923. if(!is_array($tb->trigger))
  924. $tb->trigger = array($tb->trigger);
  925. foreach($block_trigger_types as $btt_key => $btt_val)
  926. {
  927. if(empty($btt_key) || in_array($btt_key, $tb->trigger))
  928. continue;
  929. unset($block_trigger_types[$btt_key]);
  930. }
  931. $block_trigger_types = array_filter($block_trigger_types);
  932. }
  933. }
  934. }
  935. $navibars->add_tab_content_row(array(
  936. '<label>'.t(160, 'Type').'</label>',
  937. $naviforms->selectfield('trigger-type-'.$lang,
  938. array_keys($block_trigger_types),
  939. array_values($block_trigger_types),
  940. $item->trigger['trigger-type'][$lang],
  941. "navigate_blocks_trigger_change('".$lang."', this);"
  942. )
  943. )
  944. );
  945. $navibars->add_tab_content_row(
  946. array(
  947. '<label>'.t(157, 'Image').'</label>',
  948. $naviforms->dropbox('trigger-image-'.$lang, @$item->trigger['trigger-image'][$lang], 'image')
  949. )
  950. );
  951. $navibars->add_tab_content_row(
  952. array(
  953. '<label>'.t(182, 'Rollover').' (off / on)</label>',
  954. $naviforms->dropbox('trigger-rollover-'.$lang, @$item->trigger['trigger-rollover'][$lang], 'image'),
  955. $naviforms->dropbox('trigger-rollover-active-'.$lang, @$item->trigger['trigger-rollover-active'][$lang], 'image'),
  956. ''
  957. )
  958. );
  959. $navibars->add_tab_content_row(
  960. array(
  961. '<label>'.t(272, 'Video').'</label>',
  962. $naviforms->dropbox('trigger-video-'.$lang, @$item->trigger['trigger-video'][$lang], 'video')
  963. )
  964. );
  965. $navibars->add_tab_content_row(
  966. array(
  967. '<label>Flash (SWF)</label>',
  968. $naviforms->dropbox('trigger-flash-'.$lang, @$item->trigger['trigger-flash'][$lang], 'flash'),
  969. ''
  970. )
  971. );
  972. /* links list */
  973. // check if navigate must show an icon selector
  974. $links_icons = '';
  975. if(!empty($theme) && !empty($theme->blocks))
  976. {
  977. foreach($theme->blocks as $tb)
  978. {
  979. if($item->type == $tb->id)
  980. {
  981. $links_icons = @$tb->icons;
  982. break;
  983. }
  984. }
  985. }
  986. $table = new naviorderedtable("trigger_links_table_".$lang);
  987. $table->setWidth("776px");
  988. $table->setHiddenInput("trigger-links-table-order-".$lang);
  989. $navibars->add_tab_content( $naviforms->hidden("trigger-links-table-order-".$lang, "") );
  990. $table->addHeaderColumn(t(242, 'Icon'), 50);
  991. $table->addHeaderColumn(t(67, 'Title'), 180);
  992. $table->addHeaderColumn(t(197, 'Link'), 390);
  993. $table->addHeaderColumn('<i class="fa fa-lg fa-fw fa-external-link" title="'.t(324, 'New window').'"></i>', 16);
  994. $table->addHeaderColumn('<i class="fa fa-lg fa-fw fa-globe" title="'.t(364, 'Access').'"></i>', 20);
  995. $table->addHeaderColumn(t(35, 'Remove'), 50);
  996. if(empty($item->trigger['trigger-links'][$lang]['link']))
  997. {
  998. // create a default entry
  999. $item->trigger['trigger-links'][$lang] = array(
  1000. 'order' => '',
  1001. 'icon' => '',
  1002. 'title' => array('0' => ''),
  1003. 'access' => array('0' => 0),
  1004. 'link' => array('0' => '')
  1005. );
  1006. }
  1007. if(!empty($item->trigger['trigger-links'][$lang]))
  1008. {
  1009. $tlinks = $item->trigger['trigger-links'][$lang];
  1010. foreach($tlinks['link'] as $key => $link)
  1011. {
  1012. $uid = uniqid();
  1013. $table->addRow(
  1014. uniqid('trigger-links-table-row-'),
  1015. array(
  1016. ( empty($links_icons)?
  1017. array('content' => '-', 'align' => 'center') :
  1018. array('content' => '<select name="trigger-links-table-icon-'.$lang.'['.$uid.']" data-select2-value="'.$tlinks['icon'][$key].'" data-role="icon" style="width: 190px;"></select>', 'align' => 'left')
  1019. ),
  1020. array('content' => '<input type="text" name="trigger-links-table-title-'.$lang.'['.$uid.']" value="'.$tlinks['title'][$key].'" data-role="title" style="width: 250px;" />', 'align' => 'left'),
  1021. array('content' => '<input type="text" name="trigger-links-table-link-'.$lang.'['.$uid.']" value="'.$tlinks['link'][$key].'" data-role="link" style="width: 260px;" />'.
  1022. '<a class="uibutton nv_block_nv_link_trigger"><i class="fa fa-sitemap"></i></a>',
  1023. 'align' => 'left',
  1024. 'style' => 'white-space: nowrap;'
  1025. ),
  1026. array('content' => '<input type="checkbox" name="trigger-links-table-new_window-'.$lang.'['.$uid.']" data-role="target" id="trigger-links-table-new_window-'.$lang.'['.$uid.']" value="1" '.($tlinks['new_window'][$key]=='1'? 'checked="checked"' : '').' />
  1027. <label for="trigger-links-table-new_window-'.$lang.'['.$uid.']" />',
  1028. 'align' => 'left'),
  1029. array('content' => '<input type="hidden" name="trigger-links-table-access-'.$lang.'['.$uid.']" data-role="access" id="trigger-links-table-access-'.$lang.'['.$uid.']" value="'.value_or_default($tlinks['access'][$key], 0).'" />
  1030. <i class="fa fa-fw fa-lg fa-eye '.($tlinks['access'][$key]=='1'? 'hidden' : '').'" onclick="navigate_blocks_trigger_links_table_row_access(this);" data-value="0" for="trigger-links-table-access-'.$lang.'['.$uid.']"></i>
  1031. <i class="fa fa-fw fa-lg fa-eye-slash '.($tlinks['access'][$key]=='1'? '' : 'hidden').'" onclick="navigate_blocks_trigger_links_table_row_access(this);" data-value="1" for="trigger-links-table-access-'.$lang.'['.$uid.']"></i>',
  1032. 'align' => 'center'),
  1033. array('content' => '<img src="'.NAVIGATE_URL.'/img/icons/silk/cancel.png" style="cursor: pointer;" onclick="navigate_blocks_trigger_links_table_row_remove(this);" />', 'align' => 'center')
  1034. )
  1035. );
  1036. }
  1037. }
  1038. $uid = uniqid();
  1039. $table->addRow(
  1040. "trigger-links-table-row-model-".$lang,
  1041. array(
  1042. ( empty($links_icons)?
  1043. array('content' => '-', 'align' => 'center') :
  1044. array('content' => '<select name="trigger-links-table-icon-'.$lang.'['.$uid.']" data-select2-value="" data-role="icon" style="width: 190px;"></select>', 'align' => 'left')
  1045. ),
  1046. array('content' => '<input type="text" name="trigger-links-table-title-'.$lang.'['.$uid.']" value="" data-role="title" style="width: 250px;" />', 'align' => 'left'),
  1047. array('content' => '<input type="text" name="trigger-links-table-link-'.$lang.'['.$uid.']" value="" data-role="link" style="width: 260px;" />'.
  1048. '<a class="uibutton nv_block_nv_link_trigger"><i class="fa fa-sitemap"></i></a>',
  1049. 'align' => 'left'
  1050. ),
  1051. array('content' => '<input type="checkbox" name="trigger-links-table-new_window-'.$lang.'['.$uid.']" data-role="target" id="trigger-links-table-new_window-'.$lang.'['.$uid.']" value="1" />
  1052. <label for="trigger-links-table-new_window-'.$lang.'['.$uid.']" />',
  1053. 'align' => 'left'),
  1054. array('content' => '<input type="hidden" name="trigger-links-table-access-'.$lang.'['.$uid.']" data-role="access" id="trigger-links-table-access-'.$lang.'['.$uid.']" value="0" />
  1055. <i class="fa fa-fw fa-lg fa-eye" onclick="navigate_blocks_trigger_links_table_row_visibility(this);" data-value="0" for="trigger-links-table-access-'.$lang.'['.$uid.']"></i>
  1056. <i class="fa fa-fw fa-lg fa-eye-slash hidden" onclick="navigate_blocks_trigger_links_table_row_visibility(this);" data-value="1" for="trigger-links-table-access-'.$lang.'['.$uid.']"></i>',
  1057. 'align' => 'center'),
  1058. array('content' => '<img src="'.NAVIGATE_URL.'/img/icons/silk/cancel.png" style="cursor: pointer;" onclick="navigate_blocks_trigger_links_table_row_remove(this);" />', 'align' => 'center')
  1059. )
  1060. );
  1061. $navibars->add_tab_content_row(
  1062. array(
  1063. '<label>'.t(549, "Links").'</label>',
  1064. '<div id="trigger-links-'.$lang.'">'.$table->generate().'</div>',
  1065. '<label>&nbsp;</label>',
  1066. '<button id="trigger-links-table-add-'.$lang.'" data-lang="'.$lang.'"><img src="img/icons/silk/add.png" align="absmiddle" style="cursor:pointer;" /> '.t(472, 'Add').'</button>'
  1067. )
  1068. );
  1069. $navibars->add_tab_content_row(
  1070. array(
  1071. '<label>HTML</label>',
  1072. $naviforms->scriptarea('trigger-html-'.$lang, @$item->trigger['trigger-html'][$lang]),
  1073. ''
  1074. )
  1075. );
  1076. $editor_width = "";
  1077. if(!empty($block_type_width))
  1078. {
  1079. if($block_type_width > 500)
  1080. $editor_width = $block_type_width.'px';
  1081. else
  1082. $editor_width = '500px';
  1083. }
  1084. $translate_menu = '';
  1085. if(!empty($translate_extensions))
  1086. {
  1087. $translate_extensions_titles = array();
  1088. $translate_extensions_actions = array();
  1089. foreach($translate_extensions as $te)
  1090. {
  1091. if($te['enabled']=='0') continue;
  1092. $translate_extensions_titles[] = $te['title'];
  1093. $translate_extensions_actions[] = 'javascript: navigate_tinymce_translate_'.$te['code'].'(\'trigger-content-'.$lang.'-'.$lang.'\', \''.$lang.'\');';
  1094. }
  1095. if(!empty($translate_extensions_actions))
  1096. {
  1097. $translate_menu = $naviforms->splitbutton(
  1098. 'translate_'.$lang,
  1099. '<img src="img/icons/silk/comment.png" align="absmiddle"> '.t(188, 'Translate'),
  1100. $translate_extensions_actions,
  1101. $translate_extensions_titles
  1102. );
  1103. }
  1104. }
  1105. $navibars->add_tab_content_row(
  1106. array(
  1107. '<label>'.t(9, "Content").'
  1108. <span class="editor_selector" for="trigger-content-'.$lang.'">'.
  1109. //'<i class="fa fa-border fa-fw fa-lg fa-th-large" data-action="composer" title="'.t(616, "Edit with NV Composer").'"></i> '.
  1110. '<i class="fa fa-border fa-fw fa-lg fa-file-text-o active" data-action="tinymce" title="'.t(614, "Edit with TinyMCE").'"></i> '.
  1111. '<i class="fa fa-border fa-fw fa-lg fa-code" data-action="html" title="'.t(615, "Edit as source code").'"></i> '.
  1112. '<i class="fa fa-border fa-fw fa-lg fa-eraser" data-action="clear" title="'.t(208, "Remove all content").'"></i>'.
  1113. '</span>'.
  1114. '</label>',
  1115. $naviforms->editorfield('trigger-content-'.$lang, @$item->trigger['trigger-content'][$lang], $editor_width, $lang),
  1116. '<div style="clear:both; margin-top:5px; float:left; margin-bottom: 10px;">',
  1117. '<label>&nbsp;</label>',
  1118. $translate_menu,
  1119. (!empty($theme->content_samples)? '<button onclick="navigate_blocks_copy_from_theme_samples(\'trigger-content-'.$lang.'\', \'trigger\', \''.$lang.'\', \''."tinymce".'\'); return false;"><img src="img/icons/silk/rainbow.png" align="absmiddle"> '.t(553, 'Fragments').' | '.$theme->title.'</button> ' : ''),
  1120. '</div>',
  1121. '<br />'
  1122. ),
  1123. '',
  1124. 'lang="'.$lang.'"'
  1125. );
  1126. $navibars->add_tab_content_row(
  1127. array(
  1128. '<label>'.t(172, 'Action').'</label>',
  1129. $naviforms->selectfield('action-type-'.$lang,
  1130. array(
  1131. 0 => '',
  1132. 1 => 'web',
  1133. 2 => 'web-n',
  1134. 3 => 'javascript',
  1135. 4 => 'file',
  1136. 5 => 'image'
  1137. ),
  1138. array(
  1139. 0 => t(183, 'Do nothing'),
  1140. 1 => t(173, 'Open URL'),
  1141. 2 => t(174, 'Open URL (new window)'),
  1142. 3 => 'Javascript',
  1143. 4 => t(175, 'Download file'),
  1144. 5 => t(176, 'View image')
  1145. ),
  1146. $item->action['action-type'][$lang],
  1147. "navigate_blocks_action_change('".$lang."', this);"
  1148. )
  1149. )
  1150. );
  1151. /* show/hide appropiate row type by action */
  1152. $selected_link_title = '';
  1153. if(!empty($item->action['action-web'][$lang]))
  1154. {
  1155. $path = explode('/', $item->action['action-web'][$lang]);
  1156. if(count($path) > 0 && $path[0]=='nv:')
  1157. {
  1158. if($path[2]=='structure')
  1159. {
  1160. $tmp = new structure();
  1161. $tmp->load($path[3]);
  1162. $selected_link_title = $tmp->dictionary[$lang]['title'];
  1163. $layout->add_script('
  1164. $(".nv_block_nv_link_info[data-lang='.$lang.']").find("img[data-type=structure]").removeClass("hidden");
  1165. ');
  1166. }
  1167. else if($path[2]=='element')
  1168. {
  1169. $tmp = new item();
  1170. $tmp->load($path[3]);
  1171. $selected_link_title = $tmp->dictionary[$lang]['title'];
  1172. $layout->add_script('
  1173. $(".nv_block_nv_link_info[data-lang='.$lang.']").find("img[data-type=element]").removeClass("hidden");
  1174. ');
  1175. }
  1176. }
  1177. }
  1178. $navibars->add_tab_content_row(
  1179. array(
  1180. '<label>'.t(184, 'Webpage').'</label>',
  1181. $naviforms->autocomplete('action-web-'.$lang, @$item->action['action-web'][$lang], '?fid=blocks&act=path'),
  1182. '<a class="uibutton nv_block_nv_link_trigger"><i class="fa fa-sitemap"></i></a>',
  1183. '<div class="subcomment nv_block_nv_link_info" data-lang="'.$lang.'">
  1184. <img src="img/icons/silk/sitemap_color.png" class="hidden" data-type="structure" sprite="false" />
  1185. <img src="img/icons/silk/page.png" class="hidden" data-type="element" sprite="false" /> '.
  1186. '<span>'.$selected_link_title.'</span>'.
  1187. '</div>'
  1188. )
  1189. );
  1190. $layout->add_script('
  1191. $("input[name=action-web-'.$lang.']").on("keydown", function()
  1192. {
  1193. var div_info = $(this).parent().find(".nv_block_nv_link_info");
  1194. $(div_info).find("span").text("");
  1195. $(div_info).find("img").addClass("hidden");
  1196. });
  1197. ');
  1198. $navibars->add_tab_content_row(
  1199. array(
  1200. '<label>Javascript</label>',
  1201. $naviforms->textfield('action-javascript-'.$lang, @$item->action['action-javascript'][$lang], NULL, "navigate_blocks_action_javascript_clean_quotes('action-javascript-".$lang."');"),
  1202. '<div class="subcomment"><img src="img/icons/silk/information.png" align="absmiddle" /> '.t(606, 'Double quotes not allowed, use single quotes only').'</div>'
  1203. )
  1204. );
  1205. $layout->add_script('
  1206. function navigate_blocks_action_javascript_clean_quotes(id)
  1207. {
  1208. var content = $("#" + id).val();
  1209. content = content.replace(\'"\', "\'");
  1210. $("#" + id).val(content);
  1211. }
  1212. ');
  1213. $navibars->add_tab_content_row(
  1214. array(
  1215. '<label>'.t(82, 'File').'</label>',
  1216. $naviforms->dropbox('action-file-'.$lang, @$item->action['action-file'][$lang]),
  1217. ''
  1218. )
  1219. );
  1220. $navibars->add_tab_content_row(
  1221. array(
  1222. '<label>'.t(157, 'Image').'</label>',
  1223. $naviforms->dropbox('action-image-'.$lang, @$item->action['action-image'][$lang], 'image'),
  1224. ''
  1225. )
  1226. );
  1227. // copy from other language
  1228. if(count($website->languages) > 1)
  1229. {
  1230. $block_copyfrom_titles = array();
  1231. $block_copyfrom_actions = array();
  1232. foreach($website->languages as $bcpl)
  1233. {
  1234. if($bcpl['language'] == $lang)
  1235. continue;
  1236. $block_copyfrom_titles[] = language::name_by_code($bcpl['language']);
  1237. $block_copyfrom_actions[] = 'javascript: navigate_blocks_copy_from_language(\''.$bcpl['language'].'\', \''.$lang.'\');';
  1238. }
  1239. $copy_from_menu = $naviforms->splitbutton(
  1240. 'block_copyfrom_'.$lang,
  1241. '<img src="img/icons/silk/comment.png" align="absmiddle"> '.t(189, 'Copy from').'...',
  1242. $block_copyfrom_actions,
  1243. $block_copyfrom_titles
  1244. );
  1245. $navibars->add_tab_content_row('<label>&nbsp;</label>'.$copy_from_menu);
  1246. }
  1247. $navibars->add_tab_content('</div>');
  1248. }
  1249. $layout->add_script('
  1250. function navigate_blocks_copy_from_language(from, to)
  1251. {
  1252. // copy title (if destination is empty)
  1253. if($("#title-" + to).val()=="")
  1254. $("#title-" + to).val($("#title-" + from).val());
  1255. // copy trigger type
  1256. $("#trigger-type-" + to)
  1257. .val($("#trigger-type-" + from).val())
  1258. .trigger("change");
  1259. // copy trigger value, depending on the trigger type
  1260. switch($("#trigger-type-" + to).val())
  1261. {
  1262. case "image":
  1263. navigate_dropbox_clone_value("trigger-image-" + from, "trigger-image-" + to);
  1264. break;
  1265. case "rollover":
  1266. navigate_dropbox_clone_value("trigger-rollover-" + from, "trigger-rollover-" + to);
  1267. navigate_dropbox_clone_value("trigger-rollover-active-" + from, "trigger-rollover-active-" + to);
  1268. break;
  1269. case "video":
  1270. navigate_dropbox_clone_value("trigger-video-" + from, "trigger-video-" + to);
  1271. break;
  1272. case "flash":
  1273. navigate_dropbox_clone_value("trigger-flash-" + from, "trigger-flash-" + to);
  1274. break;
  1275. case "html":
  1276. // ncid: navigate codemirror instance destination
  1277. // ncio: navigate codemirror instance destination
  1278. for(ncid in navigate_codemirror_instances)
  1279. {
  1280. if($(navigate_codemirror_instances[ncid].getTextArea()).attr("id") == "trigger-html-" + to)
  1281. {
  1282. for(ncio in navigate_codemirror_instances)
  1283. {
  1284. if($(navigate_codemirror_instances[ncio].getTextArea()).attr("id") == "trigger-html-" + from)
  1285. {
  1286. navigate_codemirror_instances[ncid].setValue(navigate_codemirror_instances[ncio].getValue());
  1287. }
  1288. }
  1289. }
  1290. }
  1291. $(navigate_codemirror_instances).each(function() { this.refresh(); } );
  1292. break;
  1293. case "links":
  1294. // remove previous links (if any)
  1295. $("#trigger-links-" + to).find("tr").not("#trigger-links-table-row-model-" + to).not(":first").remove();
  1296. // copy each link in the origin language
  1297. $("#trigger-links-" + from).find("tr").not("#trigger-links-table-row-model-" + from).not(":first").each(function()
  1298. {
  1299. // add a row
  1300. $("#trigger-links-table-add-" + to).trigger("click");
  1301. $(this).find("td").each(function(i)
  1302. {
  1303. if($(this).find(".select2-container").length > 0)
  1304. {
  1305. // select2 field
  1306. var input_name = $("#trigger_links_table_" + to).find("tr:visible:last").find("td").eq(i).find("select").attr("name");
  1307. var input_value = $(this).find("select").val();
  1308. if(input_name)
  1309. $("select[name=\""+input_name+"\"]").val(input_value).trigger("change");
  1310. }
  1311. else
  1312. {
  1313. // standard input or checkbox field
  1314. $("#trigger_links_table_" + to).find("tr:visible:last").find("td").eq(i).find("input").val($(this).find("input").val());
  1315. if($(this).find("input").attr("checked"))
  1316. $("#trigger_links_table_" + to).find("tr:visible:last").find("td").eq(i).find("input").attr("checked", "checked");
  1317. }
  1318. });
  1319. });
  1320. break;
  1321. case "content":
  1322. tinyMCE.get("trigger-content-" + to).setContent(
  1323. tinyMCE.get("trigger-content-" + from).getContent()
  1324. );
  1325. break;
  1326. case "title":
  1327. case "":
  1328. default:
  1329. // nothing to do
  1330. break;
  1331. }
  1332. // copy action type
  1333. $("#action-type-" + to)
  1334. .val($("#action-type-" + from).val())
  1335. .trigger("change");
  1336. // copy action value
  1337. switch($("#action-type-" + to).val())
  1338. {
  1339. case "web":
  1340. case "web-n":
  1341. $("#action-web-" + to).val($("#action-web-" + from).val());
  1342. break;
  1343. case "javascript":
  1344. $("#action-javascript-" + to).val($("#action-javascript-" + from).val());
  1345. break;
  1346. case "file":
  1347. navigate_dropbox_clone_value("action-file-" + from, "action-file-" + to);
  1348. break;
  1349. case "image":
  1350. navigate_dropbox_clone_value("action-image-" + from, "action-image-" + to);
  1351. break;
  1352. case "":
  1353. default:
  1354. // nothing to do
  1355. break;
  1356. }
  1357. }
  1358. ');
  1359. // right now, only fontawesome icon set is supported
  1360. $fontawesome_classes = '';
  1361. if($links_icons == 'fontawesome')
  1362. {
  1363. $fontawesome_classes = block::fontawesome_list();
  1364. $fontawesome_classes = array_map(
  1365. function($v)
  1366. {
  1367. $x = new stdClass();
  1368. $x->id = $v;
  1369. if(!empty($v))
  1370. $x->text = substr($v, 3);
  1371. return $x;
  1372. },
  1373. $fontawesome_classes
  1374. );
  1375. }
  1376. $layout->add_script('
  1377. var active_languages = ["'.implode('", "', array_keys($options)).'"];
  1378. navigate_items_select_language("'.$website->languages_list[0].'");
  1379. navigate_fontawesome_classes = '.json_encode($fontawesome_classes).';
  1380. ');
  1381. foreach($website->languages_list as $alang)
  1382. {
  1383. $layout->add_script('
  1384. $(window).on("load", function()
  1385. {
  1386. $("#trigger-type-'.$alang.'").val("'.$item->trigger['trigger-type'][$alang].'");
  1387. $("#action-type-'.$alang.'").val("'.$item->action['action-type'][$alang].'");
  1388. navigate_blocks_trigger_change("'.$alang.'", $("<input type=\"hidden\" value=\"'.$item->trigger['trigger-type'][$alang].'\" />"));
  1389. links_table_row_models["'.$alang.'"] = $("#trigger-links-table-row-model-'.$alang.'").html();
  1390. if($("#trigger_links_table_'.$alang.'").find("tr").not(".nodrag").length > 1)
  1391. $("#trigger-links-table-row-model-'.$alang.'").hide();
  1392. // prepare select2 to select icons
  1393. if('.($links_icons=='fontawesome'? 'true' : 'false').')
  1394. {
  1395. $("[id^=trigger_links_table_").find("tr").each(function(i, tr)
  1396. {
  1397. // do not apply select2 to head row
  1398. if(!$(tr).find("select"))
  1399. return;
  1400. // do not apply select2 to model row
  1401. if($(tr).attr("id") && ($(this).attr("id")).indexOf("table-row-model") > 0)
  1402. return;
  1403. navigate_blocks_trigger_links_table_icon_selector(tr);
  1404. });
  1405. }
  1406. });
  1407. ');
  1408. }
  1409. $layout->add_content('
  1410. <div id="navigate_blocks_copy_from_theme_samples" style=" display: none; ">
  1411. <div class="navigate-form-row">
  1412. <label>'.t(79, 'Template').'</label>
  1413. <select id="navigate_blocks_copy_from_theme_samples_options"
  1414. name="navigate_blocks_copy_from_theme_samples_options"
  1415. onchange="navigate_blocks_copy_from_theme_samples_preview(this.value, $(this).attr(\'type\'), $(this).find(\'option:selected\').attr(\'source\'));">
  1416. </select>
  1417. </div>
  1418. <div class="navigate-form-row">
  1419. <div id="navigate_blocks_copy_from_theme_samples_text"
  1420. name="navigate_blocks_copy_from_theme_samples_text"
  1421. style="border: 1px solid #CCCCCC; float: left; height: auto; min-height: 20px; overflow: auto; width: 97%; padding: 3px; background: #f7f7f7;">
  1422. </div>
  1423. <div id="navigate_blocks_copy_from_theme_samples_text_raw" style=" display: none; "></div>
  1424. </div>
  1425. </div>
  1426. ');
  1427. $layout->add_script('
  1428. var theme_content_samples = '.json_encode($theme->content_samples).';
  1429. var website_theme = "'.$website->theme.'";
  1430. ');
  1431. break;
  1432. }
  1433. if(!empty($item->type))
  1434. {
  1435. // we need to know if the block is defined in the active theme or in the database (numeric ID)
  1436. foreach($block_types as $bt)
  1437. {
  1438. // navigate 1.x compatibility
  1439. if(!isset($bt['id']) && isset($bt['code']))
  1440. $bt['id'] = $bt['code'];
  1441. if($bt['id'] == $item->type)
  1442. {
  1443. $block_type_id = $bt['id'];
  1444. break;
  1445. }
  1446. }
  1447. $properties_html = navigate_property_layout_form('block', $block_type_id, 'block', $item->id);
  1448. if(!empty($properties_html))
  1449. {
  1450. $navibars->add_tab(t(77, "Properties"));
  1451. $navibars->add_tab_content($properties_html);
  1452. }
  1453. }
  1454. $navibars->add_tab(t(336, "Display"));
  1455. $default_value = 1;
  1456. if(!empty($item->categories))
  1457. $default_value = 0;
  1458. else if(!empty($item->exclusions))
  1459. $default_value = 2;
  1460. $navibars->add_tab_content_row(array(
  1461. '<label>'.t(330, 'Categories').'</label>',
  1462. $naviforms->buttonset(
  1463. 'all_categories',
  1464. array(
  1465. '1' => t(396, 'All categories'),
  1466. '0' => t(405, 'Selection'),
  1467. '2' => t(552, 'Exclusions')
  1468. ),
  1469. $default_value
  1470. )
  1471. ));
  1472. $hierarchy = structure::hierarchy(0);
  1473. $categories_list = structure::hierarchyList($hierarchy, $item->categories);
  1474. $exclusions_list = structure::hierarchyList($hierarchy, $item->exclusions);
  1475. $navibars->add_tab_content_row(
  1476. array(
  1477. '<label>&nbsp;</label>',
  1478. '<div class="category_tree" id="category-tree-parent">
  1479. <img src="img/icons/silk/world.png" align="absmiddle" /> '.$website->name.
  1480. '<div class="tree_ul">'.$categories_list.'</div>'.
  1481. '</div>'
  1482. )
  1483. );
  1484. $navibars->add_tab_content_row(
  1485. array(
  1486. '<label>&nbsp;</label>',
  1487. '<div class="category_tree" id="exclusions-tree-parent">
  1488. <img src="img/icons/silk/world.png" align="absmiddle" /> '.$website->name.
  1489. '<div class="tree_ul">'.$exclusions_list.'</div>'.
  1490. '</div>'
  1491. )
  1492. );
  1493. if(!is_array($item->categories))
  1494. $item->categories = array();
  1495. if(!is_array($item->exclusions))
  1496. $item->exclusions = array();
  1497. $navibars->add_tab_content($naviforms->hidden('categories', implode(',', $item->categories)));
  1498. $navibars->add_tab_content($naviforms->hidden('exclusions', implode(',', $item->exclusions)));
  1499. $elements_display = "all";
  1500. if(!empty($item->elements['exclusions']))
  1501. $elements_display = "exclusions";
  1502. else if(!empty($item->elements['selection']))
  1503. $elements_display = "selection";
  1504. $navibars->add_tab_content_row(array(
  1505. '<label>'.t(22, 'Elements').' '.t(428, '(no category)').'</label>',
  1506. $naviforms->buttonset(
  1507. 'elements_display',
  1508. array(
  1509. 'all' => t(443, 'All'),
  1510. 'selection' => t(405, 'Selection'),
  1511. 'exclusions' => t(552, 'Exclusions')
  1512. ),
  1513. $elements_display,
  1514. "navigate_blocks_elements_display_change(this)"
  1515. )
  1516. ));
  1517. $layout->add_script('
  1518. function navigate_blocks_elements_display_change(el)
  1519. {
  1520. el = $(el).prev();
  1521. if($(el).val()=="all")
  1522. $("#elements_selection_wrapper").hide();
  1523. else
  1524. $("#elements_selection_wrapper").show();
  1525. }
  1526. navigate_blocks_elements_display_change($("label[for=elements_display_'.$elements_display.']"));
  1527. ');
  1528. if(!is_array($item->elements))
  1529. $item->elements = array();
  1530. $items_ids = array_values($item->elements);
  1531. $items_ids = $items_ids[0];
  1532. if(empty($items_ids))
  1533. $items_ids = array();
  1534. $items_titles = array();
  1535. for($i=0; $i < count($items_ids); $i++)
  1536. {
  1537. $item_title = $DB->query_single(
  1538. 'text',
  1539. 'nv_webdictionary',
  1540. ' node_type = "item" AND
  1541. website = "'.$website->id.'" AND
  1542. node_id = "'.$items_ids[$i].'" AND
  1543. subtype = "title" AND
  1544. lang = "'.$website->languages_published[0].'"'
  1545. );
  1546. $items_titles[$i] = $item_title;
  1547. }
  1548. $navibars->add_tab_content_row(
  1549. array(
  1550. '<label>&nbsp;</label>',
  1551. $naviforms->selectfield("elements_selection", $items_ids, $items_titles, $items_ids, null, true, null, null, false)
  1552. ),
  1553. "elements_selection_wrapper"
  1554. );
  1555. $layout->add_script('
  1556. $("#elements_selection").select2({
  1557. placeholder: "'.t(533, "Find element by title").'",
  1558. minimumInputLength: 1,
  1559. ajax: {
  1560. url: "'.NAVIGATE_URL.'/'.NAVIGATE_MAIN.'?fid=items&act=json_find_item",
  1561. dataType: "json",
  1562. delay: 100,
  1563. data: function(params)
  1564. {
  1565. return {
  1566. title: params.term,
  1567. //association: "free",
  1568. embedding: 0,
  1569. nd: new Date().getTime(),
  1570. page_limit: 30, // page size
  1571. page: params.page // page number
  1572. };
  1573. },
  1574. processResults: function (data, params)
  1575. {
  1576. params.page = params.page || 1;
  1577. return {
  1578. results: data.items,
  1579. pagination: { more: (params.page * 30) < data.total_count }
  1580. };
  1581. }
  1582. },
  1583. templateSelection: function(row)
  1584. {
  1585. if(row.id)
  1586. return row.text + " <helper style=\'opacity: .5;\'>#" + row.id + "</helper>";
  1587. else
  1588. return row.text;
  1589. },
  1590. escapeMarkup: function (markup) { return markup; }, // let our custom formatter work
  1591. triggerChange: true
  1592. });
  1593. $("#elements_selection_wrapper").find(".select2-search__field").css("width", "408px");
  1594. $("#elements_selection_wrapper").find("li.select2-search").css("width", "auto");
  1595. ');
  1596. if(!empty($item->type))
  1597. {
  1598. $navibars->add_tab(t(171, 'Order')); // order blocs of the same type
  1599. $DB->query('SELECT b.id as id, d.text as title, b.fixed as fixed
  1600. FROM nv_blocks b, nv_webdictionary d
  1601. WHERE b.type = "'.$item->type.'"
  1602. AND d.node_type = "block"
  1603. AND d.subtype = "title"
  1604. AND d.lang = "'.$website->languages_list[0].'"
  1605. AND d.node_id = b.id
  1606. AND d.website = '.$website->id.'
  1607. AND b.website = '.$website->id.'
  1608. ORDER BY b.position ASC');
  1609. $block_ids = $DB->result('id');
  1610. $blocks = $DB->result();
  1611. $navibars->add_tab_content($naviforms->hidden('blocks-order', implode('#', $block_ids)));
  1612. $table = new naviorderedtable("blocks_order_table");
  1613. $table->setWidth("408px");
  1614. $table->setHiddenInput("blocks-order");
  1615. $table->addHeaderColumn('ID', 50);
  1616. $table->addHeaderColumn(t(67, 'Title'), 350);
  1617. $table->addHeaderColumn('<div style=" text-align: center; ">'.t(394, 'Fixed').'</div>', 50);
  1618. foreach($blocks as $block)
  1619. {
  1620. $table->addRow($block->id, array(
  1621. array('content' => $block->id, 'align' => 'left'),
  1622. array('content' => $block->title, 'align' => 'left'),
  1623. array('content' => '<span class="checkbox-wrapper">
  1624. <input type="checkbox" name="blocks-order-fixed['.$block->id.']" id="blocks-order-fixed['.$block->id.']" value="1" '.(($block->fixed=='1')? 'checked="checked"' : '').' />
  1625. <label for="blocks-order-fixed['.$block->id.']" />
  1626. </span>',
  1627. 'align' => 'center'
  1628. )
  1629. ));
  1630. }
  1631. $navibars->add_tab_content_row(
  1632. array(
  1633. '<label>'.t(23, 'Blocks').'</label>',
  1634. '<div>'.$table->generate().'</div>',
  1635. '<div class="subcomment"><img src="img/icons/silk/information.png" align="absmiddle" /> '.t(72, 'Drag any row to assign priorities').'</div>',
  1636. '<div class="subcomment"><span class="ui-icon ui-icon-lightbulb" style=" float: left; margin-right: 4px; "></span> '.t(395, '"Fixed" assigns a static position when the order is random').'</div>'
  1637. )
  1638. );
  1639. }
  1640. return $navibars->generate();
  1641. }
  1642. function blocks_types_list()
  1643. {
  1644. global $user;
  1645. global $DB;
  1646. global $website;
  1647. global $events;
  1648. $navibars = new navibars();
  1649. $navitable = new navitable('blocks_types_list');
  1650. $navibars->title(t(23, 'Blocks').' / '.t(167, 'Types'));
  1651. $group_blocks_links = array();
  1652. list($bg_rs, $bg_total) = block_group::paginated_list(0, 10, 'title', 'desc');
  1653. if($bg_total > 0 && $bg_total <= 10)
  1654. {
  1655. foreach($bg_rs as $bg)
  1656. $group_blocks_links[] = '<a href="?fid=blocks&act=block_group_edit&id='.$bg['id'].'"><i class="fa fa-fw fa-caret-right"></i> '.$bg['title'].'</a>';
  1657. $events->add_actions(
  1658. 'blocks',
  1659. array(
  1660. 'item' => null,
  1661. 'navibars' => &$navibars
  1662. ),
  1663. $group_blocks_links,
  1664. '<a class="content-actions-submenu-trigger" href="?fid=blocks&act=block_groups_list"><img height="16" align="absmiddle" width="16" src="img/icons/silk/bricks.png"> '.t(506, 'Groups').' &#9662;</a>'
  1665. );
  1666. }
  1667. $navibars->add_actions(
  1668. array(
  1669. '<a href="?fid=blocks&act=list"><img height="16" align="absmiddle" width="16" src="img/icons/silk/brick.png"> '.t(23, 'Blocks').'</a>',
  1670. (!empty($group_blocks_links)? '' : '<a href="?fid=blocks&act=block_groups_list"><img height="16" align="absmiddle" width="16" src="img/icons/silk/bricks.png"> '.t(506, 'Groups').'</a>')
  1671. )
  1672. );
  1673. $navibars->add_actions(
  1674. array(
  1675. ($user->permission("items.create") == 'true'?
  1676. '<a href="?fid=blocks&act=block_type_edit"><img height="16" align="absmiddle" width="16" src="img/icons/silk/add.png"> '.t(38, 'Create').'</a>'
  1677. : ''),
  1678. '<a href="?fid=blocks&act=block_types_list"><img height="16" align="absmiddle" width="16" src="img/icons/silk/application_view_list.png"> '.t(39, 'List').'</a>'
  1679. )
  1680. );
  1681. $navitable->setURL('?fid=blocks&act=block_types_json');
  1682. $navitable->sortBy('id');
  1683. $navitable->setDataIndex('id');
  1684. $navitable->setEditUrl('id', '?fid=blocks&act=block_type_edit&id=');
  1685. $navitable->addCol("ID", 'id', "80", "true", "left");
  1686. $navitable->addCol(t(491, 'Class'), 'type', "80", "true", "left");
  1687. $navitable->addCol(t(237, 'Code'), 'code', "120", "true", "left");
  1688. $navitable->addCol(t(67, 'Title'), 'title', "200", "true", "left");
  1689. $navitable->addCol(t(155, 'Width').' (px)', 'width', "80", "true", "left");
  1690. $navitable->addCol(t(156, 'Height').' (px)', 'height', "80", "true", "left");
  1691. $navibars->add_content($navitable->generate());
  1692. return $navibars->generate();
  1693. }
  1694. function blocks_type_form($item)
  1695. {
  1696. global $user;
  1697. global $DB;
  1698. global $website;
  1699. global $layout;
  1700. global $events;
  1701. $navibars = new navibars();
  1702. $naviforms = new naviforms();
  1703. if(empty($item['id']))
  1704. $navibars->title(t(23, 'Blocks').' / '.t(167, 'Types').' / '.t(38, 'Create'));
  1705. else
  1706. $navibars->title(t(23, 'Blocks').' / '.t(167, 'Types').' / '.t(170, 'Edit').' ['.$item['id'].']');
  1707. $readonly = false;
  1708. if(empty($item['id']))
  1709. {
  1710. $navibars->add_actions(
  1711. array( '<a href="#" onclick="$(\'#navigate-content\').find(\'form\').eq(0).submit();"><img height="16" align="absmiddle" width="16" src="img/icons/silk/accept.png"> '.t(34, 'Save').'</a>' )
  1712. );
  1713. }
  1714. else if(!empty($item['id']) && !is_numeric($item['id']))
  1715. {
  1716. $layout->navigate_notification(t(432, "Read only mode"), false, true);
  1717. $readonly = true;
  1718. }
  1719. else
  1720. {
  1721. $navibars->add_actions(
  1722. array(
  1723. '<a href="#" onclick="$(\'#navigate-content\').find(\'form\').eq(0).submit();"><img height="16" align="absmiddle" width="16" src="img/icons/silk/accept.png"> '.t(34, 'Save').'</a>',
  1724. '<a href="#" onclick="navigate_delete_dialog();"><img height="16" align="absmiddle" width="16" src="img/icons/silk/cancel.png"> '.t(35, 'Delete').'</a>'
  1725. )
  1726. );
  1727. $layout->add_script('
  1728. function navigate_delete_dialog()
  1729. {
  1730. navigate_confirmation_dialog(
  1731. function() { window.location.href = "?fid=blocks&act=block_type_delete&id='.$item['id'].'"; },
  1732. null, null, "'.t(35, 'Delete').'"
  1733. );
  1734. }
  1735. ');
  1736. }
  1737. $group_blocks_links = array();
  1738. list($bg_rs, $bg_total) = block_group::paginated_list(0, 10, 'title', 'desc');
  1739. if($bg_total > 0 && $bg_total <= 10)
  1740. {
  1741. foreach($bg_rs as $bg)
  1742. $group_blocks_links[] = '<a href="?fid=blocks&act=block_group_edit&id='.$bg['id'].'"><i class="fa fa-fw fa-caret-right"></i> '.$bg['title'].'</a>';
  1743. $events->add_actions(
  1744. 'blocks',
  1745. array(
  1746. 'item' => null,
  1747. 'navibars' => &$navibars
  1748. ),
  1749. $group_blocks_links,
  1750. '<a class="content-actions-submenu-trigger" href="?fid=blocks&act=block_groups_list"><img height="16" align="absmiddle" width="16" src="img/icons/silk/bricks.png"> '.t(506, 'Groups').' &#9662;</a>'
  1751. );
  1752. }
  1753. $navibars->add_actions(
  1754. array(
  1755. '<a href="?fid=blocks&act=list"><img height="16" align="absmiddle" width="16" src="img/icons/silk/brick.png"> '.t(23, 'Blocks').'</a>',
  1756. (!empty($group_blocks_links)? '' : '<a href="?fid=blocks&act=block_groups_list"><img height="16" align="absmiddle" width="16" src="img/icons/silk/bricks.png"> '.t(506, 'Groups').'</a>')
  1757. )
  1758. );
  1759. $navibars->add_actions(
  1760. array(
  1761. (!empty($item->id)? '<a href="?fid=blocks&act=block_type_edit"><img height="16" align="absmiddle" width="16" src="img/icons/silk/add.png"> '.t(38, 'Create').'</a>' : ''),
  1762. '<a href="?fid=blocks&act=block_types_list"><img height="16" align="absmiddle" width="16" src="img/icons/silk/application_view_list.png"> '.t(39, 'List').'</a>'
  1763. )
  1764. );
  1765. $navibars->form();
  1766. $navibars->add_tab(t(43, "Main"));
  1767. $navibars->add_tab_content($naviforms->hidden('form-sent', 'true'));
  1768. $navibars->add_tab_content($naviforms->hidden('id', $item['id']));
  1769. $navibars->add_tab_content_row(array( '<label>ID</label>',
  1770. '<span>'.(!empty($item['id'])? $item['id'] : t(52, '(new)')).'</span>' ));
  1771. // TODO: in Navigate CMS 2.0+ add several block types (p.e. Ad (Google adsense, ...), Map (Bing, Yahoo, Google, ...))
  1772. $block_modes = block::modes();
  1773. $navibars->add_tab_content_row(
  1774. array(
  1775. '<label>'.t(491, 'Class').'</label>',
  1776. $naviforms->selectfield('type',
  1777. array_keys($block_modes),
  1778. array_values($block_modes),
  1779. $item['type'],
  1780. '',
  1781. false
  1782. )
  1783. )
  1784. );
  1785. $navibars->add_tab_content_row(
  1786. array(
  1787. '<label>'.t(67, 'Title').'</label>',
  1788. $naviforms->textfield('title', $item['title'])
  1789. )
  1790. );
  1791. $navibars->add_tab_content_row(
  1792. array(
  1793. '<label>'.t(237, 'Code').'</label>',
  1794. $naviforms->textfield('code', $item['code']),
  1795. '<div class="subcomment">
  1796. <span style=" float: left; margin-left: -3px; " class="ui-icon ui-icon-lightbulb"></span>'.
  1797. t(436, 'Used as a class in HTML elements').
  1798. '</div>'
  1799. )
  1800. );
  1801. $navibars->add_tab_content_row(
  1802. array(
  1803. '<label>'.t(168, 'Notes').'</label>',
  1804. $naviforms->textarea('notes', $item['notes'])
  1805. )
  1806. );
  1807. $navibars->add_tab(t(145, "Size").' & '.t(438, "Order"));
  1808. $navibars->add_tab_content_row(
  1809. array(
  1810. '<label>'.t(155, 'Width').'<sup>*</sup></label>',
  1811. $naviforms->textfield('width', $item['width']),
  1812. 'px'
  1813. )
  1814. );
  1815. $navibars->add_tab_content_row(
  1816. array(
  1817. '<label>'.t(156, 'Height').'<sup>*</sup></label>',
  1818. $naviforms->textfield('height', $item['height']),
  1819. 'px'
  1820. )
  1821. );
  1822. $navibars->add_tab_content_row(
  1823. array(
  1824. '<div class="subcomment italic">* '.t(169, 'You can leave blank a field to not limit the size').'</div>'
  1825. )
  1826. );
  1827. $navibars->add_tab_content_row(
  1828. array(
  1829. '<label>&nbsp;</label>',
  1830. '<a id="wikipedia_web_banner_entry" class="italic" href="http://en.wikipedia.org/wiki/Web_banner" target="_blank"><span class="ui-icon ui-icon-info" style=" float: left;"></span> '.t(393, 'Standard banner sizes').' (Wikipedia)</a>'
  1831. )
  1832. );
  1833. $navibars->add_tab_content_row(
  1834. array(
  1835. '<label>'.t(404, 'Order by').'</label>',
  1836. $naviforms->selectfield(
  1837. 'order',
  1838. array(
  1839. 'theme',
  1840. 'priority',
  1841. 'random'
  1842. ),
  1843. array(
  1844. t('368', 'Theme'),
  1845. t('66', 'Priority'),
  1846. t('399', 'Random')
  1847. ),
  1848. $item['order']
  1849. )
  1850. )
  1851. );
  1852. $navibars->add_tab_content_row(
  1853. array(
  1854. '<label>'.t(397, 'Maximum').'</label>',
  1855. $naviforms->textfield('maximum', $item['maximum']),
  1856. '<div class="subcomment"><span class="ui-icon ui-icon-lightbulb" style=" float: left; margin-left: -3px; "></span> '.t(400, 'Enter 0 to display all').'</div>'
  1857. )
  1858. );
  1859. $layout->add_script('
  1860. function navigate_blocks_code_generate(el)
  1861. {
  1862. if($("#code").val()!="")
  1863. return;
  1864. var title = $("#title").val();
  1865. title = title.replace(/([\'"“”«»?:\+\&!¿#\\\\])/g, "");
  1866. title = title.replace(/[.\s]+/g, navigate["word_separator"]);
  1867. $("#code").val(title.toLowerCase());
  1868. }
  1869. $("#code").on("focus", function()
  1870. {
  1871. if($(this).val() == "")
  1872. navigate_blocks_code_generate();
  1873. });
  1874. '
  1875. );
  1876. if(!empty($item['id']))
  1877. {
  1878. $navibars->add_tab(t(77, "Properties"));
  1879. $table = new naviorderedtable("block_properties_table");
  1880. $table->setWidth("550px");
  1881. $table->setHiddenInput("block-properties-order");
  1882. $table->setDblclickCallback("navigate_block_edit_property");
  1883. $navibars->add_tab_content( $naviforms->hidden('block-properties-order', "") );
  1884. $table->addHeaderColumn(t(159, 'Name'), 350, true);
  1885. $table->addHeaderColumn(t(160, 'Type'), 150);
  1886. $table->addHeaderColumn(t(65, 'Enabled'), 50);
  1887. $properties = property::elements($item['id'], 'block');
  1888. $types = property::types();
  1889. for($p=0; $p < count($properties); $p++)
  1890. {
  1891. $table->addRow($properties[$p]->id, array(
  1892. array('content' => $properties[$p]->name, 'align' => 'left'),
  1893. array('content' => $types[$properties[$p]->type], 'align' => 'left'),
  1894. array('content' => '<input type="checkbox" name="property-enabled[]" value="'.$properties[$p]->id.'" disabled="disabled" id="block-type-property-enabled-'.$properties[$p]->id.'" '.(($properties[$p]->enabled=='1'? ' checked=checked ' : '')).' />
  1895. <label for="block-type-property-enabled-'.$properties[$p]->id.'"></label>',
  1896. 'align' => 'center'),
  1897. ));
  1898. }
  1899. if($readonly)
  1900. {
  1901. $navibars->add_tab_content_row(array( '<label>'.t(77, 'Properties').'</label>',
  1902. '<div>'.$table->generate().'</div>'));
  1903. }
  1904. else
  1905. {
  1906. $navibars->add_tab_content_row(array( '<label>'.t(77, 'Properties').'</label>',
  1907. '<div>'.$table->generate().'</div>',
  1908. '<div class="subcomment">
  1909. <img src="img/icons/silk/information.png" align="absmiddle" /> '.t(72, 'Drag any row to assign priorities').'.
  1910. '.t(192, 'Double click any row to edit').'
  1911. </div>' ));
  1912. $navibars->add_tab_content_row(array( '<label>&nbsp;</label>',
  1913. '<button id="block-properties-create"><img src="img/icons/silk/add.png" align="absmiddle" /> '.t(38, 'Create').'</button>'));
  1914. }
  1915. $navibars->add_content('
  1916. <form id="block-properties-edit-dialog" style="display: none;">
  1917. <div class="navigate-form-row">
  1918. <label>ID</label>
  1919. <span id="property-id-span">'.t(52, '(new)').'</span>
  1920. '.$naviforms->hidden('property-id', '').'
  1921. '.$naviforms->hidden('property-template', $item->id).'
  1922. '.$naviforms->hidden('property-element', "block").'
  1923. </div>
  1924. <div class="navigate-form-row">
  1925. <label>'.t(67, 'Title').'</label>
  1926. '.$naviforms->textfield('property-name', '').'
  1927. </div>
  1928. <div class="navigate-form-row">
  1929. <label>'.t(160, 'Type').'</label>
  1930. '.$naviforms->selectfield(
  1931. 'property-type',
  1932. array_keys($types),
  1933. array_values($types),
  1934. 'value',
  1935. 'navigate_block_property_type_change()'
  1936. ).'
  1937. </div>
  1938. <div class="navigate-form-row">
  1939. <label>'.t(200, 'Options').'</label>
  1940. '.$naviforms->textarea('property-options', '').'
  1941. <div class="subcomment">
  1942. '.t(201, 'One line per option, formatted like this: value#title').'
  1943. </div>
  1944. </div>
  1945. <div class="navigate-form-row">
  1946. <label>'.t(199, 'Default value').'</label>
  1947. '.$naviforms->textfield('property-dvalue', '').'
  1948. <div class="subcomment">
  1949. <span id="property-comment-boolean">'.t(426, 'Enter "1" for true, "0" for false').'</span>
  1950. <span id="property-comment-option">'.t(202, 'Enter only the value').'</span>
  1951. <span id="property-comment-moption">'.t(212, 'Enter the selected values separated by commas').': 3,5,8</span>
  1952. <span id="property-comment-text">'.t(203, 'Same value for all languages').'</span>
  1953. <span id="property-comment-rating">'.t(223, 'Default is 5 stars, if you want a different number: default_value#number_of_stars').' 5#10</span>
  1954. <span id="property-comment-date">'.t(50, 'Date format').': '.date($user->date_format).'</span>
  1955. <span id="property-comment-color">'.t(442, 'Hexadecimal color code').': #ffffff</span>
  1956. <span id="property-comment-country">'.t(225, 'Alpha-2 country code').' (es, us, uk...)</span>
  1957. <span id="property-comment-file">'.t(204, 'ID of the file').'</span>
  1958. <span id="property-comment-coordinates">'.t(298, 'Latitude').'#'.t(299, 'Longitude').': 40.689231#-74.044505</span>
  1959. </div>
  1960. </div>
  1961. <div class="navigate-form-row">
  1962. <label>'.t(65, 'Enabled').'</label>
  1963. '.$naviforms->checkbox('property-enabled', 1).'
  1964. </div>
  1965. </form>');
  1966. $layout->add_script('
  1967. $("#block-properties-create").bind("click", function()
  1968. {
  1969. navigate_block_edit_property();
  1970. return false;
  1971. });
  1972. function navigate_block_edit_property(el)
  1973. {
  1974. if(!el) // new property
  1975. {
  1976. $("#property-id").val("");
  1977. $("#property-id-span").html("'.t(52, '(new)').'");
  1978. $("#property-template").val("'.$item['id'].'");
  1979. $("#property-name").val("");
  1980. $("#property-type").val("value");
  1981. $("#property-element").val("block");
  1982. $("#property-options").val("");
  1983. $("#property-dvalue").val("");
  1984. $("#property-enabled").attr("checked", "checked");
  1985. }
  1986. else
  1987. {
  1988. $.ajax({
  1989. type: "GET",
  1990. async: false,
  1991. dateType: "json",
  1992. url: "'.NAVIGATE_URL.'/'.NAVIGATE_MAIN.'?fid=blocks&act=block_property_load&block='.$item->id.'&id=" + $(el).attr("id"),
  1993. success: function(data)
  1994. {
  1995. $("#property-id-span").html(data.id);
  1996. $("#property-id").val(data.id);
  1997. $("#property-template").val(data.template);
  1998. $("#property-name").val(data.name);
  1999. $("#property-type").val(data.type);
  2000. $("#property-element").val("block");
  2001. $("#property-options").val(data.options);
  2002. $("#property-dvalue").val(data.dvalue);
  2003. if(data.enabled=="1")
  2004. $("#property-enabled").attr("checked", "checked");
  2005. else
  2006. $("#property-enabled").removeAttr("checked");
  2007. var options = "";
  2008. for(var o in data.options)
  2009. {
  2010. options += o + "#" + data.options[o] + "\n";
  2011. }
  2012. $("#property-options").val(options);
  2013. }
  2014. });
  2015. }
  2016. navigate_block_property_type_change();
  2017. if('.($readonly? 'true' : 'false').')
  2018. {
  2019. $("#block-properties-edit-dialog").dialog(
  2020. {
  2021. title: \'<img src="img/icons/silk/pencil.png" align="absmiddle" /> '.t(170, 'Edit').'\',
  2022. resizable: true,
  2023. height: 360,
  2024. width: 650,
  2025. modal: true,
  2026. });
  2027. }
  2028. else // show dialog with action buttons
  2029. {
  2030. $("#block-properties-edit-dialog").dialog(
  2031. {
  2032. title: \'<img src="img/icons/silk/pencil.png" align="absmiddle" /> '.t(170, 'Edit').'\',
  2033. resizable: true,
  2034. height: 410,
  2035. width: 650,
  2036. modal: true,
  2037. buttons: {
  2038. "'.t(58, 'Cancel').'": function() {
  2039. $(this).dialog("close");
  2040. },
  2041. "'.t(35, 'Delete').'": function() {
  2042. $.ajax({
  2043. type: "POST",
  2044. async: false,
  2045. dateType: "text",
  2046. url: "'.NAVIGATE_URL.'/'.NAVIGATE_MAIN.'?fid=blocks&act=block_property_remove",
  2047. data: $("#block-properties-edit-dialog").serialize(),
  2048. success: function(msg)
  2049. {
  2050. $("#block_properties_table").find("#" + $("#property-id").val()).remove();
  2051. navigate_naviorderedtable_block_properties_table_reorder();
  2052. $("#block-properties-edit-dialog").dialog("close");
  2053. }
  2054. });
  2055. },
  2056. "'.t(190, 'Ok').'": function()
  2057. {
  2058. $.ajax({
  2059. type: "POST",
  2060. async: false,
  2061. dateType: "text",
  2062. url: "'.NAVIGATE_URL.'/'.NAVIGATE_MAIN.'?fid=blocks&act=block_property_save",
  2063. data: $("#block-properties-edit-dialog").serialize(),
  2064. success: function(data)
  2065. {
  2066. if($("#property-id").val() > 0)
  2067. {
  2068. // update
  2069. var tr = $("#block_properties_table").find("#" + $("#property-id").val());
  2070. tr.find("td").eq(0).html(data.name);
  2071. tr.find("td").eq(1).html(data.type_text);
  2072. tr.find("input[type=checkbox]").attr("checked", (data.enabled==1));
  2073. }
  2074. else
  2075. {
  2076. // insert
  2077. var checked = "";
  2078. if(data.enabled) checked = \' checked="checked" \';
  2079. var tr = \'<tr id="\'+data.id+\'"><td>\'+data.name+\'</td><td>\'+data.type_text+\'</td><td align="center"><input name="property-enabled[]" id="block-type-property-enabled-\'+data.id+\'" type="checkbox" disabled="disabled" value="\'+data.id+\'" \'+checked+\' /><label for="block-type-property-enabled-\'+data.id+\'"></label></td></tr>\';
  2080. $("#block_properties_table").find("tbody:last").append(tr);
  2081. $("#block_properties_table").find("tr:last").on("dblclick", function() { navigate_block_edit_property(this); });
  2082. $("#block_properties_table").tableDnD(
  2083. {
  2084. onDrop: function(table, row)
  2085. { navigate_naviorderedtable_block_properties_table_reorder(); }
  2086. });
  2087. }
  2088. navigate_naviorderedtable_block_properties_table_reorder();
  2089. $("#block-properties-edit-dialog").dialog("close");
  2090. }
  2091. });
  2092. }
  2093. }
  2094. });
  2095. }
  2096. }
  2097. function navigate_block_property_type_change()
  2098. {
  2099. $("#property-options").parent().hide();
  2100. $("#property-dvalue").next().find("span").hide();
  2101. switch($("#property-type").val())
  2102. {
  2103. case "option":
  2104. $("#property-options").parent().show();
  2105. $("#property-comment-option").show();
  2106. break;
  2107. case "moption":
  2108. $("#property-options").parent().show();
  2109. $("#property-comment-moption").show();
  2110. break;
  2111. case "text":
  2112. case "textarea":
  2113. case "link":
  2114. $("#property-comment-text").show();
  2115. break;
  2116. case "date":
  2117. case "datetime":
  2118. $("#property-comment-date").show();
  2119. break;
  2120. case "image":
  2121. case "file":
  2122. $("#property-comment-file").show();
  2123. break;
  2124. case "rating":
  2125. $("#property-comment-rating").show();
  2126. break;
  2127. case "color":
  2128. $("#property-comment-color").show();
  2129. break;
  2130. case "coordinates":
  2131. $("#property-comment-coordinates").show();
  2132. break;
  2133. case "country":
  2134. $("#property-comment-country").show();
  2135. break;
  2136. case "boolean":
  2137. $("#property-comment-boolean").show();
  2138. break;
  2139. case "comment":
  2140. case "value":
  2141. default:
  2142. }
  2143. }
  2144. navigate_naviorderedtable_block_properties_table_reorder();
  2145. ');
  2146. }
  2147. return $navibars->generate();
  2148. }
  2149. function block_groups_list()
  2150. {
  2151. global $user;
  2152. global $DB;
  2153. global $website;
  2154. $navibars = new navibars();
  2155. $navitable = new navitable('block_groups_list');
  2156. $navibars->title(t(23, 'Blocks').' / '.t(506, 'Groups'));
  2157. $navibars->add_actions(
  2158. array(
  2159. '<a href="?fid=blocks&act=list"><img height="16" align="absmiddle" width="16" src="img/icons/silk/brick.png"> '.t(23, 'Blocks').'</a>',
  2160. '<a href="?fid=blocks&act=block_types_list"><img height="16" align="absmiddle" width="16" src="img/icons/silk/brick_edit.png"> '.t(167, 'Types').'</a>'
  2161. )
  2162. );
  2163. $navibars->add_actions( array(
  2164. '<a href="?fid=blocks&act=block_group_edit"><img height="16" align="absmiddle" width="16" src="img/icons/silk/add.png"> '.t(38, 'Create').'</a>',
  2165. '<a href="?fid=blocks&act=block_groups_list"><img height="16" align="absmiddle" width="16" src="img/icons/silk/application_view_list.png"> '.t(39, 'List').'</a>'
  2166. ));
  2167. $navitable->setURL('?fid=blocks&act=block_groups_json');
  2168. $navitable->sortBy('id');
  2169. $navitable->setDataIndex('id');
  2170. $navitable->setEditUrl('id', '?fid=blocks&act=block_group_edit&id=');
  2171. $navitable->setGridNotesObjectName("block_group");
  2172. $navitable->addCol("ID", 'id', "80", "true", "left");
  2173. $navitable->addCol(t(237, 'Code'), 'code', "120", "true", "left");
  2174. $navitable->addCol(t(67, 'Title'), 'title', "200", "true", "left");
  2175. $navitable->addCol(t(23, 'Blocks'), 'blocks', "80", "true", "left");
  2176. $navitable->addCol(t(168, 'Notes'), 'note', "50", "false", "center");
  2177. $navibars->add_content($navitable->generate());
  2178. return $navibars->generate();
  2179. }
  2180. function block_group_form($item)
  2181. {
  2182. global $DB;
  2183. global $website;
  2184. global $layout;
  2185. global $theme;
  2186. global $current_version;
  2187. $navibars = new navibars();
  2188. $naviforms = new naviforms();
  2189. if(empty($item->id))
  2190. $navibars->title(t(23, 'Blocks').' / '.t(506, 'Groups').' / '.t(38, 'Create'));
  2191. else
  2192. $navibars->title(t(23, 'Blocks').' / '.t(506, 'Groups').' / '.t(170, 'Edit').' ['.$item->id.']');
  2193. if(empty($item->id))
  2194. {
  2195. $navibars->add_actions(
  2196. array( '<a href="#" onclick="navigate_tabform_submit(0);"><img height="16" align="absmiddle" width="16" src="img/icons/silk/accept.png"> '.t(34, 'Save').'</a>' )
  2197. );
  2198. }
  2199. else
  2200. {
  2201. $navibars->add_actions(
  2202. array(
  2203. '<a href="#" onclick="navigate_tabform_submit(0);"><img height="16" align="absmiddle" width="16" src="img/icons/silk/accept.png"> '.t(34, 'Save').'</a>',
  2204. '<a href="#" onclick="navigate_delete_dialog();"><img height="16" align="absmiddle" width="16" src="img/icons/silk/cancel.png"> '.t(35, 'Delete').'</a>'
  2205. )
  2206. );
  2207. $layout->add_script('
  2208. function navigate_delete_dialog()
  2209. {
  2210. navigate_confirmation_dialog(
  2211. function() { window.location.href = "?fid=blocks&act=block_group_delete&id='.$item->id.'"; },
  2212. null, null, "'.t(35, 'Delete').'"
  2213. );
  2214. }
  2215. ');
  2216. }
  2217. $navibars->add_actions(
  2218. array(
  2219. '<a href="?fid=blocks&act=list"><img height="16" align="absmiddle" width="16" src="img/icons/silk/brick.png"> '.t(23, 'Blocks').'</a>',
  2220. '<a href="?fid=blocks&act=block_types_list"><img height="16" align="absmiddle" width="16" src="img/icons/silk/brick_edit.png"> '.t(167, 'Types').'</a>'
  2221. )
  2222. );
  2223. if(!empty($item->id))
  2224. {
  2225. $notes = grid_notes::comments('block_group', $item->id);
  2226. $navibars->add_actions(
  2227. array(
  2228. '<a href="#" onclick="javascript: navigate_display_notes_dialog();"><span class="navigate_grid_notes_span" style=" width: 20px; line-height: 16px; ">'.count($notes).'</span><img src="img/skins/badge.png" width="20px" height="18px" style="margin-top: -2px;" class="grid_note_edit" align="absmiddle" /> '.t(168, 'Notes').'</a>'
  2229. )
  2230. );
  2231. }
  2232. $navibars->add_actions(
  2233. array(
  2234. (!empty($item->id)? '<a href="?fid=blocks&act=block_group_edit"><img height="16" align="absmiddle" width="16" src="img/icons/silk/add.png"> '.t(38, 'Create').'</a>' : ''),
  2235. '<a href="?fid=blocks&act=block_groups_list"><img height="16" align="absmiddle" width="16" src="img/icons/silk/application_view_list.png"> '.t(39, 'List').'</a>'
  2236. ));
  2237. $navibars->form();
  2238. if(!empty($item->id))
  2239. {
  2240. $navibars->add_tab(t(23, "Blocks"));
  2241. $allowed_types = array();
  2242. if(!empty($item->code))
  2243. {
  2244. for($bg=0; $bg < count($theme->block_groups); $bg++)
  2245. {
  2246. if($theme->block_groups[$bg]->id == $item->code)
  2247. {
  2248. if(isset($theme->block_groups[$bg]->allowed_types))
  2249. {
  2250. $allowed_types = $theme->block_groups[$bg]->allowed_types;
  2251. }
  2252. break;
  2253. }
  2254. }
  2255. }
  2256. $blocks_selected = array();
  2257. if(!is_array($item->blocks))
  2258. $item->blocks = array();
  2259. $navibars->add_tab_content($naviforms->hidden('blocks_group_selection', json_encode($item->blocks)));
  2260. $navibars->add_tab_content( $naviforms->hidden('blocks-order', "") );
  2261. $block_types = block::types();
  2262. $lang = $website->languages_published[0];
  2263. $extensions_blocks = extension::blocks();
  2264. for($p=0; $p < count($item->blocks); $p++)
  2265. {
  2266. unset($block);
  2267. switch($item->blocks[$p]['type'])
  2268. {
  2269. case "block":
  2270. $block = new block();
  2271. $block->load($item->blocks[$p]['id']);
  2272. if(empty($block) || empty($block->type))
  2273. continue;
  2274. $blocks_selected[] = '
  2275. <div class="block_group_block ui-state-default" data-block-id="'.$block->id.'" data-block-type="block" data-block-uid="'.$item->blocks[$p]['uid'].'">
  2276. <div class="actions">
  2277. <a href="?fid=blocks&act=edit&id='.$block->id.'"><img src="'.NAVIGATE_URL.'/img/icons/silk/pencil.png" /></a>
  2278. <a href="#" onclick="navigate_blocks_selection_remove(this);"><img src="'.NAVIGATE_URL.'/img/icons/silk/cancel.png" /></a>
  2279. </div>
  2280. <div class="title">'.$block->dictionary[$lang]['title'].'</div>
  2281. <div class="subcomment"><span style="float: right;">ID '.$block->id.'</span><img src="img/icons/silk/brick.png" /> '.$theme->t($block->type).'</div>
  2282. </div>
  2283. ';
  2284. break;
  2285. case "block_type":
  2286. for($bt=0; $bt < count($block_types); $bt++)
  2287. {
  2288. if($block_types[$bt]['id']==$item->blocks[$p]['id'])
  2289. {
  2290. $block = $block_types[$bt];
  2291. break;
  2292. }
  2293. }
  2294. $blocks_selected[] = '
  2295. <div class="block_group_block ui-state-default" data-block-id="'.$block['code'].'" data-block-type="block_type" data-block-uid="'.$item->blocks[$p]['uid'].'">
  2296. <div class="actions">
  2297. <a href="#" data-block-group="'.$block['block_group'].'" data-block-type-code="'.$block['code'].'" data-block-type-title="(span)" onclick="navigate_blocks_block_type_title(this);"><img src="'.NAVIGATE_URL.'/img/icons/silk/text_horizontalrule.png" /><span class="hidden">'.$item->blocks[$p]['title'].'</span></a>
  2298. <a href="#" onclick="navigate_blocks_selection_remove(this);"><img src="'.NAVIGATE_URL.'/img/icons/silk/cancel.png" /></a>
  2299. </div>
  2300. <div class="title" title="'.$block['description'].'">'.$block['title'].'</div>
  2301. <div class="subcomment">
  2302. <span style="float: right;">ID '.$block['code'].'</span>
  2303. <img src="img/icons/silk/brick_link.png" /> '.$block['count'].' '.($block['count']==1? t(437, "Block") : t(23, "Blocks")).'
  2304. </div>
  2305. </div>
  2306. ';
  2307. break;
  2308. case "block_group_block":
  2309. if(is_array($theme->block_groups))
  2310. {
  2311. foreach($theme->block_groups as $key => $bg)
  2312. {
  2313. for($i=0; $i < count($bg->blocks); $i++)
  2314. {
  2315. if($bg->blocks[$i]->id==$item->blocks[$p]['id'])
  2316. {
  2317. $block = array(
  2318. 'code' => $bg->blocks[$i]->id,
  2319. 'type' => $bg->blocks[$i]->id,
  2320. 'title' => $theme->t($bg->blocks[$i]->title),
  2321. 'description' => $theme->t($bg->blocks[$i]->description),
  2322. 'properties' => $bg->blocks[$i]->properties,
  2323. 'block_group' => $bg->id
  2324. );
  2325. break;
  2326. }
  2327. }
  2328. }
  2329. }
  2330. $blocks_selected[] = '
  2331. <div class="block_group_block ui-state-default" data-block-id="'.$block['code'].'" data-block-type="block_group_block" data-block-uid="'.$item->blocks[$p]['uid'].'">
  2332. <div class="actions">
  2333. '.(empty($block['properties'])? '':'<a href="#" data-block-group="'.$block['block_group'].'" data-block-group-block="'.$block['code'].'" data-block-group-action="settings" onclick="navigate_blocks_group_block_settings(this);"><img src="'.NAVIGATE_URL.'/img/icons/silk/cog.png" /></a>').'
  2334. <a href="#" onclick="navigate_blocks_selection_remove(this);"><img src="'.NAVIGATE_URL.'/img/icons/silk/cancel.png" /></a>
  2335. </div>
  2336. <div class="title" title="'.$block['description'].'">'.$block['title'].'</div>
  2337. <div class="subcomment"><span style="float: right;">ID '.$block['type'].'</span><img src="img/icons/silk/bricks.png" /> '.$theme->t($block['type']).'</div>
  2338. </div>
  2339. ';
  2340. break;
  2341. case "extension":
  2342. $block = $item->blocks[$p];
  2343. for($be=0; $be < count($extensions_blocks); $be++)
  2344. {
  2345. if($block['id'] == $extensions_blocks[$be]->id)
  2346. {
  2347. $extension = new extension();
  2348. $extension->load($block['extension']);
  2349. $blocks_selected[] = '
  2350. <div class="block_group_block ui-state-default" data-block-id="'.$block['id'].'" data-block-type="extension" data-block-extension="'.$block['extension'].'" data-block-uid="'.$item->blocks[$p]['uid'].'">
  2351. <div class="actions">
  2352. '.(empty($extensions_blocks[$be]->properties)? '':'<a href="#" data-block-group="'.$item->code.'" data-block-id="'.$block['id'].'" data-block-extension="'.$block['extension'].'" data-block-group-action="settings" onclick="navigate_block_group_extension_block_settings(this);"><img src="'.NAVIGATE_URL.'/img/icons/silk/cog.png" /></a>').'
  2353. <a href="#" onclick="navigate_blocks_selection_remove(this);"><img src="'.NAVIGATE_URL.'/img/icons/silk/cancel.png" /></a>
  2354. </div>
  2355. <div class="title">'.$extension->t($extensions_blocks[$be]->title).'</div>
  2356. <div class="subcomment"><span style="float: right;">ID '.$block['id'].'</span><img src="img/icons/silk/plugin.png" /> '.$extension->title.'</div>
  2357. </div>
  2358. ';
  2359. break;
  2360. }
  2361. }
  2362. break;
  2363. }
  2364. }
  2365. $blocks_selected = implode("\n", $blocks_selected);
  2366. $navibars->add_tab_content(
  2367. '<div id="block_group_selected_blocks" style="width: 49%; float: left; margin-right: 2%;">
  2368. <div class="ui-accordion ui-widget ui-helper-reset">
  2369. <h3 class="ui-accordion-header ui-state-default ui-accordion-icons ui-accordion-header-active ui-state-active ui-corner-top">
  2370. <img src="img/icons/silk/bricks.png" style="vertical-align: middle;" /> '.t(405, 'Selection').'
  2371. </h3>
  2372. <div class="ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content-active">'.$blocks_selected.'</div>
  2373. </div>
  2374. <div class="subcomment">
  2375. <img src="img/icons/silk/information.png" align="absmiddle" /> '.t(72, "Drag any row to assign priorities").'
  2376. </div>
  2377. </div>'
  2378. );
  2379. // **** ADD specific BLOCKS ****
  2380. $sql = '
  2381. SELECT b.type, b.id, d.text as title
  2382. FROM nv_blocks b
  2383. LEFT JOIN nv_webdictionary d
  2384. ON b.id = d.node_id
  2385. AND d.node_type = "block"
  2386. AND d.subtype = "title"
  2387. AND d.lang = "'.$website->languages_list[0].'"
  2388. AND d.website = '.$website->id.'
  2389. WHERE b.website = '.$website->id.'
  2390. ORDER BY b.id DESC';
  2391. $DB->query($sql);
  2392. $block_elements = $DB->result();
  2393. $block_group_blocks = array();
  2394. for($bg=0; $bg < count($theme->block_groups); $bg++)
  2395. {
  2396. if($theme->block_groups[$bg]->id == $item->code)
  2397. $block_group_blocks = $theme->block_groups[$bg]->blocks;
  2398. }
  2399. // blocks available in the accordion
  2400. $navibars->add_tab_content(
  2401. '<div id="blocks_available_wrapper" style="float: left; width: 49%; ">
  2402. <div id="blocks_available_accordion">
  2403. <h3><i class="fa fa-fw fa-cube"></i> '.t(437, 'Block').'</h3>
  2404. <div>
  2405. '.implode(
  2406. "\n",
  2407. array_map(
  2408. function($b) use ($allowed_types)
  2409. {
  2410. global $theme;
  2411. $classes = 'block_group_block ui-state-default';
  2412. if(!empty($allowed_types) && !in_array($b->type, $allowed_types))
  2413. $classes .= ' ui-state-disabled hidden';
  2414. $html = '<div class="'.$classes.'" data-block-id="'.$b->id.'" data-block-type="block">'.
  2415. '<div class="actions">
  2416. <a href="?fid=blocks&act=edit&id='.$b->id.'"><img src="'.NAVIGATE_URL.'/img/icons/silk/pencil.png" /></a>
  2417. <a href="#" onclick="navigate_blocks_selection_remove(this);"><img src="'.NAVIGATE_URL.'/img/icons/silk/cancel.png" /></a>
  2418. </div>'.
  2419. '<div class="title">'.$b->title.'</div>'.
  2420. '<div class="subcomment"><span style="float: right;">ID '.$b->id.'</span><img src="img/icons/silk/brick.png" /> '.$theme->t($b->type).'</div>'.
  2421. '</div>';
  2422. return $html;
  2423. },
  2424. $block_elements
  2425. )
  2426. ).'
  2427. <div class="navigate-block_group-accordion-info-link hidden"><i class="fa fa-eye-slash"></i>&nbsp;&nbsp;<a href="#">'.t(646, "Show all unselectable blocks").'</a></div>
  2428. </div>
  2429. <h3><i class="fa fa-fw fa-cubes"></i> '.t(543, 'Block type').'</h3>
  2430. <div>
  2431. '.implode(
  2432. "\n",
  2433. array_map(
  2434. function($b) use ($allowed_types)
  2435. {
  2436. $classes = 'block_group_block ui-state-default';
  2437. if(!empty($allowed_types) && !in_array($b['id'], $allowed_types))
  2438. $classes .= ' ui-state-disabled';
  2439. $html = '<div class="'.$classes.'" data-block-id="'.$b['id'].'" data-block-type="block_type">'.
  2440. '<div class="actions">
  2441. <a href="#" data-block-group="'.$b['block_group'].'" data-block-type-code="'.$b['code'].'" data-block-type-title="(span)" onclick="navigate_blocks_block_type_title(this);"><img src="'.NAVIGATE_URL.'/img/icons/silk/text_horizontalrule.png" /><span class="hidden">'.$b['block_type_title'].'</span></a>
  2442. <a href="#" onclick="navigate_blocks_selection_remove(this);"><img src="'.NAVIGATE_URL.'/img/icons/silk/cancel.png" /></a>
  2443. </div>'.
  2444. '<div class="title">'.$b['title'].'</div>'.
  2445. '<div class="subcomment">
  2446. <span style="float: right;">'.$b['count'].' '.($b['count']==1? t(437, "Block") : t(23, "Blocks")).'</span>
  2447. <img src="img/icons/silk/brick_link.png" /> ID '.$b['id'].'</div>'.
  2448. '</div>';
  2449. return $html;
  2450. },
  2451. $block_types
  2452. )
  2453. ).'
  2454. </div>
  2455. <h3><i class="fa fa-fw fa-plus-square-o"></i> '.t(556, 'Block from group').' ['.$theme->t($item->code).']</h3>
  2456. <div>
  2457. '.implode(
  2458. "\n",
  2459. array_map(
  2460. function($b) use ($item)
  2461. {
  2462. global $theme;
  2463. $html = '<div class="block_group_block ui-state-default" data-block-id="'.$b->id.'" data-block-type="block_group_block" title="'.$theme->t(@$b->description).'">'.
  2464. '<div class="actions">
  2465. '.(empty($b->properties)? '':'<a href="#" data-block-group="'.$item->code.'" data-block-group-block="'.$b->id.'" data-block-group-action="settings" onclick="navigate_blocks_group_block_settings(this);"><img src="'.NAVIGATE_URL.'/img/icons/silk/cog.png" /></a>').'
  2466. <a href="#" onclick="navigate_blocks_selection_remove(this);"><img src="'.NAVIGATE_URL.'/img/icons/silk/cancel.png" /></a>
  2467. </div>'.
  2468. '<div class="title">'.$theme->t($b->title).'</div>'.
  2469. '<div class="subcomment">
  2470. <span style="float: right;">ID '.$b->id.'</span>
  2471. <img src="img/icons/silk/bricks.png" />'.
  2472. '</div>'.
  2473. '</div>';
  2474. return $html;
  2475. },
  2476. $block_group_blocks
  2477. )
  2478. ).'
  2479. </div>
  2480. <h3><i class="fa fa-fw fa-puzzle-piece"></i> '.t(327, 'Extensions').'</h3>
  2481. <div>
  2482. '.implode(
  2483. "\n",
  2484. array_map(
  2485. function($b) use ($allowed_types, $item)
  2486. {
  2487. $classes = 'block_group_block ui-state-default';
  2488. $extension = new extension();
  2489. $extension->load($b->_extension);
  2490. $html = '<div class="'.$classes.'" data-block-id="'.$b->id.'" data-block-type="extension" data-block-extension="'.$b->_extension.'">'.
  2491. '<div class="actions">
  2492. '.(empty($b->properties)? '':'<a href="#" data-block-group="'.$item->code.'" data-block-group-block="'.$b->id.'" data-block-group-action="settings" onclick="navigate_block_group_extension_block_settings(this);"><img src="'.NAVIGATE_URL.'/img/icons/silk/cog.png" /></a>').'
  2493. <a href="#" onclick="navigate_blocks_selection_remove(this);"><img src="'.NAVIGATE_URL.'/img/icons/silk/cancel.png" /></a>
  2494. </div>'.
  2495. '<div class="title">'.$extension->t($b->title).'</div>'.
  2496. '<div class="subcomment"><span style="float: right;">ID '.$b->id.'</span><img src="img/icons/silk/plugin.png" /> '.$extension->title.'</div>'.
  2497. '</div>';
  2498. return $html;
  2499. },
  2500. $extensions_blocks
  2501. )
  2502. ).'
  2503. </div>
  2504. </div>
  2505. <div class="subcomment">
  2506. <img src="img/icons/silk/information.png" align="absmiddle" /> '.t(638, "Disabled blocks are not compatible with the current block group type").'
  2507. </div>
  2508. </div>'
  2509. );
  2510. $block_group_block_types_form = "";
  2511. foreach($website->languages_list as $lang)
  2512. {
  2513. $block_group_block_types_form .= '
  2514. <div data-lang="'.$lang.'" class="navigate-form-row">
  2515. <label style="width: 48px; "><span title="'.language::name_by_code($lang).'" class="navigate-form-row-language-info"><img align="absmiddle" src="img/icons/silk/comment.png">'.$lang.'</span></label>
  2516. <input type="text" style=" width: 340px;" name="block_type_title_value['.$lang.']" value="">
  2517. </div>
  2518. ';
  2519. }
  2520. $navibars->add_tab_content('
  2521. <div id="navigate-block-groups-block-type-title" class="hidden">
  2522. '.$block_group_block_types_form.'
  2523. <div class="subcomment" style="margin-left: 0;"><img src="img/icons/silk/information.png" /> '.t(641, "It will only be shown if the template supports it").'</div>
  2524. </div>
  2525. ');
  2526. $layout->add_script('
  2527. function navigate_blocks_block_type_title(el)
  2528. {
  2529. var title = $(el).find("span").text();
  2530. try
  2531. {
  2532. title = jQuery.parseJSON(title);
  2533. }
  2534. catch(e)
  2535. {
  2536. // not json; do nothing
  2537. }
  2538. $("#navigate-block-groups-block-type-title").find("input[type=text]").each(function()
  2539. {
  2540. if(typeof(title)=="object")
  2541. $(this).val(title[$(this).parent().data("lang")]);
  2542. else
  2543. $(this).val(title);
  2544. });
  2545. $("#navigate-block-groups-block-type-title").removeClass("hidden");
  2546. $("#navigate-block-groups-block-type-title").dialog({
  2547. title: navigate_t(67, "Title"),
  2548. modal: true,
  2549. width: 428,
  2550. buttons: [
  2551. {
  2552. text: navigate_t(190, "Ok"),
  2553. icons: {
  2554. primary: "ui-icon-check"
  2555. },
  2556. click: function()
  2557. {
  2558. var new_value = {};
  2559. $("#navigate-block-groups-block-type-title")
  2560. .find(\'input[type="text"]\').each(
  2561. function()
  2562. {
  2563. new_value[$(this).parent().data("lang")] = $(this).val();
  2564. }
  2565. );
  2566. $(el).find("span").text(JSON.stringify(new_value));
  2567. blocks_selection_update();
  2568. $( this ).dialog( "close" );
  2569. }
  2570. },
  2571. {
  2572. text: navigate_t(58, "Cancel"),
  2573. icons: {
  2574. primary: "ui-icon-close"
  2575. },
  2576. click: function()
  2577. {
  2578. $( this ).dialog( "close" );
  2579. }
  2580. }
  2581. ]
  2582. });
  2583. }
  2584. ');
  2585. }
  2586. $navibars->add_tab(t(457, "Information"));
  2587. $navibars->add_tab_content($naviforms->hidden('form-sent', 'true'));
  2588. $navibars->add_tab_content($naviforms->hidden('id', $item->id));
  2589. $navibars->add_tab_content_row(array(
  2590. '<label>ID</label>',
  2591. '<span>'.(!empty($item->id)? $item->id : t(52, '(new)')).'</span>' )
  2592. );
  2593. $navibars->add_tab_content_row(array(
  2594. '<label>'.t(67, 'Title').'</label>',
  2595. $naviforms->textfield('title', $item->title)
  2596. ));
  2597. $blgroups = array();
  2598. for($blg=0; $blg < count($theme->block_groups); $blg++)
  2599. {
  2600. $blgroups[$theme->block_groups[$blg]->id] = '';
  2601. if(!empty($theme->block_groups[$blg]->description))
  2602. $blgroups[$theme->block_groups[$blg]->id] = $theme->t($theme->block_groups[$blg]->description);
  2603. }
  2604. if(!in_array($item->code, $blgroups))
  2605. $blgroups[$item->code] = $item->code;
  2606. $navibars->add_tab_content_row(array(
  2607. '<label>'.t(237, 'Code').'</label>',
  2608. $naviforms->selectfield(
  2609. 'code',
  2610. array_keys($blgroups),
  2611. array_keys($blgroups),
  2612. $item->code,
  2613. NULL,
  2614. NULL,
  2615. array_values($blgroups),
  2616. "",
  2617. true,
  2618. true
  2619. )
  2620. ));
  2621. // DEPRECATED field, will be removed. Please use the Notes feature
  2622. if(!empty($item->notes))
  2623. {
  2624. $navibars->add_tab_content_row(array(
  2625. '<label>'.t(168, 'Notes').'</label>',
  2626. $naviforms->textarea('notes', $item->notes)
  2627. ));
  2628. }
  2629. if(!empty($item->id))
  2630. $layout->navigate_notes_dialog('block_group', $item->id);
  2631. $layout->add_script('
  2632. $.ajax({
  2633. type: "GET",
  2634. dataType: "script",
  2635. cache: true,
  2636. url: "lib/packages/blocks/blocks.js?r='.$current_version->revision.'",
  2637. complete: function()
  2638. {
  2639. block_groups_onload();
  2640. }
  2641. });
  2642. ');
  2643. return $navibars->generate();
  2644. }
  2645. function block_group_block_options($block_group, $code, $block_uid, $status)
  2646. {
  2647. global $layout;
  2648. global $website;
  2649. global $theme;
  2650. $block = block::block_group_block($block_group, $code);
  2651. $properties = $block->properties;
  2652. if(empty($properties))
  2653. return;
  2654. $layout = null;
  2655. $layout = new layout('navigate');
  2656. if($status!==null)
  2657. {
  2658. if($status)
  2659. $layout->navigate_notification(t(53, "Data saved successfully."), false, false, 'fa fa-check');
  2660. else
  2661. $layout->navigate_notification(t(56, "Unexpected error"), true, true);
  2662. }
  2663. $navibars = new navibars();
  2664. $naviforms = new naviforms();
  2665. $navibars->title(t(556, 'Block from group').' ['.$theme->t($block_group).']');
  2666. $layout->navigate_media_browser(); // we can use media browser in this function
  2667. $navibars->add_actions(
  2668. array(
  2669. '<a href="#" onclick="javascript: navigate_media_browser();">
  2670. <img height="16" align="absmiddle" width="16" src="img/icons/silk/images.png"> '.t(36, 'Media').
  2671. '</a>'
  2672. )
  2673. );
  2674. $navibars->add_actions(
  2675. array(
  2676. '<a href="#" onclick="navigate_tabform_submit(0);">
  2677. <img height="16" align="absmiddle" width="16" src="img/icons/silk/accept.png"> '.t(34, 'Save').
  2678. '</a>'
  2679. )
  2680. );
  2681. $navibars->form();
  2682. $navibars->add_tab(t(200, 'Options'));
  2683. $navibars->add_tab_content($naviforms->hidden('form-sent', 'true'));
  2684. // show a language selector (only if it's a multi language website)
  2685. if(count($website->languages) > 1)
  2686. {
  2687. $website_languages_selector = $website->languages();
  2688. $website_languages_selector = array_merge(array('' => '('.t(443, 'All').')'), $website_languages_selector);
  2689. $navibars->add_tab_content_row(
  2690. array(
  2691. '<label>'.t(63, 'Languages').'</label>',
  2692. $naviforms->buttonset('language_selector', $website_languages_selector, '', "navigate_tabform_language_selector(this);")
  2693. )
  2694. );
  2695. }
  2696. $properties_values = property::load_properties($code, $block_group, 'block_group_block', $code, $block_uid);
  2697. foreach($properties as $option)
  2698. {
  2699. $property = new property();
  2700. $property_value = '';
  2701. foreach($properties_values as $pv)
  2702. {
  2703. if($pv->id == $option->id)
  2704. $property_value = $pv->value;
  2705. }
  2706. $property->load_from_object($option, $property_value, $theme);
  2707. if($property->type == 'tab')
  2708. {
  2709. $navibars->add_tab($property->name);
  2710. if(count($website->languages) > 1)
  2711. {
  2712. $website_languages_selector = $website->languages();
  2713. $website_languages_selector = array_merge(array('' => '('.t(443, 'All').')'), $website_languages_selector);
  2714. $navibars->add_tab_content_row(
  2715. array(
  2716. '<label>'.t(63, 'Languages').'</label>',
  2717. $naviforms->buttonset('language_selector', $website_languages_selector, '', "navigate_tabform_language_selector(this);")
  2718. )
  2719. );
  2720. }
  2721. }
  2722. $navibars->add_tab_content(navigate_property_layout_field($property));
  2723. }
  2724. $layout->add_content('<div id="navigate-content" class="navigate-content ui-corner-all">'.$navibars->generate().'</div>');
  2725. navigate_property_layout_scripts();
  2726. $layout->navigate_additional_scripts();
  2727. $layout->add_script('
  2728. $("html").css("background", "transparent");
  2729. ');
  2730. $out = $layout->generate();
  2731. return $out;
  2732. }
  2733. function block_group_extension_block_options($block_group, $block_extension, $block_id, $block_uid, $status)
  2734. {
  2735. global $layout;
  2736. global $website;
  2737. global $theme;
  2738. if(empty($block_extension))
  2739. throw new Exception("Unknown extension: {".$block_extension."} for block with uid:".$block_uid);
  2740. $extension = new extension();
  2741. $extension->load($block_extension);
  2742. $block = block::extension_block($extension, $block_id);
  2743. $properties = $block->properties;
  2744. if(empty($properties))
  2745. return;
  2746. $layout = null;
  2747. $layout = new layout('navigate');
  2748. if($status!==null)
  2749. {
  2750. if($status)
  2751. $layout->navigate_notification(t(53, "Data saved successfully."), false, false, 'fa fa-check');
  2752. else
  2753. $layout->navigate_notification(t(56, "Unexpected error"), true, true);
  2754. }
  2755. $navibars = new navibars();
  2756. $naviforms = new naviforms();
  2757. $navibars->title(t(437, 'Block').' ['.$block_extension.' / '.$block_id.']');
  2758. $layout->navigate_media_browser(); // we can use media browser in this function
  2759. $navibars->add_actions(
  2760. array(
  2761. '<a href="#" onclick="javascript: navigate_media_browser();">
  2762. <img height="16" align="absmiddle" width="16" src="img/icons/silk/images.png"> '.t(36, 'Media').
  2763. '</a>'
  2764. )
  2765. );
  2766. $navibars->add_actions(
  2767. array(
  2768. '<a href="#" onclick="navigate_tabform_submit(0);">
  2769. <img height="16" align="absmiddle" width="16" src="img/icons/silk/accept.png"> '.t(34, 'Save').
  2770. '</a>'
  2771. )
  2772. );
  2773. $navibars->form();
  2774. $navibars->add_tab(t(200, 'Options'));
  2775. $navibars->add_tab_content($naviforms->hidden('form-sent', 'true'));
  2776. // show a language selector (only if it's a multi language website)
  2777. if(count($website->languages) > 1)
  2778. {
  2779. $website_languages_selector = $website->languages();
  2780. $website_languages_selector = array_merge(array('' => '('.t(443, 'All').')'), $website_languages_selector);
  2781. $navibars->add_tab_content_row(
  2782. array(
  2783. '<label>'.t(63, 'Languages').'</label>',
  2784. $naviforms->buttonset('language_selector', $website_languages_selector, '', "navigate_tabform_language_selector(this);")
  2785. )
  2786. );
  2787. }
  2788. $properties_values = property::load_properties(NULL, $block_id, "extension_block", $block_group, $block_uid);
  2789. foreach($properties as $option)
  2790. {
  2791. $property = new property();
  2792. $property_value = '';
  2793. foreach($properties_values as $pv)
  2794. {
  2795. if($pv->id == $option->id)
  2796. $property_value = $pv->value;
  2797. }
  2798. $property->load_from_object($option, $property_value, $extension);
  2799. if($property->type == 'tab')
  2800. {
  2801. $navibars->add_tab($property->name);
  2802. if(count($website->languages) > 1)
  2803. {
  2804. $website_languages_selector = $website->languages();
  2805. $website_languages_selector = array_merge(array('' => '('.t(443, 'All').')'), $website_languages_selector);
  2806. $navibars->add_tab_content_row(
  2807. array(
  2808. '<label>'.t(63, 'Languages').'</label>',
  2809. $naviforms->buttonset('language_selector', $website_languages_selector, '', "navigate_tabform_language_selector(this);")
  2810. )
  2811. );
  2812. }
  2813. }
  2814. $navibars->add_tab_content(
  2815. navigate_property_layout_field($property, $extension)
  2816. );
  2817. }
  2818. $layout->add_content('<div id="navigate-content" class="navigate-content ui-corner-all">'.$navibars->generate().'</div>');
  2819. navigate_property_layout_scripts();
  2820. $layout->navigate_additional_scripts();
  2821. $layout->add_script('
  2822. $("html").css("background", "transparent");
  2823. ');
  2824. $out = $layout->generate();
  2825. return $out;
  2826. }
  2827. ?>