layout.phtml 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. // @codingStandardsIgnoreFile
  7. /** @var \Magento\Widget\Block\Adminhtml\Widget\Instance\Edit\Tab\Main\Layout $block */
  8. ?>
  9. <fieldset class="fieldset">
  10. <legend class="legend"><span><?= $block->escapeHtml(__('Layout Updates')) ?></span></legend>
  11. <br />
  12. <div class="widget-layout-updates">
  13. <div id="page_group_container"></div>
  14. <div class="actions"><?= $block->getAddLayoutButtonHtml() ?></div>
  15. </div>
  16. </fieldset>
  17. <script id="ie-deferred-loader" defer="defer" src="//:"></script>
  18. <script>
  19. require([
  20. 'jquery',
  21. 'mage/template',
  22. 'Magento_Ui/js/modal/alert',
  23. "prototype",
  24. "extjs/ext-tree-checkbox"
  25. ], function (jQuery, mageTemplate, alert) {
  26. //<![CDATA[
  27. var pageGroupTemplate = '<div class="fieldset-wrapper page_group_container" id="page_group_container_<%- data.id %>">'+
  28. '<div class="fieldset-wrapper-title">'+
  29. '<label for="widget_instance[<%- data.id %>][page_group]">Display on <span class="required">*</span></label>'+
  30. '<?= $block->getDisplayOnSelectHtml() ?>'+
  31. '<div class="actions">'+
  32. <?= /* @noEscape */ $this->helper('Magento\Framework\Json\Helper\Data')->jsonEncode($block->getRemoveLayoutButtonHtml()) ?> +
  33. '</div>'+
  34. '</div>'+
  35. '<div class="fieldset-wrapper-content">'+
  36. <?php foreach ($block->getDisplayOnContainers() as $container): ?>
  37. '<div class="no-display <?= $block->escapeJs($container['code']) ?> group_container" id="<?= $block->escapeJs($container['name']) ?>_<%- data.id %>">'+
  38. '<input disabled="disabled" type="hidden" class="container_name" name="__[container_name]" value="widget_instance[<%- data.id %>][<?= $block->escapeJs($container['name']) ?>]" />'+
  39. '<input disabled="disabled" type="hidden" name="widget_instance[<%- data.id %>][<?= $block->escapeJs($container['name']) ?>][page_id]" value="<%- data.page_id %>" />'+
  40. '<input disabled="disabled" type="hidden" class="layout_handle_pattern" name="widget_instance[<%- data.id %>][<?= $block->escapeJs($container['name']) ?>][layout_handle]" value="<?= $block->escapeJs($container['layout_handle']) ?>" />'+
  41. '<table class="data-table">'+
  42. '<col width="200" />'+
  43. '<thead>'+
  44. '<tr>'+
  45. '<th><label><?= $block->escapeJs(__('%1', $container['label'])) ?></label></th>'+
  46. '<th><label><?= $block->escapeJs(__('Container')) ?> <span class="required">*</span></label></th>'+
  47. '<th><label><?= $block->escapeJs(__('Template')) ?></label></th>'+
  48. '</tr>'+
  49. '</thead>'+
  50. '<tbody>'+
  51. '<tr>'+
  52. '<td>'+
  53. '<input disabled="disabled" type="radio" class="radio for_all" id="all_<?= $block->escapeJs($container['name']) ?>_<%- data.id %>" name="widget_instance[<%- data.id %>][<?= $block->escapeJs($container['name']) ?>][for]" value="all" onclick="WidgetInstance.togglePageGroupChooser(this)" checked="checked" />&nbsp;'+
  54. '<label for="all_<?= $block->escapeJs($container['name']) ?>_<%- data.id %>"><?= $block->escapeJs(__('All')) ?></label><br />'+
  55. '<input disabled="disabled" type="radio" class="radio for_specific" id="specific_<?= $block->escapeJs($container['name']) ?>_<%- data.id %>" name="widget_instance[<%- data.id %>][<?= $block->escapeJs($container['name']) ?>][for]" value="specific" onclick="WidgetInstance.togglePageGroupChooser(this)" />&nbsp;'+
  56. '<label for="specific_<?= $block->escapeJs($container['name']) ?>_<%- data.id %>"><?= $block->escapeJs(__('Specific %1', $container['label'])) ?></label>'+
  57. '</td>'+
  58. '<td>'+
  59. '<div class="block_reference_container">'+
  60. '<div class="block_reference"></div>'+
  61. '</div>'+
  62. '</td>'+
  63. '<td>'+
  64. '<div class="block_template_container">'+
  65. '<div class="block_template"></div>'+
  66. '</div>'+
  67. '</td>'+
  68. '</tr>'+
  69. '</tbody>'+
  70. '</table>'+
  71. '<div class="no-display chooser_container" id="<?= $block->escapeJs($container['name']) ?>_ids_<%- data.id %>">'+
  72. '<input disabled="disabled" type="hidden" class="is_anchor_only" name="widget_instance[<%- data.id %>][<?= $block->escapeJs($container['name']) ?>][is_anchor_only]" value="<?= $block->escapeJs($container['is_anchor_only']) ?>" />'+
  73. '<input disabled="disabled" type="hidden" class="product_type_id" name="widget_instance[<%- data.id %>][<?= $block->escapeJs($container['name']) ?>][product_type_id]" value="<?= $block->escapeJs($container['product_type_id']) ?>" />'+
  74. '<p>' +
  75. '<input disabled="disabled" type="text" class="input-text entities" name="widget_instance[<%- data.id %>][<?= $block->escapeJs($container['name']) ?>][entities]" value="<%- data.<?= $block->escapeJs($container['name']) ?>_entities %>" readonly="readonly" />&nbsp;' +
  76. '<a class="widget-option-chooser" href="javascript:void(0)" onclick="WidgetInstance.displayEntityChooser(\'<?= $block->escapeJs($container['code']) ?>\', \'<?= $block->escapeJs($container['name']) ?>_ids_<%- data.id %>\')" title="<?= $block->escapeJs(__('Open Chooser')) ?>">' +
  77. '<img src="<?= $block->escapeUrl($block->getViewFileUrl('images/rule_chooser_trigger.gif')) ?>" alt="<?= $block->escapeJs(__('Open Chooser')) ?>" />' +
  78. '</a>&nbsp;' +
  79. '<a href="javascript:void(0)" onclick="WidgetInstance.hideEntityChooser(\'<?= $block->escapeJs($container['name']) ?>_ids_<%- data.id %>\')" title="<?= $block->escapeJs(__('Apply')) ?>">' +
  80. '<img src="<?= $block->escapeUrl($block->getViewFileUrl('images/rule_component_apply.gif')) ?>" alt="<?= $block->escapeJs(__('Apply')) ?>" />' +
  81. '</a>' +
  82. '</p>'+
  83. '<div class="chooser"></div>'+
  84. '</div>'+
  85. '</div>'+
  86. <?php endforeach; ?>
  87. '<div class="no-display all_pages group_container" id="all_pages_<%- data.id %>">'+
  88. '<input disabled="disabled" type="hidden" class="container_name" name="__[container_name]" value="widget_instance[<%- data.id %>][all_pages]" />'+
  89. '<input disabled="disabled" type="hidden" name="widget_instance[<%- data.id %>][all_pages][page_id]" value="<%- data.page_id %>" />'+
  90. '<input disabled="disabled" type="hidden" class="layout_handle_pattern" name="widget_instance[<%- data.id %>][all_pages][layout_handle]" value="default" />'+
  91. '<input disabled="disabled" type="hidden" class="for_all" name="widget_instance[<%- data.id %>][all_pages][for]" value="all" />'+
  92. '<table class="data-table">'+
  93. '<col width="200" />'+
  94. '<thead>'+
  95. '<tr>'+
  96. '<th><label><?= $block->escapeJs(__('Container')) ?> <span class="required">*</span></label></th>'+
  97. '<th><label><?= $block->escapeJs(__('Template')) ?></label></th>'+
  98. '<th>&nbsp;</th>'+
  99. '</tr>'+
  100. '</thead>'+
  101. '<tbody>'+
  102. '<tr>'+
  103. '<td>'+
  104. '<div class="block_reference_container">'+
  105. '<div class="block_reference"></div>'+
  106. '</div>'+
  107. '</td>'+
  108. '<td>'+
  109. '<div class="block_template_container">'+
  110. '<div class="block_template"></div>'+
  111. '</div>'+
  112. '</td>'+
  113. '<td>&nbsp;</td>'+
  114. '</tr>'+
  115. '</tbody>'+
  116. '</table>'+
  117. '</div>'+
  118. '<div class="no-display ignore-validate pages group_container" id="pages_<%- data.id %>">'+
  119. '<input disabled="disabled" type="hidden" class="container_name" name="__[container_name]" value="widget_instance[<%- data.id %>][pages]" />'+
  120. '<input disabled="disabled" type="hidden" name="widget_instance[<%- data.id %>][pages][page_id]" value="<%- data.page_id %>" />'+
  121. '<input disabled="disabled" type="hidden" class="for_all" name="widget_instance[<%- data.id %>][pages][for]" value="all" />'+
  122. '<table class="data-table">'+
  123. '<col width="200" />'+
  124. '<thead>'+
  125. '<tr>'+
  126. '<th><label><?= $block->escapeJs(__('Page')) ?> <span class="required">*</span></label></th>'+
  127. '<th><label><?= $block->escapeJs(__('Container')) ?> <span class="required">*</span></label></th>'+
  128. '<th><label><?= $block->escapeJs(__('Template')) ?></label></th>'+
  129. '</tr>'+
  130. '</thead>'+
  131. '<tbody>'+
  132. '<tr>'+
  133. '<td><?= /* @noEscape */ $block->getLayoutsChooser() ?></td>'+
  134. '<td>'+
  135. '<div class="block_reference_container">'+
  136. '<div class="block_reference"></div>'+
  137. '</div>'+
  138. '</td>'+
  139. '<td>'+
  140. '<div class="block_template_container">'+
  141. '<div class="block_template"></div>'+
  142. '</div>'+
  143. '</td>'+
  144. '<td>&nbsp;</td>'+
  145. '</tr>'+
  146. '</tbody>'+
  147. '</table>'+
  148. '</div>'+
  149. '<div class="no-display ignore-validate pages group_container" id="page_layouts_<%- data.id %>">'+
  150. '<input disabled="disabled" type="hidden" class="container_name" name="__[container_name]" value="widget_instance[<%- data.id %>][page_layouts]" />'+
  151. '<input disabled="disabled" type="hidden" name="widget_instance[<%- data.id %>][page_layouts][page_id]" value="<%- data.page_id %>" />'+
  152. '<input disabled="disabled" type="hidden" class="for_all" name="widget_instance[<%- data.id %>][page_layouts][for]" value="all" />'+
  153. '<table class="data-table">'+
  154. '<col width="200" />'+
  155. '<thead>'+
  156. '<tr>'+
  157. '<th><label><?= $block->escapeJs(__('Page')) ?> <span class="required">*</span></label></th>'+
  158. '<th><label><?= $block->escapeJs(__('Container')) ?> <span class="required">*</span></label></th>'+
  159. '<th><label><?= $block->escapeJs(__('Template')) ?></label></th>'+
  160. '</tr>'+
  161. '</thead>'+
  162. '<tbody>'+
  163. '<tr>'+
  164. '<td><?= /* @noEscape */ $block->getPageLayoutsPageChooser() ?></td>'+
  165. '<td>'+
  166. '<div class="block_reference_container">'+
  167. '<div class="block_reference"></div>'+
  168. '</div>'+
  169. '</td>'+
  170. '<td>'+
  171. '<div class="block_template_container">'+
  172. '<div class="block_template"></div>'+
  173. '</div>'+
  174. '</td>'+
  175. '<td>&nbsp;</td>'+
  176. '</tr>'+
  177. '</tbody>'+
  178. '</table>'+
  179. '</div>'+
  180. '</div>'+
  181. '</div>';
  182. window.pageGroupTemplate = pageGroupTemplate;
  183. var WidgetInstance = {
  184. pageGroupTemplate : pageGroupTemplate,
  185. pageGroupContainerId : 'page_group_container',
  186. count : 0,
  187. activePageGroups : $H({}),
  188. selectedItems : {},
  189. addPageGroup : function(data) {
  190. if (this.pageGroupTemplate && (pageGroupContainer = $(this.pageGroupContainerId))) {
  191. if (!data.page_id) {
  192. data = {};
  193. data.page_id = 0;
  194. data.entities = '';
  195. }
  196. data.id = this.count++;
  197. if (data[data.group + '_entities']) {
  198. var selected_entities = data[data.group + '_entities'].split(',');
  199. if (selected_entities.length > 0) {
  200. for (var i = 0; i < selected_entities.length; i++) {
  201. this.addProductItemToSelection(data.group + '_ids_' + data.id, selected_entities[i]);
  202. }
  203. }
  204. }
  205. pageGroupTemplateObj = mageTemplate(this.pageGroupTemplate);
  206. Element.insert(pageGroupContainer, {
  207. 'bottom': pageGroupTemplateObj({
  208. data: data
  209. })
  210. });
  211. if (data.group) {
  212. pageGroup = $(data.group+'_'+data.id);
  213. additional = {};
  214. additional.selectedLayoutHandle = data.layout_handle;
  215. additional.selectedBlock = data.block;
  216. additional.selectedTemplate = data.template;
  217. additional.position = data.position;
  218. additional.for_value = data.for_value;
  219. additional.template = '';
  220. if (data.group == 'pages' || data.group == 'page_layouts') {
  221. layoutSelect = pageGroup.down('select#layout_handle');
  222. if (layoutSelect) {
  223. for (var i = 0; i < layoutSelect.options.length; i++) {
  224. if (layoutSelect.options[i].value == data.layout_handle) {
  225. layoutSelect.options[i].selected = true;
  226. break;
  227. }
  228. }
  229. }
  230. }
  231. if ($(this.pageGroupContainerId+'_'+data.id)) {
  232. selectGroupElm = $(this.pageGroupContainerId+'_'+data.id).down('select.page_group_select');
  233. for (var i = 0; i < selectGroupElm.options.length; i++) {
  234. if (selectGroupElm.options[i].value == data.group) {
  235. selectGroupElm.options[i].selected = true;
  236. break;
  237. }
  238. }
  239. }
  240. forElm = pageGroup.down('input.for_'+data.for_value);
  241. if (forElm) {
  242. /**
  243. * IE browsers fix: remove default checked attribute in radio form element
  244. * to check others radio form elements in future
  245. */
  246. pageGroup.down('input.for_all').defaultChecked = false;
  247. forElm.defaultChecked = true;
  248. forElm.checked = true;
  249. this.togglePageGroupChooser(forElm);
  250. }
  251. this.displayPageGroup(pageGroup, additional);
  252. }
  253. }
  254. },
  255. removePageGroup : function(element) {
  256. container = element.up('div.page_group_container');
  257. if (container) {
  258. container.remove();
  259. }
  260. },
  261. addProductItemToSelection: function(groupId, item) {
  262. if (undefined == this.selectedItems[groupId]) {
  263. this.selectedItems[groupId] = $H({});
  264. }
  265. if (!isNaN(parseInt(item))) {
  266. this.selectedItems[groupId].set(item, 1);
  267. }
  268. },
  269. removeProductItemFromSelection: function(groupId, item) {
  270. if (undefined !== this.selectedItems[groupId]) {
  271. this.selectedItems[groupId].unset(item);
  272. }
  273. },
  274. showBlockContainer : function(container) {
  275. container = $(container);
  276. if (container) {
  277. container.removeClassName('no-display');
  278. container.removeClassName('ignore-validate');
  279. container.up('.fieldset-wrapper').addClassName('opened');
  280. container.select('input', 'select').each(function(element) {
  281. $(element).removeAttribute('disabled');
  282. });
  283. container.show();
  284. }
  285. },
  286. hideBlockContainer : function(container) {
  287. container = $(container);
  288. if (container) {
  289. container.addClassName('no-display');
  290. container.addClassName('ignore-validate');
  291. container.select('input', 'select').each(function(element) {
  292. $(element).writeAttribute('disabled', 'disabled');
  293. });
  294. container.hide();
  295. }
  296. },
  297. displayPageGroup : function(container, additional) {
  298. container = $(container);
  299. if (!additional) {
  300. additional = {};
  301. }
  302. if (activePageGroupId = this.activePageGroups.get(container.up('div.page_group_container').id)) {
  303. this.hideBlockContainer(activePageGroupId);
  304. }
  305. this.activePageGroups.set(container.up('div.page_group_container').id, container.id);
  306. this.showBlockContainer(container);
  307. blockContainer = container.down('div.block_reference');
  308. if (blockContainer && blockContainer.innerHTML == '') {
  309. layoutHandle = '';
  310. if (layoutHandleField = container.down('input.layout_handle_pattern')) {
  311. layoutHandle = layoutHandleField.value;
  312. } else if (additional.selectedLayoutHandle) {
  313. layoutHandle = additional.selectedLayoutHandle;
  314. }
  315. this.loadSelectBoxByType('block_reference', container, layoutHandle, additional);
  316. }
  317. this.loadSelectBoxByType('block_template', container, additional.selectedBlock, additional);
  318. },
  319. displayEntityChooser : function(type, chooser, additional) {
  320. if (!additional) {
  321. additional = {};
  322. }
  323. if (type == 'categories') {
  324. additional.url = '<?= $block->escapeUrl($block->getCategoriesChooserUrl()) ?>';
  325. additional.post_parameters = $H({'is_anchor_only':$(chooser).down('input.is_anchor_only').value});
  326. } else if (type == 'products') {
  327. additional.url = '<?= $block->escapeUrl($block->getProductsChooserUrl()) ?>';
  328. additional.post_parameters = $H({'product_type_id':$(chooser).down('input.product_type_id').value});
  329. }
  330. if (chooser && additional) {
  331. this.displayChooser(chooser, additional);
  332. }
  333. },
  334. hideEntityChooser : function(chooser) {
  335. chooser = $(chooser).down('div.chooser');
  336. if (chooser) {
  337. chooser.addClassName('no-display');
  338. chooser.hide();
  339. }
  340. },
  341. displayChooser : function(chooser, additional) {
  342. chooser = $(chooser).down('div.chooser');
  343. entities = chooser.up('div.chooser_container').down('input[type="text"].entities').value;
  344. postParameters = $H({selected:entities});
  345. url = '';
  346. if (additional) {
  347. if (additional.url) url = additional.url;
  348. if (additional.post_parameters) {
  349. additional.post_parameters.each(function(pair){
  350. postParameters.set(pair.key,pair.value);
  351. });
  352. }
  353. }
  354. if (chooser && url) {
  355. if (chooser.innerHTML == '') {
  356. new Ajax.Request(url, {
  357. method: 'post',
  358. parameters: postParameters,
  359. onSuccess: function(transport) {
  360. try {
  361. if (transport.responseText) {
  362. Element.insert(chooser, transport.responseText);
  363. chooser.removeClassName('no-display');
  364. chooser.show();
  365. }
  366. } catch (e) {
  367. alert({
  368. content: 'Error occurs during loading chooser.'
  369. });
  370. }
  371. }
  372. });
  373. } else {
  374. chooser.removeClassName('no-display');
  375. chooser.show();
  376. }
  377. }
  378. },
  379. checkProduct : function(event) {
  380. var elm = event.memo.element,
  381. container = event.target.up('div.chooser').up('div.chooser_container'),
  382. selectionId = container.id,
  383. entitiesElm = container.down('input[type="text"].entities');
  384. if (elm.checked) {
  385. this.addProductItemToSelection(selectionId, elm.value);
  386. } else {
  387. this.removeProductItemFromSelection(selectionId, elm.value);
  388. }
  389. if (entitiesElm) {
  390. entitiesElm.value = this.selectedItems[selectionId].keys().join(',');
  391. }
  392. },
  393. checkCategory : function(event) {
  394. node = event.memo.node;
  395. container = event.target.up('div.chooser_container');
  396. value = container.down('input[type="text"].entities').value.strip();
  397. if (node.attributes.checked) {
  398. if (value) ids = value.split(',');
  399. else ids = [];
  400. if (-1 == ids.indexOf(node.id)) {
  401. ids.push(node.id);
  402. container.down('input[type="text"].entities').value = ids.join(',');
  403. }
  404. } else {
  405. ids = value.split(',');
  406. while (-1 != ids.indexOf(node.id)) {
  407. ids.splice(ids.indexOf(node.id), 1);
  408. container.down('input[type="text"].entities').value = ids.join(',');
  409. }
  410. }
  411. },
  412. togglePageGroupChooser : function(element) {
  413. element = $(element);
  414. if (element && (chooser = element.up('div.group_container').down('div.chooser_container'))) {
  415. if (element.value == 'all') {
  416. chooser.addClassName('no-display');
  417. chooser.hide();
  418. } else {
  419. chooser.removeClassName('no-display');
  420. chooser.show();
  421. }
  422. }
  423. },
  424. loadSelectBoxByType : function (type, element, value, additional) {
  425. if (!additional) {
  426. additional = {};
  427. }
  428. if (element && (containerElm = element.down('div.'+type))) {
  429. url = '';
  430. selected = '';
  431. parameters = {};
  432. if (type == 'block_reference') {
  433. url = '<?= $block->escapeUrl($block->getBlockChooserUrl()) ?>';
  434. if (additional.selectedBlock) {
  435. selected = additional.selectedBlock;
  436. }
  437. parameters.layout = value;
  438. } else if (type == 'block_template') {
  439. url = '<?= $block->escapeUrl($block->getTemplateChooserUrl()) ?>';
  440. if (additional.selectedTemplate) {
  441. selected = additional.selectedTemplate;
  442. }
  443. parameters.block = value;
  444. }
  445. parameters.selected = selected;
  446. if (url) {
  447. new Ajax.Request(url, {
  448. method: 'post',
  449. parameters: parameters,
  450. containerElm: containerElm,
  451. onSuccess: function(transport) {
  452. containerElm = transport.request.options.containerElm;
  453. try {
  454. if (transport.responseText) {
  455. containerElm.update(transport.responseText);
  456. formElm = containerElm.down('select, input[type="hidden"]');
  457. if (formElm) {
  458. formElm.name = element.down('input.container_name').value+'['+formElm.name+']';
  459. }
  460. }
  461. } catch (e) {
  462. alert({
  463. content: 'Error occurs during loading chooser.'
  464. });
  465. }
  466. }
  467. });
  468. }
  469. }
  470. }
  471. };
  472. window.WidgetInstance = WidgetInstance;
  473. jQuery(function(){
  474. <?php foreach ($block->getPageGroups() as $pageGroup): ?>
  475. WidgetInstance.addPageGroup(<?= /* @noEscape */ $pageGroup ?>);
  476. <?php endforeach; ?>
  477. Event.observe(document, 'product:changed', function(event){
  478. WidgetInstance.checkProduct(event);
  479. });
  480. Event.observe(document, 'node:changed', function(event){
  481. WidgetInstance.checkCategory(event);
  482. });
  483. Event.observe(document, 'category:beforeLoad', function(event) {
  484. container = event.target.up('div.chooser_container');
  485. value = container.down('input[type="text"].entities').value.strip();
  486. event.memo.treeLoader.baseParams.selected = value;
  487. });
  488. });
  489. //]]>
  490. });
  491. </script>