From 79539c7c825381a6150af6ca3f36c5c97f1e90f6 Mon Sep 17 00:00:00 2001 From: ah-net <103565001+ah-net@users.noreply.github.com> Date: Tue, 16 Sep 2025 10:51:54 +0200 Subject: [PATCH 1/7] Overviewpage multistore --- src/Api/Data/OverviewPageInterface.php | 21 ++-- src/Api/OverviewPageRepositoryInterface.php | 3 +- .../Adminhtml/OverviewPage/Edit.php | 3 +- .../Adminhtml/OverviewPage/Save.php | 22 +++- src/Controller/OverviewPage/View.php | 9 +- src/Model/OverviewPage.php | 57 ++++++++-- src/Model/OverviewPage/DataProvider.php | 15 ++- src/Model/OverviewPageRepository.php | 77 ++++++++++++- src/Model/ResourceModel/OverviewPage.php | 51 +++++++++ src/Model/UrlRewriteService.php | 48 ++++++++- .../Patch/Data/ConvertOverviewpageEntries.php | 102 ++++++++++++++++++ .../Listing/Column/OverviewPageActions.php | 26 ----- src/etc/db_schema.xml | 19 ++++ src/etc/module.xml | 2 +- ...ico_attributelanding_overviewpage_edit.xml | 7 ++ ...ico_attributelanding_overviewpage_form.xml | 83 +++++++++----- ..._attributelanding_overviewpage_listing.xml | 17 +-- 17 files changed, 466 insertions(+), 96 deletions(-) create mode 100644 src/Setup/Patch/Data/ConvertOverviewpageEntries.php diff --git a/src/Api/Data/OverviewPageInterface.php b/src/Api/Data/OverviewPageInterface.php index 88fb96f..dc36008 100644 --- a/src/Api/Data/OverviewPageInterface.php +++ b/src/Api/Data/OverviewPageInterface.php @@ -20,12 +20,11 @@ interface OverviewPageInterface public const NAME = 'name'; public const URL_PATH = 'url_path'; public const META_KEYWORDS = 'meta_keywords'; - public const CATEGORY_ID = 'category_id'; public const PAGE_ID = 'page_id'; public const META_DESCRIPTION = 'meta_description'; - public const STORE_IDS = 'store_ids'; public const CREATED_AT = 'created_at'; public const UPDATED_AT = 'updated_at'; + public const STORE_ID = 'store_id'; /** * Get page_id @@ -33,6 +32,12 @@ interface OverviewPageInterface */ public function getPageId(); + /** + * Get store_id + * @return int + */ + public function getStoreId(): int; + /** * Get active * @return bool @@ -87,12 +92,6 @@ public function getContentFirst(); */ public function getContentLast(); - /** - * Get active stores IDs - * @return int[] - */ - public function getStoreIds(): array; - /** * @return string */ @@ -102,4 +101,10 @@ public function getCreatedAt(): string; * @return string */ public function getUpdatedAt(): string; + + /** + * @param int $storeId + * @return OverviewPageInterface + */ + public function setStoreId(int $storeId): OverviewPageInterface; } diff --git a/src/Api/OverviewPageRepositoryInterface.php b/src/Api/OverviewPageRepositoryInterface.php index 1c8c251..96786de 100644 --- a/src/Api/OverviewPageRepositoryInterface.php +++ b/src/Api/OverviewPageRepositoryInterface.php @@ -20,11 +20,12 @@ public function save(OverviewPageInterface $page): OverviewPageInterface; /** * Retrieve Page * @param int $pageId + * @param int $storeId * @return \Emico\AttributeLanding\Api\Data\OverviewPageInterface * @throws \Magento\Framework\Exception\LocalizedException * @throws NoSuchEntityException */ - public function getById(int $pageId): OverviewPageInterface; + public function getByIdWithStore(int $pageId, int $storeId): OverviewPageInterface; /** * Retrieve Page matching the specified criteria. diff --git a/src/Controller/Adminhtml/OverviewPage/Edit.php b/src/Controller/Adminhtml/OverviewPage/Edit.php index 065814c..2bf7cc8 100644 --- a/src/Controller/Adminhtml/OverviewPage/Edit.php +++ b/src/Controller/Adminhtml/OverviewPage/Edit.php @@ -55,10 +55,11 @@ public function __construct( public function execute() { $id = $this->getRequest()->getParam('page_id'); + $storeId = (int)$this->getRequest()->getParam('store', 0); if ($id) { try { - $landingPage = $this->overviewPageRepository->getById($id); + $landingPage = $this->overviewPageRepository->getByIdWithStore($id, $storeId); } catch (NoSuchEntityException $exception) { $this->messageManager->addErrorMessage(__('This Page no longer exists.')); diff --git a/src/Controller/Adminhtml/OverviewPage/Save.php b/src/Controller/Adminhtml/OverviewPage/Save.php index a5e33dc..c3d1355 100644 --- a/src/Controller/Adminhtml/OverviewPage/Save.php +++ b/src/Controller/Adminhtml/OverviewPage/Save.php @@ -68,23 +68,31 @@ public function execute() $resultRedirect = $this->resultRedirectFactory->create(); /** @phpstan-ignore-next-line */ $data = $this->getRequest()->getPostValue(); + $data[OverviewPageInterface::STORE_ID] = (int)$data[OverviewPageInterface::STORE_ID]; if (!$data) { return $resultRedirect->setPath('*/*/'); } - $id = $this->getRequest()->getParam('page_id'); + $id = $this->getRequest()->getParam('page_id') ?? null; if (!$id) { $page = $this->overviewPageFactory->create(); } else { try { - $page = $this->overviewPageRepository->getById($id); + $page = $this->overviewPageRepository->getByIdWithStore( + $id, + (int)$data[OverviewPageInterface::STORE_ID] + ); } catch (NoSuchEntityException $exception) { $this->messageManager->addErrorMessage(__('This Page no longer exists.')); return $resultRedirect->setPath('*/*/'); } } + if ($id) { + $data['id'] = $id; + } + $this->dataObjectHelper->populateWithArray($page, $data, OverviewPageInterface::class); try { @@ -94,7 +102,13 @@ public function execute() $this->dataPersistor->clear('emico_attributelanding_overviewpage'); if ($this->getRequest()->getParam('back')) { - return $resultRedirect->setPath('*/*/edit', ['page_id' => $page->getPageId()]); + return $resultRedirect->setPath( + '*/*/edit', + [ + 'page_id' => $page->getPageId(), + 'store' => $page->getStoreId() + ] + ); } return $resultRedirect->setPath('*/*/'); @@ -105,6 +119,6 @@ public function execute() } $this->dataPersistor->set('emico_attributelanding_overviewpage', $data); - return $resultRedirect->setPath('*/*/edit', ['page_id' => $this->getRequest()->getParam('page_id')]); + return $resultRedirect->setPath('*/*/edit', ['page_id' => $page->getPageId(), 'store' => $page->getStoreId()]); } } diff --git a/src/Controller/OverviewPage/View.php b/src/Controller/OverviewPage/View.php index ae1fe83..db572e0 100644 --- a/src/Controller/OverviewPage/View.php +++ b/src/Controller/OverviewPage/View.php @@ -14,6 +14,7 @@ use Magento\Framework\Controller\ResultInterface; use Magento\Framework\Exception\NotFoundException; use Magento\Framework\View\Result\PageFactory; +use Magento\Store\Model\StoreManagerInterface; class View extends Action { @@ -44,7 +45,8 @@ public function __construct( Context $context, PageFactory $resultPageFactory, LandingPageContext $landingPageContext, - OverviewPageRepositoryInterface $overviewPageRepository + OverviewPageRepositoryInterface $overviewPageRepository, + private readonly StoreManagerInterface $storeManager ) { $this->resultPageFactory = $resultPageFactory; $this->overviewPageRepository = $overviewPageRepository; @@ -61,8 +63,9 @@ public function __construct( */ public function execute(): ResultInterface { - $pageId = $this->getRequest()->getParam('id'); - $overviewPage = $this->overviewPageRepository->getById($pageId); + $pageId = (int)$this->getRequest()->getParam('id'); + $storeId = (int)$this->storeManager->getStore()->getId(); + $overviewPage = $this->overviewPageRepository->getByIdWithStore($pageId, $storeId); if (!$overviewPage->isActive()) { throw new NotFoundException(__('Page not active')); diff --git a/src/Model/OverviewPage.php b/src/Model/OverviewPage.php index 45e4f1c..91f76e6 100644 --- a/src/Model/OverviewPage.php +++ b/src/Model/OverviewPage.php @@ -213,21 +213,21 @@ public function setContentLast($contentLast): OverviewPageInterface } /** - * Get active stores IDs - * @return array + * Get active stores ID + * @return int */ - public function getStoreIds(): array + public function getStoreId(): int { - return explode(',', $this->getData(self::STORE_IDS)); + return (int)$this->getData(self::STORE_ID); } /** - * @param int[] $storeIds + * @param int $storeId * @return OverviewPageInterface */ - public function setStoreIds($storeIds): OverviewPageInterface + public function setStoreId(int $storeId): OverviewPageInterface { - return $this->setData(self::STORE_IDS, implode(',', $storeIds)); + return $this->setData(self::STORE_ID, $storeId); } /** @@ -277,4 +277,47 @@ public function getUpdatedAt(): string { return $this->getData(OverviewPageInterface::UPDATED_AT); } + + public function getOverviewPageDataWithoutStore(): array + { + $fields = [ + OverviewPageInterface::PAGE_ID, + OverviewPageInterface::CREATED_AT, + OverviewPageInterface::UPDATED_AT, + OverviewPageInterface::URL_PATH, + ]; + + if ($this->getData(OverviewPageInterface::STORE_ID) === 0) { + $fields[] = OverviewPageInterface::NAME; + } + + return array_combine( + $fields, + array_map(fn($field) => $this->getData($field), $fields) + ); + } + + /** + * @return array + */ + public function getOverviewPageDataForStore(): array + { + $fields = [ + OverviewPageInterface::NAME, + OverviewPageInterface::STORE_ID, + OverviewPageInterface::ACTIVE, + OverviewPageInterface::URL_PATH, + OverviewPageInterface::HEADING, + OverviewPageInterface::META_TITLE, + OverviewPageInterface::META_KEYWORDS, + OverviewPageInterface::META_DESCRIPTION, + OverviewPageInterface::CONTENT_FIRST, + OverviewPageInterface::CONTENT_LAST, + ]; + + return array_combine( + $fields, + array_map(fn($field) => $this->getData($field), $fields) + ); + } } diff --git a/src/Model/OverviewPage/DataProvider.php b/src/Model/OverviewPage/DataProvider.php index 50de301..4ae96e8 100644 --- a/src/Model/OverviewPage/DataProvider.php +++ b/src/Model/OverviewPage/DataProvider.php @@ -6,6 +6,8 @@ use Emico\AttributeLanding\Model\ResourceModel\OverviewPage\CollectionFactory; use Magento\Framework\App\Request\DataPersistorInterface; use Magento\Ui\DataProvider\AbstractDataProvider; +use Emico\AttributeLanding\Model\OverviewPageRepository; +use Magento\Framework\App\Request\Http; class DataProvider extends AbstractDataProvider { @@ -32,6 +34,8 @@ class DataProvider extends AbstractDataProvider * @param string $requestFieldName * @param CollectionFactory $collectionFactory * @param DataPersistorInterface $dataPersistor + * @param Http $request + * @param OverviewPageRepository $overviewPageRepository * @param array $meta * @param array $data */ @@ -41,6 +45,8 @@ public function __construct( $requestFieldName, CollectionFactory $collectionFactory, DataPersistorInterface $dataPersistor, + private readonly Http $request, + private readonly overviewPageRepository $overviewPageRepository, array $meta = [], array $data = [] ) { @@ -61,11 +67,18 @@ public function getData() return $this->loadedData; } + $storeId = (int)$this->request->getParam('store', 0); /** @phpstan-ignore-next-line */ $items = $this->collection->getItems(); foreach ($items as $model) { + $storeData = $this->overviewPageRepository->getByIdWithStore($model->getPageId(), $storeId)->getData(); + + foreach ($storeData as $key => $value) { + $modelData[$key] = $value; + } + /** @var OverviewPage $model */ - $this->loadedData[$model->getPageId()] = $model->getData(); + $this->loadedData[$model->getPageId()] = $modelData; } $data = $this->dataPersistor->get('emico_attributelanding_overviewpage'); diff --git a/src/Model/OverviewPageRepository.php b/src/Model/OverviewPageRepository.php index 09cfe6f..5bb289d 100644 --- a/src/Model/OverviewPageRepository.php +++ b/src/Model/OverviewPageRepository.php @@ -81,9 +81,14 @@ public function __construct( public function save(OverviewPageInterface $page): OverviewPageInterface { try { - /** @var LandingPage $page */ - $this->resource->save($page); // @phpstan-ignore-line - } catch (Exception $exception) { + /** @var OverviewPage $page */ + $parentOverviewPage = $this->dataPageFactory->create(); + $parentOverviewPage->setData($page->getOverviewPageDataWithoutStore()); + + $this->resource->save($parentOverviewPage); // @phpstan-ignore-line + $page->setPageId($parentOverviewPage->getPageId()); + $this->resource->saveOverviewPageStoreData($page); + } catch (\Exception $exception) { throw new CouldNotSaveException( __( 'Could not save the page: %1', @@ -170,6 +175,7 @@ public function findAllActive(): array { $searchCriteria = $this->searchCriteriaBuilder ->addFilter(OverviewPageInterface::ACTIVE, 1) + ->addFilter(OverviewPageInterface::STORE_ID, [$storeId, 0], 'in') ->create(); $result = $this->getList($searchCriteria); @@ -191,4 +197,69 @@ public function getByLandingPage(LandingPageInterface $landingPage): OverviewPag return $this->getById($landingPage->getOverviewPageId()); } + + /** + * @param int $pageId + * @param int $storeId + * @return OverviewPageInterface + * @throws NoSuchEntityException + */ + public function getByIdWithStore(int $pageId, int $storeId): OverviewPageInterface + { + $overviewPage = $this->getById($pageId); + + $storeData = $this->resource->getOverviewPageStoreData($pageId, $storeId); + + if (!empty($storeData)) { + unset($storeData['id']); + $overviewPage->setData($storeData); + } else { + $defaultData = $this->resource->getOverviewPageStoreData($pageId, 0); + if (!empty($defaultData)) { + unset($defaultData['id']); + $overviewPage->setData($defaultData); + } + + $overviewPage->setData(LandingPageInterface::STORE_ID, $storeId); + } + + return $overviewPage; + } + + /** + * @param int $pageId + * @return OverviewPageInterface[] + */ + public function getAllPagesById(int $pageId): array + { + $storeData = $this->resource->getAllOverviewPageStoreData($pageId); + $pages = []; + + foreach ($storeData as $data) { + $page = $this->dataPageFactory->create(); + $page->setData($data); + $pages[] = $page; + } + + return $pages; + } + + /** + * @param OverviewPageInterface $page + * @return void + * @throws CouldNotSaveException + */ + public function saveOverviewPageStoreData(OverviewPageInterface $page): void + { + try { + $this->resource->saveOverviewPageStoreData($page); + } catch (\Exception $exception) { + throw new CouldNotSaveException( + __( + 'Could not save the overview page store data: %1', + $exception->getMessage() + ) + ); + } + } } diff --git a/src/Model/ResourceModel/OverviewPage.php b/src/Model/ResourceModel/OverviewPage.php index c277072..b8a16e3 100644 --- a/src/Model/ResourceModel/OverviewPage.php +++ b/src/Model/ResourceModel/OverviewPage.php @@ -8,6 +8,7 @@ namespace Emico\AttributeLanding\Model\ResourceModel; use Emico\AttributeLanding\Api\Data\LandingPageInterface; +use Emico\AttributeLanding\Api\Data\OverviewPageInterface; use Magento\Framework\Model\ResourceModel\Db\AbstractDb; class OverviewPage extends AbstractDb @@ -16,4 +17,54 @@ protected function _construct() { $this->_init('emico_attributelanding_overviewpage', LandingPageInterface::PAGE_ID); } + + public function getOverviewPageStoreData(int $overviewPageId, int $storeId = 0): array + { + $connection = $this->getConnection(); + $select = $connection->select() + ->from(['ps' => $this->getTable('emico_attributelanding_overviewpage_store')]) + ->where('ps.page_id = ?', $overviewPageId) + ->where('store_id = ?', $storeId); + + $result = $connection->fetchRow($select); + + if ($result) { + return $result; + } + + return []; + } + + public function getAllOverviewPageStoreData(int $overviewPageId): array + { + $connection = $this->getConnection(); + $select = $connection->select() + ->from($this->getTable('emico_attributelanding_overviewpage_store')) + ->where('page_id = :page_id'); + + $bind = ['page_id' => (int)$overviewPageId]; + + return $connection->fetchAll($select, $bind); + } + + public function saveOverviewPageStoreData(OverviewPageInterface $page): void + { + $data = $page->getOverviewPageDataForStore(); + $connection = $this->getConnection(); + $table = $this->getTable('emico_attributelanding_overviewpage_store'); + $where = [ + 'page_id = ?' => $page->getPageId(), + 'store_id = ?' => $page->getStoreId() + ]; + + unset($data['id']); + + if (!empty($this->getOverviewPageStoreData($page->getPageId(), $page->getStoreId()))) { + $connection->update($table, $data, $where); + } else { + $data['page_id'] = $page->getPageId(); + $data['store_id'] = $page->getStoreId(); + $connection->insert($table, $data); + } + } } diff --git a/src/Model/UrlRewriteService.php b/src/Model/UrlRewriteService.php index e76f3d2..28247bc 100644 --- a/src/Model/UrlRewriteService.php +++ b/src/Model/UrlRewriteService.php @@ -8,6 +8,7 @@ namespace Emico\AttributeLanding\Model; use Emico\AttributeLanding\Api\Data\LandingPageInterface; +use Emico\AttributeLanding\Api\Data\OverviewPageInterface; use Emico\AttributeLanding\Api\LandingPageRepositoryInterface; use Emico\AttributeLanding\Api\UrlRewriteGeneratorInterface; use Magento\Framework\Api\SearchCriteriaBuilder; @@ -61,6 +62,7 @@ class UrlRewriteService * @param UrlFinderInterface $urlFinder * @param LandingPageRepositoryInterface $landingPageRepository * @param Config $config + * @param OverviewPageRepository $overviewPageRepository */ public function __construct( UrlRewriteFactory $urlRewriteFactory, @@ -70,6 +72,7 @@ public function __construct( UrlFinderInterface $urlFinder, LandingPageRepositoryInterface $landingPageRepository, private readonly Config $config, + private readonly OverviewPageRepository $overviewPageRepository ) { $this->urlRewriteFactory = $urlRewriteFactory; $this->storeManager = $storeManager; @@ -209,9 +212,50 @@ private function generateRewritesForAllStores( private function generateOverviewPageRewrites(UrlRewriteGeneratorInterface $page, ?string $suffix = null): array { $urlRewritesToPersist = []; + $allPages = $this->overviewPageRepository->getAllPagesById($page->getPageId()); - foreach ($this->getActiveStoreIds($page) as $storeId) { - $urlRewritesToPersist[$storeId] = $this->createUrlRewrite($page, $storeId, $suffix); + foreach ($allPages as $storePage) { + if ($storePage->getStoreId() == $page->getStoreId()) { + $storePage = $page; + } + + if ($storePage->getStoreId() == 0) { + $urlRewritesToPersist = $this->generateOverviewPageRewritesForAllStores( + $storePage, + $page, + $suffix, + $urlRewritesToPersist + ); + } else { + $urlRewrite = $this->createUrlRewrite($storePage, $storePage->getStoreId(), $suffix); + $urlRewritesToPersist[$storePage->getStoreId()] = $urlRewrite; + } + } + + return $urlRewritesToPersist; + } + + private function generateOverviewPageRewritesForAllStores( + OverviewPageInterface $storePage, + OverviewPageInterface $page, + ?string $suffix, + array $urlRewritesToPersist + ): array { + $stores = $this->storeManager->getStores(); + + foreach ($stores as $store) { + if ($store->getId() == $page->getStoreId()) { + $storePage = $page; + } + + if (empty($storePage)) { + continue; + } + + if (!isset($urlRewritesToPersist[$store->getId()])) { + $urlRewrite = $this->createUrlRewrite($storePage, $store->getId(), $suffix); + $urlRewritesToPersist[$store->getId()] = $urlRewrite; + } } return $urlRewritesToPersist; diff --git a/src/Setup/Patch/Data/ConvertOverviewpageEntries.php b/src/Setup/Patch/Data/ConvertOverviewpageEntries.php new file mode 100644 index 0000000..65e7279 --- /dev/null +++ b/src/Setup/Patch/Data/ConvertOverviewpageEntries.php @@ -0,0 +1,102 @@ +moduleDataSetup->startSetup(); + + $connection = $this->moduleDataSetup->getConnection(); + $overviewPageTable = $this->moduleDataSetup->getTable('emico_attributelanding_overviewpage'); + $overviewPageStoreTable = $this->moduleDataSetup->getTable('emico_attributelanding_overviewpage_store'); + $stores = $this->storeManager->getStores(); + + $select = $connection->select()->from($overviewPageTable); + $overviewPages = $connection->fetchAll($select); + + foreach ($overviewPages as $overviewPage) { + $storeIds = explode(',', $overviewPage['store_ids']); + foreach ($storeIds as $storeId) { + $this->insertOverviewPageStore($connection, $overviewPageStoreTable, $overviewPage, $storeId); + } + } + + $this->moduleDataSetup->endSetup(); + } + + /** + * @param AdapterInterface $connection + * @param string $table + * @param array $overviewPage + * @param int $storeId + */ + private function insertOverviewPageStore( + AdapterInterface $connection, + string $table, + array $overviewPage, + int $storeId + ): void { + $data = [ + 'page_id' => $overviewPage['page_id'], + 'store_id' => $storeId, + ]; + + $fields = [ + OverviewPageInterface::ACTIVE, + OverviewPageInterface::URL_PATH, + OverviewPageInterface::HEADING, + OverviewPageInterface::META_TITLE, + OverviewPageInterface::META_KEYWORDS, + OverviewPageInterface::META_DESCRIPTION, + OverviewPageInterface::CONTENT_FIRST, + OverviewPageInterface::CONTENT_LAST, + OverviewPageInterface::NAME, + ]; + + foreach ($fields as $field) { + if (isset($overviewPage[$field])) { + $data[$field] = $overviewPage[$field]; + } + } + + $connection->insert($table, $data); + } + + /** + * @inheritDoc + */ + public static function getDependencies(): array + { + return []; + } + + /** + * @inheritDoc + */ + public function getAliases(): array + { + return []; + } +} diff --git a/src/Ui/Component/Listing/Column/OverviewPageActions.php b/src/Ui/Component/Listing/Column/OverviewPageActions.php index f42efc1..fceacf2 100644 --- a/src/Ui/Component/Listing/Column/OverviewPageActions.php +++ b/src/Ui/Component/Listing/Column/OverviewPageActions.php @@ -77,32 +77,6 @@ public function prepareDataSource(array $dataSource) ] ]; } - - if (!empty($item['store_ids']) && is_string($item['store_ids'])) { - $store_ids = explode(',', $item['store_ids']); - /** @phpstan-ignore-next-line */ - if (!empty($store_ids) && is_array($store_ids)) { - $stores = $this->storeRepository->getList(); - $item['stores'] = ''; - foreach ($stores as $store) { - $id = $store->getId(); - - // phpcs:ignore SlevomatCodingStandard.Functions.StrictCall.StrictParameterMissing - if (!in_array($id, $store_ids)) { - continue; - } - - /** @phpstan-ignore-next-line */ - if ($id === '0') { - $item['stores'] .= 'All Store Views' . ', '; - } else { - $item['stores'] .= $store->getName() . ', '; - } - } - } - } else { - $item['stores'] = 'All Store Views'; - } } } diff --git a/src/etc/db_schema.xml b/src/etc/db_schema.xml index 92ad0f8..2b51a9e 100644 --- a/src/etc/db_schema.xml +++ b/src/etc/db_schema.xml @@ -60,4 +60,23 @@ + + + + + + + + + + + + + + + + + + +
diff --git a/src/etc/module.xml b/src/etc/module.xml index 993bd8f..0ffc85e 100644 --- a/src/etc/module.xml +++ b/src/etc/module.xml @@ -1,7 +1,7 @@ - + diff --git a/src/view/adminhtml/layout/emico_attributelanding_overviewpage_edit.xml b/src/view/adminhtml/layout/emico_attributelanding_overviewpage_edit.xml index 8afdb88..c6537bc 100644 --- a/src/view/adminhtml/layout/emico_attributelanding_overviewpage_edit.xml +++ b/src/view/adminhtml/layout/emico_attributelanding_overviewpage_edit.xml @@ -3,6 +3,13 @@ + + + + 0 + + + diff --git a/src/view/adminhtml/ui_component/emico_attributelanding_overviewpage_form.xml b/src/view/adminhtml/ui_component/emico_attributelanding_overviewpage_form.xml index ed34d01..3b1a10b 100644 --- a/src/view/adminhtml/ui_component/emico_attributelanding_overviewpage_form.xml +++ b/src/view/adminhtml/ui_component/emico_attributelanding_overviewpage_form.xml @@ -40,10 +40,37 @@ + + + + Page + 0 + + + + + true + + int + + store_id + + + + + Page + [STORE VIEW] + 1 + 0 + 1 @@ -70,6 +97,10 @@ Page + [STORE VIEW] + 1 + 0 + 1 @@ -85,6 +116,10 @@ Page + [STORE VIEW] + 1 + 0 + 1 @@ -96,30 +131,6 @@ - - - - - Page - 0 - - - - - true - - int - - store_ids - - - - - - - - -
@@ -129,6 +140,10 @@ Page + [STORE VIEW] + 1 + 0 + 1 @@ -145,6 +160,10 @@ Page + [STORE VIEW] + 1 + 0 + 1 bold,italic,|,justifyleft,justifycenter,justifyright,|,fontselect,fontsizeselect,|,forecolor,backcolor,|,link,unlink,image,|,bullist,numlist,|,code @@ -182,6 +201,10 @@ Page + [STORE VIEW] + 1 + 0 + 1 bold,italic,|,justifyleft,justifycenter,justifyright,|,fontselect,fontsizeselect,|,forecolor,backcolor,|,link,unlink,image,|,bullist,numlist,|,code @@ -223,6 +246,10 @@ Page + [STORE VIEW] + 1 + 0 + 1 @@ -239,6 +266,10 @@ Page + [STORE VIEW] + 1 + 0 + 1 @@ -255,6 +286,10 @@ Page + [STORE VIEW] + 1 + 0 + 1 diff --git a/src/view/adminhtml/ui_component/emico_attributelanding_overviewpage_listing.xml b/src/view/adminhtml/ui_component/emico_attributelanding_overviewpage_listing.xml index 856dfe2..bc16ad5 100644 --- a/src/view/adminhtml/ui_component/emico_attributelanding_overviewpage_listing.xml +++ b/src/view/adminhtml/ui_component/emico_attributelanding_overviewpage_listing.xml @@ -84,23 +84,10 @@ - + text - - - - - - text - - - - - - text - - false + From 92fa6f67fd222c11ac5757d5be4f09175ea0ad61 Mon Sep 17 00:00:00 2001 From: ahuininga-orisha <> Date: Fri, 28 Nov 2025 15:30:33 +0100 Subject: [PATCH 2/7] Implement requested changes --- src/Controller/OverviewPage/View.php | 1 + src/Model/OverviewPage.php | 5 ++++- src/Model/OverviewPageRepository.php | 6 +++++- src/Model/ResourceModel/OverviewPage.php | 13 +++++++++++++ src/Setup/Patch/Data/ConvertOverviewpageEntries.php | 2 +- 5 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/Controller/OverviewPage/View.php b/src/Controller/OverviewPage/View.php index db572e0..8f4ff28 100644 --- a/src/Controller/OverviewPage/View.php +++ b/src/Controller/OverviewPage/View.php @@ -40,6 +40,7 @@ class View extends Action * @param PageFactory $resultPageFactory * @param LandingPageContext $landingPageContext * @param OverviewPageRepositoryInterface $overviewPageRepository + * @param StoreManagerInterface $storeManager */ public function __construct( Context $context, diff --git a/src/Model/OverviewPage.php b/src/Model/OverviewPage.php index 91f76e6..218b5b1 100644 --- a/src/Model/OverviewPage.php +++ b/src/Model/OverviewPage.php @@ -24,7 +24,7 @@ protected function _construct() /** * Get page_id - * @return int|null + * @return int */ public function getPageId() { @@ -278,6 +278,9 @@ public function getUpdatedAt(): string return $this->getData(OverviewPageInterface::UPDATED_AT); } + /** + * @return array + */ public function getOverviewPageDataWithoutStore(): array { $fields = [ diff --git a/src/Model/OverviewPageRepository.php b/src/Model/OverviewPageRepository.php index 5bb289d..e369c59 100644 --- a/src/Model/OverviewPageRepository.php +++ b/src/Model/OverviewPageRepository.php @@ -56,6 +56,7 @@ class OverviewPageRepository implements OverviewPageRepositoryInterface * @param PageSearchResultsInterfaceFactory $searchResultsFactory * @param CollectionProcessorInterface $collectionProcessor * @param SearchCriteriaBuilder $searchCriteriaBuilder + * @param StoreManagerInterface $storeManager */ public function __construct( ResourcePage $resource, @@ -63,7 +64,8 @@ public function __construct( PageCollectionFactory $pageCollectionFactory, PageSearchResultsInterfaceFactory $searchResultsFactory, CollectionProcessorInterface $collectionProcessor, - SearchCriteriaBuilder $searchCriteriaBuilder + SearchCriteriaBuilder $searchCriteriaBuilder, + private readonly StoreManagerInterface $storeManager ) { $this->resource = $resource; $this->pageCollectionFactory = $pageCollectionFactory; @@ -173,6 +175,8 @@ public function deleteById(int $pageId): bool */ public function findAllActive(): array { + $storeId = $this->storeManager->getStore()->getId(); + $searchCriteria = $this->searchCriteriaBuilder ->addFilter(OverviewPageInterface::ACTIVE, 1) ->addFilter(OverviewPageInterface::STORE_ID, [$storeId, 0], 'in') diff --git a/src/Model/ResourceModel/OverviewPage.php b/src/Model/ResourceModel/OverviewPage.php index b8a16e3..9df3377 100644 --- a/src/Model/ResourceModel/OverviewPage.php +++ b/src/Model/ResourceModel/OverviewPage.php @@ -18,6 +18,11 @@ protected function _construct() $this->_init('emico_attributelanding_overviewpage', LandingPageInterface::PAGE_ID); } + /** + * @param int $overviewPageId + * @param int $storeId + * @return array + */ public function getOverviewPageStoreData(int $overviewPageId, int $storeId = 0): array { $connection = $this->getConnection(); @@ -35,6 +40,10 @@ public function getOverviewPageStoreData(int $overviewPageId, int $storeId = 0): return []; } + /** + * @param int $overviewPageId + * @return array + */ public function getAllOverviewPageStoreData(int $overviewPageId): array { $connection = $this->getConnection(); @@ -47,6 +56,10 @@ public function getAllOverviewPageStoreData(int $overviewPageId): array return $connection->fetchAll($select, $bind); } + /** + * @param OverviewPageInterface $page + * @return void + */ public function saveOverviewPageStoreData(OverviewPageInterface $page): void { $data = $page->getOverviewPageDataForStore(); diff --git a/src/Setup/Patch/Data/ConvertOverviewpageEntries.php b/src/Setup/Patch/Data/ConvertOverviewpageEntries.php index 65e7279..a8eb436 100644 --- a/src/Setup/Patch/Data/ConvertOverviewpageEntries.php +++ b/src/Setup/Patch/Data/ConvertOverviewpageEntries.php @@ -22,7 +22,7 @@ public function __construct( } /** - * @inheritDoc + * @return void */ public function apply(): void { From e9a1ffbdd0a917fc47a6ef8e853a37b8959ac4aa Mon Sep 17 00:00:00 2001 From: ahuininga-orisha <> Date: Wed, 3 Dec 2025 13:30:01 +0100 Subject: [PATCH 3/7] style fixes --- src/Model/UrlRewriteService.php | 14 +++--- .../Patch/Data/ConvertOverviewpageEntries.php | 8 ++- .../Listing/Column/OverviewPageActions.php | 50 ++++++++++--------- 3 files changed, 40 insertions(+), 32 deletions(-) diff --git a/src/Model/UrlRewriteService.php b/src/Model/UrlRewriteService.php index 28247bc..df3885e 100644 --- a/src/Model/UrlRewriteService.php +++ b/src/Model/UrlRewriteService.php @@ -215,11 +215,11 @@ private function generateOverviewPageRewrites(UrlRewriteGeneratorInterface $page $allPages = $this->overviewPageRepository->getAllPagesById($page->getPageId()); foreach ($allPages as $storePage) { - if ($storePage->getStoreId() == $page->getStoreId()) { + if ($storePage->getStoreId() === $page->getStoreId()) { $storePage = $page; } - if ($storePage->getStoreId() == 0) { + if ($storePage->getStoreId() === 0) { $urlRewritesToPersist = $this->generateOverviewPageRewritesForAllStores( $storePage, $page, @@ -244,7 +244,7 @@ private function generateOverviewPageRewritesForAllStores( $stores = $this->storeManager->getStores(); foreach ($stores as $store) { - if ($store->getId() == $page->getStoreId()) { + if ($store->getId() === $page->getStoreId()) { $storePage = $page; } @@ -252,10 +252,12 @@ private function generateOverviewPageRewritesForAllStores( continue; } - if (!isset($urlRewritesToPersist[$store->getId()])) { - $urlRewrite = $this->createUrlRewrite($storePage, $store->getId(), $suffix); - $urlRewritesToPersist[$store->getId()] = $urlRewrite; + + if (isset($urlRewritesToPersist[$store->getId()])) { + continue; } + $urlRewrite = $this->createUrlRewrite($storePage, $store->getId(), $suffix); + $urlRewritesToPersist[$store->getId()] = $urlRewrite; } return $urlRewritesToPersist; diff --git a/src/Setup/Patch/Data/ConvertOverviewpageEntries.php b/src/Setup/Patch/Data/ConvertOverviewpageEntries.php index a8eb436..150af03 100644 --- a/src/Setup/Patch/Data/ConvertOverviewpageEntries.php +++ b/src/Setup/Patch/Data/ConvertOverviewpageEntries.php @@ -1,5 +1,7 @@ insert($table, $data); diff --git a/src/Ui/Component/Listing/Column/OverviewPageActions.php b/src/Ui/Component/Listing/Column/OverviewPageActions.php index fceacf2..ff8fdac 100644 --- a/src/Ui/Component/Listing/Column/OverviewPageActions.php +++ b/src/Ui/Component/Listing/Column/OverviewPageActions.php @@ -51,32 +51,34 @@ public function prepareDataSource(array $dataSource) if (isset($dataSource['data']['items'])) { // phpcs:ignore SlevomatCodingStandard.PHP.DisallowReference.DisallowedAssigningByReference foreach ($dataSource['data']['items'] as & $item) { - if (isset($item['page_id'])) { - $item[$this->getData('name')] = [ - 'edit' => [ - 'href' => $this->urlBuilder->getUrl( - static::URL_PATH_EDIT, - [ - 'page_id' => $item['page_id'] - ] - ), - 'label' => __('Edit') - ], - 'delete' => [ - 'href' => $this->urlBuilder->getUrl( - static::URL_PATH_DELETE, - [ - 'page_id' => $item['page_id'] - ] - ), - 'label' => __('Delete'), - 'confirm' => [ - 'title' => __('Delete overviewpage'), - 'message' => __('Are you sure you wan\'t to delete this overviewpage?') + if (!isset($item['page_id'])) { + continue; + } + + $item[$this->getData('name')] = [ + 'edit' => [ + 'href' => $this->urlBuilder->getUrl( + static::URL_PATH_EDIT, + [ + 'page_id' => $item['page_id'] ] + ), + 'label' => __('Edit') + ], + 'delete' => [ + 'href' => $this->urlBuilder->getUrl( + static::URL_PATH_DELETE, + [ + 'page_id' => $item['page_id'] + ] + ), + 'label' => __('Delete'), + 'confirm' => [ + 'title' => __('Delete overviewpage'), + 'message' => __('Are you sure you wan\'t to delete this overviewpage?') ] - ]; - } + ] + ]; } } From ef2ac55503287853f3d82fcfef27a7e036c4796d Mon Sep 17 00:00:00 2001 From: ahuininga-orisha <> Date: Wed, 3 Dec 2025 13:31:21 +0100 Subject: [PATCH 4/7] Update UrlRewriteService.php --- src/Model/UrlRewriteService.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Model/UrlRewriteService.php b/src/Model/UrlRewriteService.php index df3885e..888530e 100644 --- a/src/Model/UrlRewriteService.php +++ b/src/Model/UrlRewriteService.php @@ -251,8 +251,7 @@ private function generateOverviewPageRewritesForAllStores( if (empty($storePage)) { continue; } - - + if (isset($urlRewritesToPersist[$store->getId()])) { continue; } From 7e90ea97af6ecac7311e6a6edf6b4579ce78f61f Mon Sep 17 00:00:00 2001 From: ahuininga-orisha <> Date: Wed, 3 Dec 2025 13:38:34 +0100 Subject: [PATCH 5/7] Update UrlRewriteService.php --- src/Model/UrlRewriteService.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Model/UrlRewriteService.php b/src/Model/UrlRewriteService.php index 888530e..0d14241 100644 --- a/src/Model/UrlRewriteService.php +++ b/src/Model/UrlRewriteService.php @@ -251,7 +251,7 @@ private function generateOverviewPageRewritesForAllStores( if (empty($storePage)) { continue; } - + if (isset($urlRewritesToPersist[$store->getId()])) { continue; } From cc77924909284e74983282890346e6fc0da4ad46 Mon Sep 17 00:00:00 2001 From: ahuininga-orisha <> Date: Wed, 3 Dec 2025 13:42:36 +0100 Subject: [PATCH 6/7] Update ConvertOverviewpageEntries.php --- src/Setup/Patch/Data/ConvertOverviewpageEntries.php | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/Setup/Patch/Data/ConvertOverviewpageEntries.php b/src/Setup/Patch/Data/ConvertOverviewpageEntries.php index 150af03..687de75 100644 --- a/src/Setup/Patch/Data/ConvertOverviewpageEntries.php +++ b/src/Setup/Patch/Data/ConvertOverviewpageEntries.php @@ -7,7 +7,6 @@ use Emico\AttributeLanding\Api\Data\OverviewPageInterface; use Magento\Framework\Setup\ModuleDataSetupInterface; use Magento\Framework\Setup\Patch\DataPatchInterface; -use Magento\Store\Model\StoreManagerInterface; use Magento\Framework\DB\Adapter\AdapterInterface; class ConvertOverviewpageEntries implements DataPatchInterface @@ -15,11 +14,9 @@ class ConvertOverviewpageEntries implements DataPatchInterface /** * ConvertLandingpageEntries constructor. * @param ModuleDataSetupInterface $moduleDataSetup - * @param StoreManagerInterface $storeManager */ public function __construct( - private readonly ModuleDataSetupInterface $moduleDataSetup, - private readonly StoreManagerInterface $storeManager + private readonly ModuleDataSetupInterface $moduleDataSetup ) { } @@ -33,7 +30,6 @@ public function apply(): void $connection = $this->moduleDataSetup->getConnection(); $overviewPageTable = $this->moduleDataSetup->getTable('emico_attributelanding_overviewpage'); $overviewPageStoreTable = $this->moduleDataSetup->getTable('emico_attributelanding_overviewpage_store'); - $stores = $this->storeManager->getStores(); $select = $connection->select()->from($overviewPageTable); $overviewPages = $connection->fetchAll($select); From c046fd99003f4d02c4d8c162f1e8dbf17c340bb1 Mon Sep 17 00:00:00 2001 From: ahuininga-orisha <> Date: Fri, 20 Mar 2026 10:11:36 +0100 Subject: [PATCH 7/7] FQN fixes --- src/Model/OverviewPageRepository.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Model/OverviewPageRepository.php b/src/Model/OverviewPageRepository.php index e369c59..c660fdf 100644 --- a/src/Model/OverviewPageRepository.php +++ b/src/Model/OverviewPageRepository.php @@ -12,10 +12,12 @@ use Emico\AttributeLanding\Api\Data\PageSearchResultsInterfaceFactory; use Emico\AttributeLanding\Model\ResourceModel\OverviewPage as ResourcePage; use Magento\Framework\Exception\CouldNotSaveException; +use Magento\Framework\Exception\LocalizedException; use Magento\Framework\Exception\NoSuchEntityException; use Magento\Framework\Exception\CouldNotDeleteException; use Emico\AttributeLanding\Model\ResourceModel\OverviewPage\CollectionFactory as PageCollectionFactory; use Emico\AttributeLanding\Api\Data\OverviewPageInterfaceFactory; +use Magento\Store\Model\StoreManagerInterface; class OverviewPageRepository implements OverviewPageRepositoryInterface { @@ -90,7 +92,7 @@ public function save(OverviewPageInterface $page): OverviewPageInterface $this->resource->save($parentOverviewPage); // @phpstan-ignore-line $page->setPageId($parentOverviewPage->getPageId()); $this->resource->saveOverviewPageStoreData($page); - } catch (\Exception $exception) { + } catch (Exception $exception) { throw new CouldNotSaveException( __( 'Could not save the page: %1', @@ -171,7 +173,7 @@ public function deleteById(int $pageId): bool /** * @return OverviewPageInterface[] - * @throws \Magento\Framework\Exception\LocalizedException + * @throws LocalizedException */ public function findAllActive(): array { @@ -257,7 +259,7 @@ public function saveOverviewPageStoreData(OverviewPageInterface $page): void { try { $this->resource->saveOverviewPageStoreData($page); - } catch (\Exception $exception) { + } catch (Exception $exception) { throw new CouldNotSaveException( __( 'Could not save the overview page store data: %1',