10 <div
class=
"categories-side-col">
11 <div
class=
"sidebar-actions">
13 <?=
$block->getAddRootButtonHtml() ?><br/>
14 <?=
$block->getAddSubButtonHtml() ?>
17 <div
class=
"tree-actions">
18 <?php
if (
$block->getRoot()): ?>
22 onclick=
"tree.collapseTree(); return false;"><?=
__(
'Collapse All') ?></a>
23 <span
class=
"separator">|</span> <a href=
"#" 24 onclick=
"tree.expandTree(); return false;"><?=
__(
'Expand All') ?></a>
28 <div
class=
"tree-holder">
29 <div
id=
"tree-div" class=
"tree-wrapper"></div>
33 <div data-
id=
"information-dialog-tree" class=
"messages" style=
"display: none;">
34 <div
class=
"message message-notice">
35 <div><?=
__(
'This operation can take a long time') ?></div>
42 'Magento_Ui/js/modal/modal',
45 "extjs/ext-tree-checkbox",
46 "mage/adminhtml/form",
53 set:
function (key,
value) {
54 this.data[key] =
value;
58 return this.data[key];
62 var treeRoot =
'#tree-div';
67 Ext.lib.Event.getTarget =
function (e) {
68 var ee = e.browserEvent || e;
69 return ee.target ? Event.element(ee) :
null;
72 Ext.tree.TreePanel.Enhanced =
function (el, config) {
73 Ext.tree.TreePanel.Enhanced.superclass.constructor.call(
this, el, config);
76 Ext.extend(Ext.tree.TreePanel.Enhanced, Ext.tree.TreePanel, {
78 loadTree: function (config, firstLoad) {
79 var parameters = config[
'parameters'];
80 var data = config[
'data'];
82 this.storeId = parameters[
'store_id'];
84 if (this.storeId != 0 && $(
'add_root_category_button')) {
85 $(
'add_root_category_button').hide();
88 if ((typeof parameters[
'root_visible']) !=
'undefined') {
89 this.rootVisible = parameters[
'root_visible'] * 1;
92 var root = new Ext.tree.TreeNode(parameters);
95 this.setRootNode(root);
99 this.addListener(
'click', this.categoryClick);
100 this.addListener(
'beforenodedrop', categoryMove.bind(this));
103 this.loader.buildCategoryTree(root, data);
104 this.el.dom.innerHTML =
'';
107 if (parameters[
'expanded']) {
113 var selectedNode = this.getNodeById(parameters[
'category_id']);
115 this.currentNodeId = parameters[
'category_id'];
117 if (parameters[
'parent'] > 0 && parameters[
'category_id'] === 0) {
118 this.currentNodeId = parameters[
'parent'];
121 this.selectCurrentNode();
124 jQuery(
'body').off(
'tabsactivate.tree').on(
'tabsactivate.tree', jQuery.proxy(function (e, ui) {
125 this.activeTab = jQuery(ui.newTab).find(
'a').prop(
'id');
131 if (this.activeTab) {
132 var params = {active_tab_id: this.activeTab};
138 if (!params.form_key) {
139 params.form_key = FORM_KEY;
141 var result =
new Ajax.Request(
142 url + (url.match(
new RegExp(
'\\?')) ?
'&isAjax=true' :
'?isAjax=true' ),
152 selectCurrentNode:
function () {
153 var selectedNode = this.getNodeById(this.currentNodeId);
156 if ((typeof selectedNode.attributes.path) !=
'undefined') {
157 var path = selectedNode.attributes.path;
161 this.selectPath(path);
163 this.getSelectionModel().select(selectedNode);
168 collapseTree:
function () {
171 this.selectCurrentNode();
173 if (!this.collapsed) {
174 this.collapsed =
true;
175 this.loader.dataUrl =
'<?= /* @escapeNotVerified */ $block->getLoadTreeUrl(false) ?>';
176 this.request(this.loader.dataUrl,
false);
180 expandTree:
function () {
182 if (this.collapsed) {
183 this.collapsed =
false;
184 this.loader.dataUrl =
'<?= /* @escapeNotVerified */ $block->getLoadTreeUrl(true) ?>';
185 this.request(this.loader.dataUrl,
false);
189 categoryClick:
function (node, e) {
190 var url = this.buildUrl(node.id);
192 this.currentNodeId = node.id;
197 if (this.activeTab) {
198 var params = {active_tab_id: this.activeTab};
200 updateContent(url, params);
203 buildUrl:
function (id) {
204 var urlExt = (this.storeId ?
'store/' + this.storeId +
'/' :
'') +
'id/' +
id +
'/';
206 return parseSidUrl(this.baseUrl, urlExt);
209 getBaseUrl:
function () {
214 function reRenderTree(switcherParams) {
216 if (
tree && switcherParams) {
218 if (switcherParams.useConfirm) {
219 if (!confirm(
"<?= /* @escapeNotVerified */ __('Please confirm site switching. All data that hasn\'t been saved will be lost.') ?>")) {
224 if ($(
'add_root_category_button')) {
225 if (!switcherParams.scopeId) {
226 $(
'add_root_category_button').show();
229 $(
'add_root_category_button').hide();
235 url =
tree.switchTreeUrl + switcherParams.scopeParams +
'id/' +
tree.currentNodeId +
'/';
242 new Ajax.Request(url + (url.match(
new RegExp(
'\\?')) ?
'&isAjax=true' :
'?isAjax=true' ), {
245 onComplete:
function (transport) {
249 response = JSON.parse(transport.responseText);
251 console.warn(
'An error occured while parsing response');
254 if (!response || !response[
'parameters']) {
258 _renderNewTree(response, switcherParams.scopeParams);
262 var baseUrl =
'<?= /* @escapeNotVerified */ $block->getEditUrl() ?>';
263 var urlExt = switcherParams.scopeParams +
'id/' +
tree.currentNodeId +
'/';
264 url = parseSidUrl(baseUrl, urlExt);
274 function _renderNewTree(config, scopeParams) {
276 var config = defaultLoadTreeParams;
280 tree.purgeListeners();
281 tree.el.dom.innerHTML =
'';
283 tree =
new Ext.tree.TreePanel.Enhanced(
'tree-div', newTreeParams);
285 tree.loadTree(config,
true);
288 var selectedNode =
tree.getNodeById(config.parameters.category_id);
290 tree.currentNodeId = config.parameters.category_id;
292 tree.selectCurrentNode();
295 var url =
tree.editUrl;
297 url = url + scopeParams;
299 <?php
if (
$block->isClearEdit()): ?>
301 url = url +
'id/' + config.parameters.category_id;
308 categoryLoader =
new Ext.tree.TreeLoader({
309 dataUrl:
'<?= /* @escapeNotVerified */ $block->getLoadTreeUrl() ?>' 312 categoryLoader.processResponse =
function (response, parent, callback) {
313 var config = JSON.parse(response.responseText);
315 this.buildCategoryTree(parent, config);
317 if (typeof callback ==
"function") {
318 callback(
this, parent);
322 categoryLoader.buildCategoryTree =
function (parent, config) {
323 if (!config)
return null;
325 if (parent && config && config.length) {
326 for (var i = 0; i < config.length; i++) {
328 var _node = Object.clone(config[i]);
329 if (_node.children && !_node.children.length) {
330 delete(_node.children);
331 node =
new Ext.tree.AsyncTreeNode(_node);
333 node =
new Ext.tree.TreeNode(config[i]);
335 parent.appendChild(node);
336 node.loader = node.getOwnerTree().loader;
337 if (_node.children) {
338 this.buildCategoryTree(node, _node.children);
344 categoryLoader.buildHash =
function (node) {
347 hash = this.toArray(node.attributes);
349 if (node.childNodes.length > 0 || (node.loaded ==
false && node.loading ==
false)) {
350 hash[
'children'] =
new Array;
352 for (var i = 0, len = node.childNodes.length; i < len; i++) {
353 if (!hash[
'children']) {
354 hash[
'children'] =
new Array;
356 hash[
'children'].push(this.buildHash(node.childNodes[i]));
363 categoryLoader.toArray =
function (attributes) {
364 var data = {form_key: FORM_KEY};
365 for (var key in attributes) {
366 var
value = attributes[key];
373 categoryLoader.on(
"beforeload",
function (treeLoader, node) {
374 treeLoader.baseParams.id = node.attributes.id;
375 treeLoader.baseParams.store = node.attributes.store;
376 treeLoader.baseParams.form_key = FORM_KEY;
379 categoryLoader.on(
"load",
function (treeLoader, node, config) {
383 scopeSwitcherHandler = reRenderTree;
387 loader: categoryLoader,
389 containerScroll:
true,
390 selModel:
new Ext.tree.CheckNodeMultiSelectionModel(),
391 rootVisible:
'<?= /* @escapeNotVerified */ $block->getRoot()->getIsVisible() ?>',
392 useAjax: <?=
$block->getUseAjax() ?>,
393 switchTreeUrl:
'<?= /* @escapeNotVerified */ $block->getSwitchTreeUrl() ?>',
394 editUrl:
'<?= /* @escapeNotVerified */ $block->getEditUrl() ?>',
395 currentNodeId: <?= (int)
$block->getCategoryId() ?>,
396 baseUrl:
'<?= /* @escapeNotVerified */ $block->getEditUrl() ?>' 399 defaultLoadTreeParams = {
401 text: <?= json_encode(htmlentities(
$block->getRoot()->getName())) ?>,
403 allowDrop: <?php
if (
$block->getRoot()->getIsVisible()): ?>true<?php else : ?>false<?php endif; ?>,
404 id: <?= (
int)
$block->getRoot()->getId() ?>,
405 expanded: <?= (int)
$block->getIsWasExpanded() ?>,
406 store_id: <?= (int)
$block->getStore()->getId() ?>,
407 category_id: <?= (int)
$block->getCategoryId() ?>,
408 parent: <?= (int)
$block->getRequest()->getParam(
'parent') ?>
410 data: <?=
$block->getTreeJson() ?>
416 function addNew(url, isRoot) {
421 if (/store\/\d+/.test(url)) {
422 url = url.replace(/store\/\d+/,
"store/" +
tree.storeId);
425 url +=
"store/" +
tree.storeId +
"/";
428 url +=
'parent/' +
tree.currentNodeId;
432 function categoryMove(obj) {
433 var data = {id: obj.dropNode.id, form_key: FORM_KEY};
435 data.point = obj.point;
438 data.pid = obj.target.parentNode.id;
439 data.paid = obj.dropNode.parentNode.id;
440 if (obj.target.previousSibling) {
441 data.aid = obj.target.previousSibling.id;
447 data.pid = obj.target.parentNode.id;
448 data.aid = obj.target.id;
451 data.pid = obj.target.id;
452 data.paid = obj.dropNode.parentNode.id;
453 if (obj.target.lastChild) {
454 data.aid = obj.target.lastChild.id;
465 for (var key in data) {
466 pd.push(encodeURIComponent(key),
"=", encodeURIComponent(data[key]),
"&");
468 pd.splice(pd.length - 1, 1);
470 registry.set(
'pd', pd.join(
""));
472 jQuery(
'[data-id="information-dialog-category"]').modal({
473 modalClass:
'confirm',
474 title:
jQuery.mage.__(
'Warning message'),
477 class:
'action-secondary',
484 class:
'action-primary',
488 url:
'<?= /* @escapeNotVerified */ $block->getMoveUrl() ?>',
490 data: registry.get(
'pd'),
492 }).done(
function (data) {
496 $(treeRoot).trigger(
'categoryMove.tree');
498 $(
'.page-main-actions').next(
'.messages').remove();
499 $(
'.page-main-actions').next(
'#messages').remove();
500 $(
'.page-main-actions').after(data.messages);
501 }).fail(
function (jqXHR, textStatus) {
502 if (window.console) {
503 console.log(textStatus);
512 }).trigger(
'openModal');
516 window.addNew = addNew;
$block setTitle( 'CMS Block Title') -> setIdentifier('fixture_block') ->setContent('< h1 >Fixture Block Title</h1 >< a href=" store url</a><p> Config value
if( $block->getRoot())() ?>< br/><? endif
if($block->getRoot())< div class="message message-notice">< div ><?=__( 'This operation can take a long time') ?></div ></div ></div >< script > var tree
jQuery('.store-switcher .dropdown-menu li a').each(function()
jquery extjs ext tree mage adminhtml mage function(jQuery, modal)