From f29e93594d074050c869c11ce5c0cd8749cfbd03 Mon Sep 17 00:00:00 2001 From: Martyna Maciejewska Date: Wed, 17 Jan 2024 11:00:46 +0100 Subject: [PATCH 01/18] #104299 - Updated snowdog-menu block id --- Block/Adminhtml/Edit/Tab/Nodes.php | 9 +++++++++ view/adminhtml/templates/menu/nodes.phtml | 4 +++- view/adminhtml/web/js/nodes.js | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/Block/Adminhtml/Edit/Tab/Nodes.php b/Block/Adminhtml/Edit/Tab/Nodes.php index 2b8dbeaa..e433e850 100644 --- a/Block/Adminhtml/Edit/Tab/Nodes.php +++ b/Block/Adminhtml/Edit/Tab/Nodes.php @@ -206,4 +206,13 @@ public function getVueComponents(): array { return $this->vueProvider->getComponents(); } + + /** + * @throws LocalizedException + */ + public function getBlockHtmlId(): string + { + $uuid = $this->mathRandom->getRandomString(5); + return '"snowdog-menu-' . $uuid . '"'; + } } diff --git a/view/adminhtml/templates/menu/nodes.phtml b/view/adminhtml/templates/menu/nodes.phtml index e4a61867..fd43add2 100644 --- a/view/adminhtml/templates/menu/nodes.phtml +++ b/view/adminhtml/templates/menu/nodes.phtml @@ -7,9 +7,10 @@ foreach ($block->getNodeForms() as $form) { $fieldData[$form->getNodeType()] = $form->getJsonConfig(); } $vueComponents = $block->getVueComponents(); +$blockHtmlId = $block->getBlockHtmlId(); ?> -
+
> getVueComponents(); "*": { "menuNodes": { "vueComponents": , + "blockHtmlId": , "data": { "nodes" : renderNodes()) ?>, "config": { diff --git a/view/adminhtml/web/js/nodes.js b/view/adminhtml/web/js/nodes.js index a5fb696c..7af5282e 100644 --- a/view/adminhtml/web/js/nodes.js +++ b/view/adminhtml/web/js/nodes.js @@ -29,7 +29,7 @@ define([ Vue.component('treeselect', vueTreeselect.Treeselect); var app = new Vue({ - el: config.el || "#snowdog-menu", + el: config.el || "#" + config.blockHtmlId, data: config.data }); From 25748fb6645743dbf22df5e96ef9a6f02f78f919 Mon Sep 17 00:00:00 2001 From: Martyna Maciejewska Date: Thu, 18 Jan 2024 15:02:46 +0100 Subject: [PATCH 02/18] Use method to get id column name --- Api/Data/MenuInterface.php | 7 +++++++ Model/Menu.php | 14 +++++++++++--- Model/Menu/NodeRepository.php | 14 ++++++++++---- Model/MenuRepository.php | 9 +++++++-- Service/Menu/Nodes.php | 2 +- 5 files changed, 36 insertions(+), 10 deletions(-) diff --git a/Api/Data/MenuInterface.php b/Api/Data/MenuInterface.php index 1bcf4d33..fe602382 100644 --- a/Api/Data/MenuInterface.php +++ b/Api/Data/MenuInterface.php @@ -121,4 +121,11 @@ public function getIsActive(); * @return $this */ public function setIsActive($isActive); + + /** + * Get ID column name + * + * @return string + */ + public function getIdColumnName(): string; } diff --git a/Model/Menu.php b/Model/Menu.php index 886f0c59..f7974f64 100644 --- a/Model/Menu.php +++ b/Model/Menu.php @@ -28,7 +28,7 @@ public function getStores() { $connection = $this->getResource()->getConnection(); $select = $connection->select()->from($this->getResource()->getTable('snowmenu_store'), ['store_id'])->where( - 'menu_id = ?', + $this->getIdColumnName() . ' = ?', $this->getId() ); return $connection->fetchCol($select); @@ -46,9 +46,9 @@ public function saveStores(array $stores) $connection = $this->getResource()->getConnection(); $connection->beginTransaction(); $table = $this->getResource()->getTable('snowmenu_store'); - $connection->delete($table, ['menu_id = ?' => $this->getId()]); + $connection->delete($table, [$this->getIdColumnName() . ' = ?' => $this->getId()]); foreach ($stores as $store) { - $connection->insert($table, ['menu_id' => $this->getId(), 'store_id' => $store]); + $connection->insert($table, [$this->getIdColumnName() => $this->getId(), 'store_id' => $store]); } $connection->commit(); @@ -166,4 +166,12 @@ public function setIsActive($isActive) { return $this->setData(MenuInterface::IS_ACTIVE, $isActive); } + + /** + * @inheritdoc + */ + public function getIdColumnName(): string + { + return self::MENU_ID; + } } diff --git a/Model/Menu/NodeRepository.php b/Model/Menu/NodeRepository.php index dc69be42..1bcfc9f7 100644 --- a/Model/Menu/NodeRepository.php +++ b/Model/Menu/NodeRepository.php @@ -8,16 +8,20 @@ use Magento\Framework\Exception\NoSuchEntityException; use Magento\Framework\Exception\CouldNotDeleteException; use Magento\Framework\Api\SearchResultsInterfaceFactory; -use Magento\Framework\Api\SearchResultsInterface; use Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection; +use Snowdog\Menu\Api\Data\MenuInterface; use Snowdog\Menu\Api\Data\NodeInterface; use Snowdog\Menu\Api\NodeRepositoryInterface; -use Snowdog\Menu\Model\Menu\NodeFactory; use Snowdog\Menu\Model\ResourceModel\Menu\Node\CollectionFactory; use Magento\Framework\Api\SortOrder; class NodeRepository implements NodeRepositoryInterface { + /** + * @var MenuInterface + */ + protected $menu; + /** * @var NodeFactory */ @@ -36,8 +40,10 @@ class NodeRepository implements NodeRepositoryInterface public function __construct( NodeFactory $objectFactory, CollectionFactory $collectionFactory, - SearchResultsInterfaceFactory $searchResultsFactory + SearchResultsInterfaceFactory $searchResultsFactory, + MenuInterface $menu ) { + $this->menu = $menu; $this->objectFactory = $objectFactory; $this->collectionFactory = $collectionFactory; $this->searchResultsFactory = $searchResultsFactory; @@ -139,7 +145,7 @@ public function getList(SearchCriteriaInterface $criteria) public function getByMenu($menuId) { $collection = $this->collectionFactory->create(); - $collection->addFilter('menu_id', $menuId); + $collection->addFilter($this->menu->getIdColumnName(), $menuId); $collection->addOrder('level', AbstractCollection::SORT_ORDER_ASC); $collection->addOrder('parent_id', AbstractCollection::SORT_ORDER_ASC); $collection->addOrder('position', AbstractCollection::SORT_ORDER_ASC); diff --git a/Model/MenuRepository.php b/Model/MenuRepository.php index 420874cf..b89771f8 100644 --- a/Model/MenuRepository.php +++ b/Model/MenuRepository.php @@ -18,6 +18,9 @@ */ class MenuRepository implements MenuRepositoryInterface { + /** @var MenuInterface */ + protected $menu; + /** @var MenuFactory */ protected $menuFactory; @@ -40,8 +43,10 @@ public function __construct( MenuFactory $menuFactory, CollectionFactory $menuCollectionFactory, MenuSearchResultsInterfaceFactory $menuSearchResults, - ResourceModel\Menu $menuResourceModel = null + MenuInterface $menu, + ResourceModel\Menu $menuResourceModel = null, ) { + $this->menu = $menu; $this->menuFactory = $menuFactory; $this->collectionFactory = $menuCollectionFactory; $this->menuSearchResultsFactory = $menuSearchResults; @@ -167,7 +172,7 @@ public function get($identifier, $storeId) $collection = $this->collectionFactory->create(); $collection->addFilter(new \Zend_Db_Expr('BINARY `identifier`'), $identifier); $collection->addFilter('is_active', 1); - $collection->join(['stores' => 'snowmenu_store'], 'main_table.menu_id = stores.menu_id', 'store_id'); + $collection->join(['stores' => 'snowmenu_store'], 'main_table.menu_id = stores.' . $this->menu->getIdColumnName(), 'store_id'); $collection->addFilter('store_id', $storeId); return $collection->getFirstItem(); } diff --git a/Service/Menu/Nodes.php b/Service/Menu/Nodes.php index 02f90761..3ac3793b 100644 --- a/Service/Menu/Nodes.php +++ b/Service/Menu/Nodes.php @@ -55,7 +55,7 @@ public function __construct( public function getList(MenuInterface $menu): array { $filterBuilder = $this->filterBuilderFactory->create(); - $filter = $filterBuilder->setField('menu_id') + $filter = $filterBuilder->setField($menu->getIdColumnName()) ->setValue($menu->getMenuId()) ->setConditionType('eq') ->create(); From 8a1ab1f52e6c283b40fea540c1772e48d90ad63b Mon Sep 17 00:00:00 2001 From: Martyna Maciejewska Date: Thu, 18 Jan 2024 15:16:13 +0100 Subject: [PATCH 03/18] Remove trailing comma --- Model/MenuRepository.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Model/MenuRepository.php b/Model/MenuRepository.php index b89771f8..e04d759d 100644 --- a/Model/MenuRepository.php +++ b/Model/MenuRepository.php @@ -44,7 +44,7 @@ public function __construct( CollectionFactory $menuCollectionFactory, MenuSearchResultsInterfaceFactory $menuSearchResults, MenuInterface $menu, - ResourceModel\Menu $menuResourceModel = null, + ResourceModel\Menu $menuResourceModel = null ) { $this->menu = $menu; $this->menuFactory = $menuFactory; From ecb329d83a754dde936ecd9965d1f05ea1ed673b Mon Sep 17 00:00:00 2001 From: Martyna Maciejewska Date: Thu, 18 Jan 2024 15:27:32 +0100 Subject: [PATCH 04/18] Resolve pipeline issue --- Model/Menu/NodeRepository.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Model/Menu/NodeRepository.php b/Model/Menu/NodeRepository.php index 1bcfc9f7..32f73db7 100644 --- a/Model/Menu/NodeRepository.php +++ b/Model/Menu/NodeRepository.php @@ -15,6 +15,9 @@ use Snowdog\Menu\Model\ResourceModel\Menu\Node\CollectionFactory; use Magento\Framework\Api\SortOrder; +/** + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ class NodeRepository implements NodeRepositoryInterface { /** From 525e4e94fdc9a8b57cdc4828563ad61a4d8a0649 Mon Sep 17 00:00:00 2001 From: Martyna Maciejewska Date: Fri, 19 Jan 2024 11:39:39 +0100 Subject: [PATCH 05/18] Get link field --- Api/Data/MenuInterface.php | 9 +++----- Model/Menu.php | 43 ++++++++++++++++++++++++++++++----- Model/Menu/NodeRepository.php | 2 +- Model/MenuRepository.php | 2 +- Service/Menu/Nodes.php | 2 +- etc/di.xml | 11 +++++++++ 6 files changed, 54 insertions(+), 15 deletions(-) diff --git a/Api/Data/MenuInterface.php b/Api/Data/MenuInterface.php index fe602382..69e257ce 100644 --- a/Api/Data/MenuInterface.php +++ b/Api/Data/MenuInterface.php @@ -122,10 +122,7 @@ public function getIsActive(); */ public function setIsActive($isActive); - /** - * Get ID column name - * - * @return string - */ - public function getIdColumnName(): string; + public function getLinkField(): string; + + public function getLinkValue(); } diff --git a/Model/Menu.php b/Model/Menu.php index f7974f64..e32bccf0 100644 --- a/Model/Menu.php +++ b/Model/Menu.php @@ -1,8 +1,13 @@ metadataPool = $metadataPool; + parent::__construct($context, $registry, $resource, $resourceCollection, $data); + } + protected function _construct() { $this->_init(\Snowdog\Menu\Model\ResourceModel\Menu::class); @@ -28,8 +50,8 @@ public function getStores() { $connection = $this->getResource()->getConnection(); $select = $connection->select()->from($this->getResource()->getTable('snowmenu_store'), ['store_id'])->where( - $this->getIdColumnName() . ' = ?', - $this->getId() + $this->getLinkField() . ' = ?', + $this->getLinkValue() ); return $connection->fetchCol($select); } @@ -46,9 +68,9 @@ public function saveStores(array $stores) $connection = $this->getResource()->getConnection(); $connection->beginTransaction(); $table = $this->getResource()->getTable('snowmenu_store'); - $connection->delete($table, [$this->getIdColumnName() . ' = ?' => $this->getId()]); + $connection->delete($table, [$this->getLinkField() . ' = ?' => $this->getLinkValue()]); foreach ($stores as $store) { - $connection->insert($table, [$this->getIdColumnName() => $this->getId(), 'store_id' => $store]); + $connection->insert($table, [$this->getLinkField() => $this->getLinkValue(), 'store_id' => $store]); } $connection->commit(); @@ -170,8 +192,17 @@ public function setIsActive($isActive) /** * @inheritdoc */ - public function getIdColumnName(): string + public function getLinkField(): string + { + $metadata = $this->metadataPool->getMetadata(MenuInterface::class); + return $metadata->getLinkField(); + } + + /** + * @inheritdoc + */ + public function getLinkValue(): string { - return self::MENU_ID; + return (string) $this->getData($this->getLinkField()); } } diff --git a/Model/Menu/NodeRepository.php b/Model/Menu/NodeRepository.php index 32f73db7..735999ee 100644 --- a/Model/Menu/NodeRepository.php +++ b/Model/Menu/NodeRepository.php @@ -148,7 +148,7 @@ public function getList(SearchCriteriaInterface $criteria) public function getByMenu($menuId) { $collection = $this->collectionFactory->create(); - $collection->addFilter($this->menu->getIdColumnName(), $menuId); + $collection->addFilter($this->menu->getLinkField(), $menuId); $collection->addOrder('level', AbstractCollection::SORT_ORDER_ASC); $collection->addOrder('parent_id', AbstractCollection::SORT_ORDER_ASC); $collection->addOrder('position', AbstractCollection::SORT_ORDER_ASC); diff --git a/Model/MenuRepository.php b/Model/MenuRepository.php index e04d759d..1cfe5082 100644 --- a/Model/MenuRepository.php +++ b/Model/MenuRepository.php @@ -172,7 +172,7 @@ public function get($identifier, $storeId) $collection = $this->collectionFactory->create(); $collection->addFilter(new \Zend_Db_Expr('BINARY `identifier`'), $identifier); $collection->addFilter('is_active', 1); - $collection->join(['stores' => 'snowmenu_store'], 'main_table.menu_id = stores.' . $this->menu->getIdColumnName(), 'store_id'); + $collection->join(['stores' => 'snowmenu_store'], 'main_table.menu_id = stores.' . $this->menu->getLinkField(), 'store_id'); $collection->addFilter('store_id', $storeId); return $collection->getFirstItem(); } diff --git a/Service/Menu/Nodes.php b/Service/Menu/Nodes.php index 3ac3793b..ef9106b5 100644 --- a/Service/Menu/Nodes.php +++ b/Service/Menu/Nodes.php @@ -55,7 +55,7 @@ public function __construct( public function getList(MenuInterface $menu): array { $filterBuilder = $this->filterBuilderFactory->create(); - $filter = $filterBuilder->setField($menu->getIdColumnName()) + $filter = $filterBuilder->setField($menu->getLinkField()) ->setValue($menu->getMenuId()) ->setConditionType('eq') ->create(); diff --git a/etc/di.xml b/etc/di.xml index bf2f437f..87455444 100644 --- a/etc/di.xml +++ b/etc/di.xml @@ -74,4 +74,15 @@ Snowdog\Menu\Model\ImportExport\Processor\Import\Node\Validator\Proxy + + + + + + snowmenu_menu + menu_id + + + + From b4945392422f8bd42e70aebb96e79bf5a873cdbd Mon Sep 17 00:00:00 2001 From: Martyna Maciejewska Date: Fri, 19 Jan 2024 13:46:02 +0100 Subject: [PATCH 06/18] Remove trailing comma --- Model/Menu.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Model/Menu.php b/Model/Menu.php index e32bccf0..267bb2fc 100644 --- a/Model/Menu.php +++ b/Model/Menu.php @@ -30,7 +30,7 @@ public function __construct( Registry $registry, AbstractResource $resource = null, AbstractDb $resourceCollection = null, - array $data = [], + array $data = [] ) { $this->metadataPool = $metadataPool; parent::__construct($context, $registry, $resource, $resourceCollection, $data); From 6d1825742a20d79e46952b8cce4eae1fd69e6575 Mon Sep 17 00:00:00 2001 From: Martyna Maciejewska Date: Fri, 19 Jan 2024 16:23:08 +0100 Subject: [PATCH 07/18] Get row id for nodes --- Model/ImportExport/Processor/Export/Node.php | 10 +++++++++- Service/Menu/SaveRequestProcessor.php | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Model/ImportExport/Processor/Export/Node.php b/Model/ImportExport/Processor/Export/Node.php index 77b51209..22943d95 100644 --- a/Model/ImportExport/Processor/Export/Node.php +++ b/Model/ImportExport/Processor/Export/Node.php @@ -7,6 +7,7 @@ use Magento\Framework\Api\SearchCriteriaBuilder; use Magento\Framework\Api\SortOrder; use Magento\Framework\Api\SortOrderBuilder; +use Snowdog\Menu\Api\Data\MenuInterface; use Snowdog\Menu\Api\Data\NodeInterface; use Snowdog\Menu\Api\NodeRepositoryInterface; use Snowdog\Menu\Model\ImportExport\Processor\Export\Node\Tree as NodeTree; @@ -40,7 +41,13 @@ class Node */ private $nodeTree; + /** + * @var MenuInterface + */ + private $menu; + public function __construct( + MenuInterface $menu, SearchCriteriaBuilder $searchCriteriaBuilder, SortOrderBuilder $sortOrderBuilder, NodeRepositoryInterface $nodeRepository, @@ -50,6 +57,7 @@ public function __construct( $this->sortOrderBuilder = $sortOrderBuilder; $this->nodeRepository = $nodeRepository; $this->nodeTree = $nodeTree; + $this->menu = $menu; } public function getList(int $menuId): array @@ -60,7 +68,7 @@ public function getList(int $menuId): array ->create(); $searchCriteria = $this->searchCriteriaBuilder - ->addFilter(NodeInterface::MENU_ID, $menuId) + ->addFilter($this->menu->getLinkField(), $menuId) ->setSortOrders([$sortOrder]) ->create(); diff --git a/Service/Menu/SaveRequestProcessor.php b/Service/Menu/SaveRequestProcessor.php index 546feec8..7d1e4b3b 100644 --- a/Service/Menu/SaveRequestProcessor.php +++ b/Service/Menu/SaveRequestProcessor.php @@ -106,7 +106,7 @@ public function saveData(MenuInterface $menu, array $nodes = []): void if (!isset($invalidNodes[$nodeId])) { $nodeObject = $this->nodeFactory->create(); - $nodeObject->setMenuId($menu->getMenuId()); + $nodeObject->setData($menu->getLinkField(), $menu->getLinkValue()); $nodeObject = $this->nodeRepository->save($nodeObject); $nodeMap[$nodeId] = $nodeObject; } From 186f5d28dc50458bbcb8e90b831d1d0d4d0a8755 Mon Sep 17 00:00:00 2001 From: Martyna Maciejewska Date: Mon, 22 Jan 2024 08:31:43 +0100 Subject: [PATCH 08/18] Updated column name --- Model/MenuRepository.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Model/MenuRepository.php b/Model/MenuRepository.php index 1cfe5082..af593f93 100644 --- a/Model/MenuRepository.php +++ b/Model/MenuRepository.php @@ -172,7 +172,7 @@ public function get($identifier, $storeId) $collection = $this->collectionFactory->create(); $collection->addFilter(new \Zend_Db_Expr('BINARY `identifier`'), $identifier); $collection->addFilter('is_active', 1); - $collection->join(['stores' => 'snowmenu_store'], 'main_table.menu_id = stores.' . $this->menu->getLinkField(), 'store_id'); + $collection->join(['stores' => 'snowmenu_store'], 'main_table.' . $this->menu->getLinkField() . ' = stores.' . $this->menu->getLinkField(), 'store_id'); $collection->addFilter('store_id', $storeId); return $collection->getFirstItem(); } From a17553152c1a5d30be9b165773f8fdaf08e041fa Mon Sep 17 00:00:00 2001 From: Martyna Maciejewska Date: Mon, 22 Jan 2024 10:30:55 +0100 Subject: [PATCH 09/18] Get nodes by menu's row_id --- Block/Adminhtml/Edit/Tab/Nodes.php | 2 +- Service/Menu/Nodes.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Block/Adminhtml/Edit/Tab/Nodes.php b/Block/Adminhtml/Edit/Tab/Nodes.php index e433e850..26b21ecf 100644 --- a/Block/Adminhtml/Edit/Tab/Nodes.php +++ b/Block/Adminhtml/Edit/Tab/Nodes.php @@ -67,7 +67,7 @@ public function renderNodes() $menu = $this->registry->registry(Edit::REGISTRY_CODE); $data = []; if ($menu) { - $nodes = $this->nodeRepository->getByMenu($menu->getId()); + $nodes = $this->nodeRepository->getByMenu($menu->getLinkValue()); if (!empty($nodes)) { foreach ($nodes as $node) { $level = $node->getLevel(); diff --git a/Service/Menu/Nodes.php b/Service/Menu/Nodes.php index ef9106b5..93926866 100644 --- a/Service/Menu/Nodes.php +++ b/Service/Menu/Nodes.php @@ -56,7 +56,7 @@ public function getList(MenuInterface $menu): array { $filterBuilder = $this->filterBuilderFactory->create(); $filter = $filterBuilder->setField($menu->getLinkField()) - ->setValue($menu->getMenuId()) + ->setValue($menu->getLinkValue()) ->setConditionType('eq') ->create(); From 25166d42037cc05c77a1170b0958f09e7b5bdaea Mon Sep 17 00:00:00 2001 From: Martyna Maciejewska Date: Wed, 24 Jan 2024 08:48:56 +0100 Subject: [PATCH 10/18] Get serialized node data for scheduler --- Controller/Adminhtml/Menu/Delete.php | 4 ++-- view/adminhtml/web/vue/app.vue | 13 +++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/Controller/Adminhtml/Menu/Delete.php b/Controller/Adminhtml/Menu/Delete.php index c767f6fe..8ae90d9e 100644 --- a/Controller/Adminhtml/Menu/Delete.php +++ b/Controller/Adminhtml/Menu/Delete.php @@ -87,8 +87,8 @@ public function execute() $this->menuRepository->delete($menu); $filterBuilder = $this->filterBuilderFactory->create(); - $filter = $filterBuilder->setField('menu_id') - ->setValue($menu->getMenuId()) + $filter = $filterBuilder->setField($menu->getLinkField()) + ->setValue($menu->getLinkValue()) ->setConditionType('eq') ->create(); diff --git a/view/adminhtml/web/vue/app.vue b/view/adminhtml/web/vue/app.vue index 3e5494de..4ea48d4d 100644 --- a/view/adminhtml/web/vue/app.vue +++ b/view/adminhtml/web/vue/app.vue @@ -91,6 +91,7 @@ watch: { jsonList: function (newValue) { this.updateSerializedNodes(newValue) + this.updateMenuStagingSerializedNodes(newValue); } }, mounted () { @@ -113,6 +114,10 @@ this.list = this.nodes.map(item => setUuidRecursive(item)) this.updateSerializedNodes(this.jsonList); }); + checkElement('[name="snowmenu_staging_serialized_nodes"]').then(() => { + this.list = this.nodes.map(item => setUuidRecursive(item)) + this.updateMenuStagingSerializedNodes(this.jsonList); + }); }, methods: { uuid, @@ -148,6 +153,14 @@ serializedNodeInput.value = value; // trigger change event to set value serializedNodeInput.dispatchEvent(updateEvent); + }, + updateMenuStagingSerializedNodes(value) { + const updateEvent = new Event('change'); + const serializedNodeInput = document.querySelector('[name="snowmenu_staging_serialized_nodes"]'); + // update serialized_nodes input value + serializedNodeInput.value = value; + // trigger change event to set value + serializedNodeInput.dispatchEvent(updateEvent); } }, template: template From 7b5386199fabf1486469765d80653cac9963c053 Mon Sep 17 00:00:00 2001 From: Martyna Maciejewska Date: Fri, 26 Jan 2024 15:27:17 +0100 Subject: [PATCH 11/18] Added helper to get link field for menu --- Api/Data/MenuInterface.php | 4 --- Block/Adminhtml/Edit/Tab/Nodes.php | 10 +++++- Controller/Adminhtml/Menu/Delete.php | 13 ++++++-- Helper/MenuHelper.php | 32 ++++++++++++++++++ Model/ImportExport/Processor/Export/Node.php | 11 ++++--- Model/Menu.php | 34 ++++++-------------- Model/Menu/NodeRepository.php | 11 ++++--- Model/MenuRepository.php | 19 +++++++---- Service/Menu/Nodes.php | 14 ++++++-- 9 files changed, 97 insertions(+), 51 deletions(-) create mode 100644 Helper/MenuHelper.php diff --git a/Api/Data/MenuInterface.php b/Api/Data/MenuInterface.php index 69e257ce..1bcf4d33 100644 --- a/Api/Data/MenuInterface.php +++ b/Api/Data/MenuInterface.php @@ -121,8 +121,4 @@ public function getIsActive(); * @return $this */ public function setIsActive($isActive); - - public function getLinkField(): string; - - public function getLinkValue(); } diff --git a/Block/Adminhtml/Edit/Tab/Nodes.php b/Block/Adminhtml/Edit/Tab/Nodes.php index 26b21ecf..8e02af69 100644 --- a/Block/Adminhtml/Edit/Tab/Nodes.php +++ b/Block/Adminhtml/Edit/Tab/Nodes.php @@ -7,6 +7,7 @@ use Magento\Framework\Registry; use Snowdog\Menu\Api\NodeRepositoryInterface; use Snowdog\Menu\Controller\Adminhtml\Menu\Edit; +use Snowdog\Menu\Helper\MenuHelper; use Snowdog\Menu\Model\Menu\Node\Image\File as ImageFile; use Snowdog\Menu\Model\NodeTypeProvider; use Snowdog\Menu\Model\VueProvider; @@ -45,7 +46,13 @@ class Nodes extends Template implements TabInterface */ private $vueProvider; + /** + * @var MenuHelper + */ + private $menuHelper; + public function __construct( + MenuHelper $menuHelper, Template\Context $context, NodeRepositoryInterface $nodeRepository, ImageFile $imageFile, @@ -60,6 +67,7 @@ public function __construct( $this->nodeTypeProvider = $nodeTypeProvider; $this->imageFile = $imageFile; $this->vueProvider = $vueProvider; + $this->menuHelper = $menuHelper; } public function renderNodes() @@ -67,7 +75,7 @@ public function renderNodes() $menu = $this->registry->registry(Edit::REGISTRY_CODE); $data = []; if ($menu) { - $nodes = $this->nodeRepository->getByMenu($menu->getLinkValue()); + $nodes = $this->nodeRepository->getByMenu($this->menuHelper->getLinkValue($menu)); if (!empty($nodes)) { foreach ($nodes as $node) { $level = $node->getLevel(); diff --git a/Controller/Adminhtml/Menu/Delete.php b/Controller/Adminhtml/Menu/Delete.php index 8ae90d9e..7fe2dfce 100644 --- a/Controller/Adminhtml/Menu/Delete.php +++ b/Controller/Adminhtml/Menu/Delete.php @@ -16,6 +16,7 @@ use Magento\Framework\Controller\ResultInterface; use Magento\Framework\Exception\NotFoundException; use Snowdog\Menu\Controller\Adminhtml\MenuAction; +use Snowdog\Menu\Helper\MenuHelper; use Snowdog\Menu\Model\MenuFactory; /** @@ -46,6 +47,12 @@ class Delete extends MenuAction private $searchCriteriaBuilderFactory; /** + * @var MenuHelper + */ + private $menuHelper; + + /** + * @param MenuHelper $menuHelper * @param Action\Context $context * @param MenuRepositoryInterface $menuRepository * @param NodeRepositoryInterface $nodeRepository @@ -55,6 +62,7 @@ class Delete extends MenuAction * @param MenuFactory $menuFactory */ public function __construct( + MenuHelper $menuHelper, Action\Context $context, MenuRepositoryInterface $menuRepository, NodeRepositoryInterface $nodeRepository, @@ -64,6 +72,7 @@ public function __construct( MenuFactory $menuFactory ) { parent::__construct($context, $menuRepository, $menuFactory); + $this->menuHelper = $menuHelper; $this->nodeRepository = $nodeRepository; $this->filterBuilderFactory = $filterBuilderFactory; $this->filterGroupBuilderFactory = $filterGroupBuilderFactory; @@ -87,8 +96,8 @@ public function execute() $this->menuRepository->delete($menu); $filterBuilder = $this->filterBuilderFactory->create(); - $filter = $filterBuilder->setField($menu->getLinkField()) - ->setValue($menu->getLinkValue()) + $filter = $filterBuilder->setField($this->menuHelper->getLinkField()) + ->setValue($this->menuHelper->getLinkValue($menu)) ->setConditionType('eq') ->create(); diff --git a/Helper/MenuHelper.php b/Helper/MenuHelper.php new file mode 100644 index 00000000..15edbaaa --- /dev/null +++ b/Helper/MenuHelper.php @@ -0,0 +1,32 @@ +metadataPool = $metadataPool; + parent::__construct($context); + } + + public function getLinkField(): string + { + $metadata = $this->metadataPool->getMetadata(MenuInterface::class); + return $metadata->getLinkField(); + } + + public function getLinkValue(MenuInterface $menu): string + { + return (string) $menu->getData($this->getLinkField()); + } +} diff --git a/Model/ImportExport/Processor/Export/Node.php b/Model/ImportExport/Processor/Export/Node.php index 22943d95..681100c0 100644 --- a/Model/ImportExport/Processor/Export/Node.php +++ b/Model/ImportExport/Processor/Export/Node.php @@ -10,6 +10,7 @@ use Snowdog\Menu\Api\Data\MenuInterface; use Snowdog\Menu\Api\Data\NodeInterface; use Snowdog\Menu\Api\NodeRepositoryInterface; +use Snowdog\Menu\Helper\MenuHelper; use Snowdog\Menu\Model\ImportExport\Processor\Export\Node\Tree as NodeTree; class Node @@ -42,12 +43,12 @@ class Node private $nodeTree; /** - * @var MenuInterface + * @var MenuHelper */ - private $menu; + private $menuHelper; public function __construct( - MenuInterface $menu, + MenuHelper $menuHelper, SearchCriteriaBuilder $searchCriteriaBuilder, SortOrderBuilder $sortOrderBuilder, NodeRepositoryInterface $nodeRepository, @@ -57,7 +58,7 @@ public function __construct( $this->sortOrderBuilder = $sortOrderBuilder; $this->nodeRepository = $nodeRepository; $this->nodeTree = $nodeTree; - $this->menu = $menu; + $this->menuHelper = $menuHelper; } public function getList(int $menuId): array @@ -68,7 +69,7 @@ public function getList(int $menuId): array ->create(); $searchCriteria = $this->searchCriteriaBuilder - ->addFilter($this->menu->getLinkField(), $menuId) + ->addFilter($this->menuHelper->getLinkField(), $menuId) ->setSortOrders([$sortOrder]) ->create(); diff --git a/Model/Menu.php b/Model/Menu.php index 267bb2fc..6afc6689 100644 --- a/Model/Menu.php +++ b/Model/Menu.php @@ -9,6 +9,7 @@ use Magento\Framework\Model\ResourceModel\AbstractResource; use Magento\Framework\Registry; use Snowdog\Menu\Api\Data\MenuInterface; +use Snowdog\Menu\Helper\MenuHelper; /** * @method string getCssClass() @@ -20,19 +21,19 @@ class Menu extends AbstractModel implements MenuInterface, IdentityInterface protected $_cacheTag = self::CACHE_TAG; /** - * @var MetadataPool + * @var MenuHelper */ - public $metadataPool; + public $menuHelper; public function __construct( - MetadataPool $metadataPool, + MenuHelper $menuHelper, Context $context, Registry $registry, AbstractResource $resource = null, AbstractDb $resourceCollection = null, array $data = [] ) { - $this->metadataPool = $metadataPool; + $this->menuHelper = $menuHelper; parent::__construct($context, $registry, $resource, $resourceCollection, $data); } @@ -50,8 +51,8 @@ public function getStores() { $connection = $this->getResource()->getConnection(); $select = $connection->select()->from($this->getResource()->getTable('snowmenu_store'), ['store_id'])->where( - $this->getLinkField() . ' = ?', - $this->getLinkValue() + $this->menuHelper->getLinkField() . ' = ?', + $this->menuHelper->getLinkValue($this) ); return $connection->fetchCol($select); } @@ -68,9 +69,9 @@ public function saveStores(array $stores) $connection = $this->getResource()->getConnection(); $connection->beginTransaction(); $table = $this->getResource()->getTable('snowmenu_store'); - $connection->delete($table, [$this->getLinkField() . ' = ?' => $this->getLinkValue()]); + $connection->delete($table, [$this->menuHelper->getLinkField() . ' = ?' => $this->menuHelper->getLinkValue($this)]); foreach ($stores as $store) { - $connection->insert($table, [$this->getLinkField() => $this->getLinkValue(), 'store_id' => $store]); + $connection->insert($table, [$this->menuHelper->getLinkField() => $this->menuHelper->getLinkValue($this), 'store_id' => $store]); } $connection->commit(); @@ -188,21 +189,4 @@ public function setIsActive($isActive) { return $this->setData(MenuInterface::IS_ACTIVE, $isActive); } - - /** - * @inheritdoc - */ - public function getLinkField(): string - { - $metadata = $this->metadataPool->getMetadata(MenuInterface::class); - return $metadata->getLinkField(); - } - - /** - * @inheritdoc - */ - public function getLinkValue(): string - { - return (string) $this->getData($this->getLinkField()); - } } diff --git a/Model/Menu/NodeRepository.php b/Model/Menu/NodeRepository.php index 735999ee..4791c0e7 100644 --- a/Model/Menu/NodeRepository.php +++ b/Model/Menu/NodeRepository.php @@ -12,6 +12,7 @@ use Snowdog\Menu\Api\Data\MenuInterface; use Snowdog\Menu\Api\Data\NodeInterface; use Snowdog\Menu\Api\NodeRepositoryInterface; +use Snowdog\Menu\Helper\MenuHelper; use Snowdog\Menu\Model\ResourceModel\Menu\Node\CollectionFactory; use Magento\Framework\Api\SortOrder; @@ -21,9 +22,9 @@ class NodeRepository implements NodeRepositoryInterface { /** - * @var MenuInterface + * @var MenuHelper */ - protected $menu; + protected $menuHelper; /** * @var NodeFactory @@ -44,9 +45,9 @@ public function __construct( NodeFactory $objectFactory, CollectionFactory $collectionFactory, SearchResultsInterfaceFactory $searchResultsFactory, - MenuInterface $menu + MenuHelper $menuHelper ) { - $this->menu = $menu; + $this->menuHelper = $menuHelper; $this->objectFactory = $objectFactory; $this->collectionFactory = $collectionFactory; $this->searchResultsFactory = $searchResultsFactory; @@ -148,7 +149,7 @@ public function getList(SearchCriteriaInterface $criteria) public function getByMenu($menuId) { $collection = $this->collectionFactory->create(); - $collection->addFilter($this->menu->getLinkField(), $menuId); + $collection->addFilter($this->menuHelper->getLinkField(), $menuId); $collection->addOrder('level', AbstractCollection::SORT_ORDER_ASC); $collection->addOrder('parent_id', AbstractCollection::SORT_ORDER_ASC); $collection->addOrder('position', AbstractCollection::SORT_ORDER_ASC); diff --git a/Model/MenuRepository.php b/Model/MenuRepository.php index af593f93..5ade19a3 100644 --- a/Model/MenuRepository.php +++ b/Model/MenuRepository.php @@ -10,6 +10,8 @@ use Snowdog\Menu\Api\Data\MenuInterface; use Snowdog\Menu\Api\Data\MenuSearchResultsInterfaceFactory; use Snowdog\Menu\Api\MenuRepositoryInterface; +use Snowdog\Menu\Helper\MenuHelper; +use Snowdog\Menu\Model\ResourceModel\Menu; use Snowdog\Menu\Model\ResourceModel\Menu\Collection; use Snowdog\Menu\Model\ResourceModel\Menu\CollectionFactory; @@ -18,8 +20,8 @@ */ class MenuRepository implements MenuRepositoryInterface { - /** @var MenuInterface */ - protected $menu; + /** @var MenuHelper */ + protected $menuHelper; /** @var MenuFactory */ protected $menuFactory; @@ -37,16 +39,17 @@ class MenuRepository implements MenuRepositoryInterface * @param MenuFactory $menuFactory * @param CollectionFactory $menuCollectionFactory * @param MenuSearchResultsInterfaceFactory $menuSearchResults - * @param ResourceModel\Menu|null $menuResourceModel + * @param MenuHelper $menuHelper + * @param Menu|null $menuResourceModel */ public function __construct( MenuFactory $menuFactory, CollectionFactory $menuCollectionFactory, MenuSearchResultsInterfaceFactory $menuSearchResults, - MenuInterface $menu, + MenuHelper $menuHelper, ResourceModel\Menu $menuResourceModel = null ) { - $this->menu = $menu; + $this->menuHelper = $menuHelper; $this->menuFactory = $menuFactory; $this->collectionFactory = $menuCollectionFactory; $this->menuSearchResultsFactory = $menuSearchResults; @@ -172,7 +175,11 @@ public function get($identifier, $storeId) $collection = $this->collectionFactory->create(); $collection->addFilter(new \Zend_Db_Expr('BINARY `identifier`'), $identifier); $collection->addFilter('is_active', 1); - $collection->join(['stores' => 'snowmenu_store'], 'main_table.' . $this->menu->getLinkField() . ' = stores.' . $this->menu->getLinkField(), 'store_id'); + $collection->join( + ['stores' => 'snowmenu_store'], + 'main_table.' . $this->menuHelper->getLinkField() . ' = stores.' . $this->menuHelper->getLinkField(), + 'store_id' + ); $collection->addFilter('store_id', $storeId); return $collection->getFirstItem(); } diff --git a/Service/Menu/Nodes.php b/Service/Menu/Nodes.php index 93926866..eeb84a5e 100644 --- a/Service/Menu/Nodes.php +++ b/Service/Menu/Nodes.php @@ -10,6 +10,7 @@ use Magento\Framework\Api\SortOrderBuilder; use Snowdog\Menu\Api\Data\MenuInterface; use Snowdog\Menu\Api\NodeRepositoryInterface; +use Snowdog\Menu\Helper\MenuHelper; class Nodes { @@ -38,25 +39,32 @@ class Nodes */ private $sortOrderBuilder; + /** + * @var MenuHelper + */ + private $menuHelper; + public function __construct( FilterBuilderFactory $filterBuilderFactory, FilterGroupBuilderFactory $filterGroupBuilderFactory, SearchCriteriaBuilderFactory $searchCriteriaBuilderFactory, NodeRepositoryInterface $nodeRepository, - SortOrderBuilder $sortOrderBuilder + SortOrderBuilder $sortOrderBuilder, + MenuHelper $menuHelper ) { $this->filterBuilderFactory = $filterBuilderFactory; $this->filterGroupBuilderFactory = $filterGroupBuilderFactory; $this->searchCriteriaBuilderFactory = $searchCriteriaBuilderFactory; $this->nodeRepository = $nodeRepository; $this->sortOrderBuilder = $sortOrderBuilder; + $this->menuHelper = $menuHelper; } public function getList(MenuInterface $menu): array { $filterBuilder = $this->filterBuilderFactory->create(); - $filter = $filterBuilder->setField($menu->getLinkField()) - ->setValue($menu->getLinkValue()) + $filter = $filterBuilder->setField($this->menuHelper->getLinkField()) + ->setValue($this->menuHelper->getLinkValue($menu)) ->setConditionType('eq') ->create(); From 261c712a1f6c47395ebf1afb4ccc4a1bd56c7278 Mon Sep 17 00:00:00 2001 From: Martyna Maciejewska Date: Fri, 26 Jan 2024 15:42:26 +0100 Subject: [PATCH 12/18] Removed trailing comma --- Helper/MenuHelper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Helper/MenuHelper.php b/Helper/MenuHelper.php index 15edbaaa..9392cc75 100644 --- a/Helper/MenuHelper.php +++ b/Helper/MenuHelper.php @@ -13,7 +13,7 @@ class MenuHelper extends AbstractHelper public function __construct( MetadataPool $metadataPool, - Context $context, + Context $context ) { $this->metadataPool = $metadataPool; parent::__construct($context); From 32ec3df6097ac88170ebd7a819e6e863ca010b85 Mon Sep 17 00:00:00 2001 From: Martyna Maciejewska Date: Fri, 26 Jan 2024 16:49:29 +0100 Subject: [PATCH 13/18] Get menu by link field --- Service/Menu/SaveRequestProcessor.php | 12 ++++++++++-- Ui/Component/Listing/Column/MenuList/PageActions.php | 12 ++++++++++-- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/Service/Menu/SaveRequestProcessor.php b/Service/Menu/SaveRequestProcessor.php index 7d1e4b3b..990ce5d2 100644 --- a/Service/Menu/SaveRequestProcessor.php +++ b/Service/Menu/SaveRequestProcessor.php @@ -9,6 +9,7 @@ use Snowdog\Menu\Api\Data\MenuInterface; use Snowdog\Menu\Api\Data\NodeInterface; use Snowdog\Menu\Api\NodeRepositoryInterface; +use Snowdog\Menu\Helper\MenuHelper; use Snowdog\Menu\Model\Menu\Node\Image\File as NodeImageFile; use Snowdog\Menu\Model\Menu\Node\Image\Node as ImageNode; use Snowdog\Menu\Model\Menu\Node\Validator as NodeValidator; @@ -52,6 +53,11 @@ class SaveRequestProcessor */ private $menuNodes; + /** + * @var MenuHelper + */ + private $menuHelper; + public function __construct( ManagerInterface $messageManager, NodeRepositoryInterface $nodeRepository, @@ -59,7 +65,8 @@ public function __construct( ImageNode $imageNode, NodeValidator $nodeValidator, NodeFactory $nodeFactory, - MenuNodes $menuNodes + MenuNodes $menuNodes, + MenuHelper $menuHelper ) { $this->messageManager = $messageManager; $this->nodeRepository = $nodeRepository; @@ -68,6 +75,7 @@ public function __construct( $this->nodeValidator = $nodeValidator; $this->nodeFactory = $nodeFactory; $this->menuNodes = $menuNodes; + $this->menuHelper = $menuHelper; } /** @@ -106,7 +114,7 @@ public function saveData(MenuInterface $menu, array $nodes = []): void if (!isset($invalidNodes[$nodeId])) { $nodeObject = $this->nodeFactory->create(); - $nodeObject->setData($menu->getLinkField(), $menu->getLinkValue()); + $nodeObject->setData($this->menuHelper->getLinkField(), $this->menuHelper->getLinkValue($menu)); $nodeObject = $this->nodeRepository->save($nodeObject); $nodeMap[$nodeId] = $nodeObject; } diff --git a/Ui/Component/Listing/Column/MenuList/PageActions.php b/Ui/Component/Listing/Column/MenuList/PageActions.php index c136bdff..ef8ad65b 100644 --- a/Ui/Component/Listing/Column/MenuList/PageActions.php +++ b/Ui/Component/Listing/Column/MenuList/PageActions.php @@ -8,6 +8,7 @@ use Magento\Framework\View\Element\UiComponent\ContextInterface; use Magento\Framework\View\Element\UiComponentFactory; use Magento\Framework\UrlInterface; +use Snowdog\Menu\Helper\MenuHelper; /** * Class PageActions @@ -30,6 +31,11 @@ class PageActions extends Column */ private $urlBuilder; + /** + * @var MenuHelper + */ + private $menuHelper; + /** * @param ContextInterface $context * @param UiComponentFactory $uiComponentFactory @@ -38,12 +44,14 @@ class PageActions extends Column * @param array $data */ public function __construct( + MenuHelper $menuHelper, ContextInterface $context, UiComponentFactory $uiComponentFactory, UrlInterface $urlBuilder, array $components = [], array $data = [] ) { + $this->menuHelper = $menuHelper; $this->urlBuilder = $urlBuilder; parent::__construct( $context, @@ -57,9 +65,9 @@ public function prepareDataSource(array $dataSource): array { if (isset($dataSource['data']['items'])) { foreach ($dataSource['data']['items'] as & $item) { - if (isset($item['menu_id'])) { + if (isset($item[$this->menuHelper->getLinkField()])) { $name = $this->getData('name'); - $menuId = (int) $item['menu_id']; + $menuId = (int) $item[$this->menuHelper->getLinkField()]; $isActive = (int) $item['is_active'] === 1; $item[$name] = [ 'edit' => $this->getEditButton($menuId), From 1081f089d08013985822fe9f55c846ded092c66a Mon Sep 17 00:00:00 2001 From: Martyna Maciejewska Date: Tue, 6 Feb 2024 10:55:00 +0100 Subject: [PATCH 14/18] Revert changes in PageActions class --- Ui/Component/Listing/Column/MenuList/PageActions.php | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/Ui/Component/Listing/Column/MenuList/PageActions.php b/Ui/Component/Listing/Column/MenuList/PageActions.php index ef8ad65b..c136bdff 100644 --- a/Ui/Component/Listing/Column/MenuList/PageActions.php +++ b/Ui/Component/Listing/Column/MenuList/PageActions.php @@ -8,7 +8,6 @@ use Magento\Framework\View\Element\UiComponent\ContextInterface; use Magento\Framework\View\Element\UiComponentFactory; use Magento\Framework\UrlInterface; -use Snowdog\Menu\Helper\MenuHelper; /** * Class PageActions @@ -31,11 +30,6 @@ class PageActions extends Column */ private $urlBuilder; - /** - * @var MenuHelper - */ - private $menuHelper; - /** * @param ContextInterface $context * @param UiComponentFactory $uiComponentFactory @@ -44,14 +38,12 @@ class PageActions extends Column * @param array $data */ public function __construct( - MenuHelper $menuHelper, ContextInterface $context, UiComponentFactory $uiComponentFactory, UrlInterface $urlBuilder, array $components = [], array $data = [] ) { - $this->menuHelper = $menuHelper; $this->urlBuilder = $urlBuilder; parent::__construct( $context, @@ -65,9 +57,9 @@ public function prepareDataSource(array $dataSource): array { if (isset($dataSource['data']['items'])) { foreach ($dataSource['data']['items'] as & $item) { - if (isset($item[$this->menuHelper->getLinkField()])) { + if (isset($item['menu_id'])) { $name = $this->getData('name'); - $menuId = (int) $item[$this->menuHelper->getLinkField()]; + $menuId = (int) $item['menu_id']; $isActive = (int) $item['is_active'] === 1; $item[$name] = [ 'edit' => $this->getEditButton($menuId), From f3f6fcda484c8a89f6fc35b5c67e444085b29a9d Mon Sep 17 00:00:00 2001 From: Martyna Maciejewska Date: Tue, 6 Feb 2024 15:52:44 +0100 Subject: [PATCH 15/18] Updated actions to duplicate, export and import menus --- Model/ImportExport/Processor/Import.php | 1 + .../Processor/Import/Node/DataProcessor.php | 11 +++++++++-- Service/Menu/Cloner.php | 14 +++++++++++--- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/Model/ImportExport/Processor/Import.php b/Model/ImportExport/Processor/Import.php index 1d2c021f..ed22e532 100644 --- a/Model/ImportExport/Processor/Import.php +++ b/Model/ImportExport/Processor/Import.php @@ -60,6 +60,7 @@ public function importData(array $data): string $this->validateData($data); $menu = $this->createMenu($data); + $menuId = $menu->getId(); if (isset($data[ExtendedFields::NODES])) { $this->nodeProcessor->createNodes($data[ExtendedFields::NODES], (int) $menu->getId()); diff --git a/Model/ImportExport/Processor/Import/Node/DataProcessor.php b/Model/ImportExport/Processor/Import/Node/DataProcessor.php index f74e3d10..33fd657e 100644 --- a/Model/ImportExport/Processor/Import/Node/DataProcessor.php +++ b/Model/ImportExport/Processor/Import/Node/DataProcessor.php @@ -5,6 +5,7 @@ namespace Snowdog\Menu\Model\ImportExport\Processor\Import\Node; use Snowdog\Menu\Api\Data\NodeInterface; +use Snowdog\Menu\Helper\MenuHelper; use Snowdog\Menu\Model\ImportExport\Processor\ExtendedFields; use Snowdog\Menu\Model\ImportExport\Processor\Import\FieldProcessor\Boolean as BooleanField; use Snowdog\Menu\Model\ImportExport\Processor\Import\Node\TypeContent; @@ -21,10 +22,16 @@ class DataProcessor */ private $typeContent; - public function __construct(BooleanField $booleanField, TypeContent $typeContent) + /** + * @var MenuHelper + */ + private $menuHelper; + + public function __construct(BooleanField $booleanField, TypeContent $typeContent, MenuHelper $menuHelper) { $this->booleanField = $booleanField; $this->typeContent = $typeContent; + $this->menuHelper = $menuHelper; } public function getData( @@ -34,7 +41,7 @@ public function getData( int $position = 0, ?int $parentId = null ): array { - $data[NodeInterface::MENU_ID] = $menuId; + $data[$this->menuHelper->getLinkField()] = $menuId; $data[NodeInterface::PARENT_ID] = $parentId; $data[NodeInterface::LEVEL] = $level; $data[NodeInterface::POSITION] = $position; diff --git a/Service/Menu/Cloner.php b/Service/Menu/Cloner.php index 269e54b2..70776f3b 100644 --- a/Service/Menu/Cloner.php +++ b/Service/Menu/Cloner.php @@ -11,6 +11,7 @@ use Snowdog\Menu\Api\Data\NodeInterfaceFactory; use Snowdog\Menu\Api\MenuRepositoryInterface; use Snowdog\Menu\Api\NodeRepositoryInterface; +use Snowdog\Menu\Helper\MenuHelper; use Snowdog\Menu\Model\ImportExport\Processor\Import\Menu\Identifier as MenuIdentifierProcessor; use Snowdog\Menu\Model\NodeTypeProvider; use Snowdog\Menu\Service\Menu\Nodes as MenuNodes; @@ -57,6 +58,11 @@ class Cloner */ private $menuNodes; + /** + * @var MenuHelper + */ + private $menuHelper; + public function __construct( ResourceConnection $resource, MenuInterfaceFactory $menuFactory, @@ -65,7 +71,8 @@ public function __construct( NodeRepositoryInterface $nodeRepository, MenuIdentifierProcessor $menuIdentifierProcessor, NodeTypeProvider $nodeTypeProvider, - MenuNodes $menuNodes + MenuNodes $menuNodes, + MenuHelper $menuHelper ) { $this->resource = $resource; $this->menuFactory = $menuFactory; @@ -75,6 +82,7 @@ public function __construct( $this->menuIdentifierProcessor = $menuIdentifierProcessor; $this->nodeTypeProvider = $nodeTypeProvider; $this->menuNodes = $menuNodes; + $this->menuHelper = $menuHelper; } /** @@ -98,7 +106,7 @@ public function clone(MenuInterface $menu): MenuInterface $this->menuRepository->save($menuClone); $menuClone->saveStores($menu->getStores()); - $menuCloneId = $menuClone->getId(); + $menuCloneId = $this->menuHelper->getLinkValue($menuClone); $nodeIdMap = []; foreach ($this->menuNodes->getList($menu) as $node) { @@ -106,7 +114,7 @@ public function clone(MenuInterface $menu): MenuInterface $nodeClone->setData($node->getData()); $nodeClone->setId(null); - $nodeClone->setMenuId($menuCloneId); + $nodeClone->setData($this->menuHelper->getLinkField(), $menuCloneId); if (isset($nodeIdMap[$node->getParentId()])) { $nodeClone->setParentId($nodeIdMap[$node->getParentId()]); From 87c8b216556ed4ad78daf15c2b0d0bc89df0a22a Mon Sep 17 00:00:00 2001 From: Martyna Maciejewska Date: Thu, 8 Feb 2024 09:22:02 +0100 Subject: [PATCH 16/18] Get menu row_id for import and export actions --- Model/ImportExport/Processor/Export.php | 11 +++++++++-- Model/ImportExport/Processor/Import.php | 16 ++++++++++++---- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/Model/ImportExport/Processor/Export.php b/Model/ImportExport/Processor/Export.php index 6eb36716..833d7690 100644 --- a/Model/ImportExport/Processor/Export.php +++ b/Model/ImportExport/Processor/Export.php @@ -4,6 +4,7 @@ namespace Snowdog\Menu\Model\ImportExport\Processor; +use Snowdog\Menu\Helper\MenuHelper; use Snowdog\Menu\Model\ImportExport\Processor\Export\Menu; use Snowdog\Menu\Model\ImportExport\Processor\Export\Node; use Snowdog\Menu\Model\ImportExport\Processor\ExtendedFields; @@ -20,16 +21,22 @@ class Export */ private $node; - public function __construct(Menu $menu, Node $node) + /** + * @var MenuHelper + */ + private $menuHelper; + + public function __construct(Menu $menu, Node $node, MenuHelper $menuHelper) { $this->menu = $menu; $this->node = $node; + $this->menuHelper = $menuHelper; } public function getExportData(int $menuId): array { $data = $this->menu->getData($menuId); - $nodes = $this->node->getList($menuId); + $nodes = $this->node->getList((int) $data[$this->menuHelper->getLinkField()]); if ($nodes) { $data[ExtendedFields::NODES] = $nodes; diff --git a/Model/ImportExport/Processor/Import.php b/Model/ImportExport/Processor/Import.php index ed22e532..406e3532 100644 --- a/Model/ImportExport/Processor/Import.php +++ b/Model/ImportExport/Processor/Import.php @@ -6,6 +6,7 @@ use Magento\Framework\App\Config\ScopeConfigInterface; use Snowdog\Menu\Api\Data\MenuInterface; +use Snowdog\Menu\Helper\MenuHelper; use Snowdog\Menu\Model\ImportExport\Processor\Import\InvalidNodes as InvalidNodesProcessor; use Snowdog\Menu\Model\ImportExport\Processor\Import\Menu as MenuProcessor; use Snowdog\Menu\Model\ImportExport\Processor\Import\Node as NodeProcessor; @@ -33,23 +34,31 @@ class Import * @var InvalidNodesProcessor */ private $invalidNodesProcessor; + /** * @var ScopeConfigInterface */ private $scopeConfig; + /** + * @var MenuHelper + */ + private $menuHelper; + public function __construct( MenuProcessor $menuProcessor, NodeProcessor $nodeProcessor, ValidationAggregateError $validationAggregateError, InvalidNodesProcessor $invalidNodesProcessor, - ScopeConfigInterface $scopeConfig + ScopeConfigInterface $scopeConfig, + MenuHelper $menuHelper ) { $this->menuProcessor = $menuProcessor; $this->nodeProcessor = $nodeProcessor; $this->validationAggregateError = $validationAggregateError; $this->invalidNodesProcessor = $invalidNodesProcessor; $this->scopeConfig = $scopeConfig; + $this->menuHelper = $menuHelper; } /** @@ -60,10 +69,9 @@ public function importData(array $data): string $this->validateData($data); $menu = $this->createMenu($data); - $menuId = $menu->getId(); - + $menuId = $menu->getData($this->menuHelper->getLinkField()); if (isset($data[ExtendedFields::NODES])) { - $this->nodeProcessor->createNodes($data[ExtendedFields::NODES], (int) $menu->getId()); + $this->nodeProcessor->createNodes($data[ExtendedFields::NODES], (int) $menuId); } return $menu->getIdentifier(); From cab6eb70a840896ee6dcfffb19d3aaef63e28b9f Mon Sep 17 00:00:00 2001 From: Ola Date: Wed, 3 Apr 2024 13:03:34 +0200 Subject: [PATCH 17/18] #104299 - get serialized nodes input name from config --- view/adminhtml/templates/menu/nodes.phtml | 1 + view/adminhtml/web/vue/app.vue | 21 ++++----------------- 2 files changed, 5 insertions(+), 17 deletions(-) diff --git a/view/adminhtml/templates/menu/nodes.phtml b/view/adminhtml/templates/menu/nodes.phtml index fd43add2..89b5b03f 100644 --- a/view/adminhtml/templates/menu/nodes.phtml +++ b/view/adminhtml/templates/menu/nodes.phtml @@ -46,6 +46,7 @@ $blockHtmlId = $block->getBlockHtmlId(); "imageDeleteUrl" : "getImageDeleteUrl() ?>", "imageUploadFileId": "getImageUploadFileId() ?>", "lazyMinItemsCount": "1000", + "serializedNodesElementName": "serialized_nodes", "translation": { "nodes" : "", "click" : "", diff --git a/view/adminhtml/web/vue/app.vue b/view/adminhtml/web/vue/app.vue index 4ea48d4d..1bfbeafe 100644 --- a/view/adminhtml/web/vue/app.vue +++ b/view/adminhtml/web/vue/app.vue @@ -90,8 +90,7 @@ }, watch: { jsonList: function (newValue) { - this.updateSerializedNodes(newValue) - this.updateMenuStagingSerializedNodes(newValue); + this.updateSerializedNodes(newValue); } }, mounted () { @@ -110,14 +109,10 @@ }; // while loaded set JSON list as a value - checkElement('[name="serialized_nodes"]').then(() => { - this.list = this.nodes.map(item => setUuidRecursive(item)) + checkElement(`[name='${this.config.serializedNodesElementName}']`).then(() => { + this.list = this.nodes.map(item => setUuidRecursive(item)); this.updateSerializedNodes(this.jsonList); }); - checkElement('[name="snowmenu_staging_serialized_nodes"]').then(() => { - this.list = this.nodes.map(item => setUuidRecursive(item)) - this.updateMenuStagingSerializedNodes(this.jsonList); - }); }, methods: { uuid, @@ -148,20 +143,12 @@ }, updateSerializedNodes(value) { const updateEvent = new Event('change'); - const serializedNodeInput = document.querySelector('[name="serialized_nodes"]'); + const serializedNodeInput = document.querySelector(`[name='${this.config.serializedNodesElementName}']`); // update serialized_nodes input value serializedNodeInput.value = value; // trigger change event to set value serializedNodeInput.dispatchEvent(updateEvent); }, - updateMenuStagingSerializedNodes(value) { - const updateEvent = new Event('change'); - const serializedNodeInput = document.querySelector('[name="snowmenu_staging_serialized_nodes"]'); - // update serialized_nodes input value - serializedNodeInput.value = value; - // trigger change event to set value - serializedNodeInput.dispatchEvent(updateEvent); - } }, template: template }); From b796c9ec3625b7ac2d00623bb0ccddaee6efd60d Mon Sep 17 00:00:00 2001 From: Ola Date: Wed, 3 Apr 2024 13:03:17 +0200 Subject: [PATCH 18/18] #104299 - remove unused config.el --- view/adminhtml/web/js/nodes.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/view/adminhtml/web/js/nodes.js b/view/adminhtml/web/js/nodes.js index 7af5282e..06ce0c57 100644 --- a/view/adminhtml/web/js/nodes.js +++ b/view/adminhtml/web/js/nodes.js @@ -29,7 +29,7 @@ define([ Vue.component('treeselect', vueTreeselect.Treeselect); var app = new Vue({ - el: config.el || "#" + config.blockHtmlId, + el: '#' + config.blockHtmlId, data: config.data });