Skip to content

Commit 47388c6

Browse files
MC-35478: Bug with Company Structure Page
1 parent 099886a commit 47388c6

File tree

1 file changed

+51
-22
lines changed

1 file changed

+51
-22
lines changed

app/code/Magento/Cms/Model/PageRepository.php

Lines changed: 51 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,27 @@
77
namespace Magento\Cms\Model;
88

99
use Magento\Cms\Api\Data;
10+
use Magento\Cms\Api\Data\PageInterface;
11+
use Magento\Cms\Api\Data\PageInterfaceFactory;
12+
use Magento\Cms\Api\Data\PageSearchResultsInterface;
1013
use Magento\Cms\Api\PageRepositoryInterface;
14+
use Magento\Cms\Model\Api\SearchCriteria\PageCollectionProcessor;
1115
use Magento\Cms\Model\Page\IdentityMap;
16+
use Magento\Cms\Model\ResourceModel\Page as ResourcePage;
17+
use Magento\Cms\Model\ResourceModel\Page\CollectionFactory as PageCollectionFactory;
1218
use Magento\Framework\Api\DataObjectHelper;
1319
use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
20+
use Magento\Framework\Api\SearchCriteriaInterface;
1421
use Magento\Framework\App\ObjectManager;
22+
use Magento\Framework\App\Route\Config;
1523
use Magento\Framework\Exception\CouldNotDeleteException;
1624
use Magento\Framework\Exception\CouldNotSaveException;
1725
use Magento\Framework\Exception\NoSuchEntityException;
1826
use Magento\Framework\Reflection\DataObjectProcessor;
19-
use Magento\Cms\Model\ResourceModel\Page as ResourcePage;
20-
use Magento\Cms\Model\ResourceModel\Page\CollectionFactory as PageCollectionFactory;
2127
use Magento\Store\Model\StoreManagerInterface;
2228

2329
/**
24-
* Class PageRepository
30+
* Cms page repository
2531
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
2632
*/
2733
class PageRepository implements PageRepositoryInterface
@@ -57,12 +63,12 @@ class PageRepository implements PageRepositoryInterface
5763
protected $dataObjectProcessor;
5864

5965
/**
60-
* @var \Magento\Cms\Api\Data\PageInterfaceFactory
66+
* @var PageInterfaceFactory
6167
*/
6268
protected $dataPageFactory;
6369

6470
/**
65-
* @var \Magento\Store\Model\StoreManagerInterface
71+
* @var StoreManagerInterface
6672
*/
6773
private $storeManager;
6874

@@ -76,30 +82,37 @@ class PageRepository implements PageRepositoryInterface
7682
*/
7783
private $identityMap;
7884

85+
/**
86+
* @var Config
87+
*/
88+
private $routeConfig;
89+
7990
/**
8091
* @param ResourcePage $resource
8192
* @param PageFactory $pageFactory
82-
* @param Data\PageInterfaceFactory $dataPageFactory
93+
* @param PageInterfaceFactory $dataPageFactory
8394
* @param PageCollectionFactory $pageCollectionFactory
8495
* @param Data\PageSearchResultsInterfaceFactory $searchResultsFactory
8596
* @param DataObjectHelper $dataObjectHelper
8697
* @param DataObjectProcessor $dataObjectProcessor
8798
* @param StoreManagerInterface $storeManager
8899
* @param CollectionProcessorInterface $collectionProcessor
89100
* @param IdentityMap|null $identityMap
101+
* @param Config|null $routeConfig
90102
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
91103
*/
92104
public function __construct(
93105
ResourcePage $resource,
94106
PageFactory $pageFactory,
95-
Data\PageInterfaceFactory $dataPageFactory,
107+
PageInterfaceFactory $dataPageFactory,
96108
PageCollectionFactory $pageCollectionFactory,
97109
Data\PageSearchResultsInterfaceFactory $searchResultsFactory,
98110
DataObjectHelper $dataObjectHelper,
99111
DataObjectProcessor $dataObjectProcessor,
100112
StoreManagerInterface $storeManager,
101113
CollectionProcessorInterface $collectionProcessor = null,
102-
?IdentityMap $identityMap = null
114+
?IdentityMap $identityMap = null,
115+
?Config $routeConfig = null
103116
) {
104117
$this->resource = $resource;
105118
$this->pageFactory = $pageFactory;
@@ -111,16 +124,17 @@ public function __construct(
111124
$this->storeManager = $storeManager;
112125
$this->collectionProcessor = $collectionProcessor ?: $this->getCollectionProcessor();
113126
$this->identityMap = $identityMap ?? ObjectManager::getInstance()->get(IdentityMap::class);
127+
$this->routeConfig = $routeConfig ?? ObjectManager::getInstance()->get(Config::class);
114128
}
115129

116130
/**
117131
* Validate new layout update values.
118132
*
119-
* @param Data\PageInterface $page
133+
* @param PageInterface $page
120134
* @return void
121135
* @throws \InvalidArgumentException
122136
*/
123-
private function validateLayoutUpdate(Data\PageInterface $page): void
137+
private function validateLayoutUpdate(PageInterface $page): void
124138
{
125139
//Persisted data
126140
$savedPage = $page->getId() ? $this->getById($page->getId()) : null;
@@ -140,18 +154,19 @@ private function validateLayoutUpdate(Data\PageInterface $page): void
140154
/**
141155
* Save Page data
142156
*
143-
* @param \Magento\Cms\Api\Data\PageInterface|Page $page
157+
* @param PageInterface|Page $page
144158
* @return Page
145159
* @throws CouldNotSaveException
146160
*/
147-
public function save(\Magento\Cms\Api\Data\PageInterface $page)
161+
public function save(PageInterface $page)
148162
{
149163
if ($page->getStoreId() === null) {
150164
$storeId = $this->storeManager->getStore()->getId();
151165
$page->setStoreId($storeId);
152166
}
153167
try {
154168
$this->validateLayoutUpdate($page);
169+
$this->validateRoutesDuplication($page);
155170
$this->resource->save($page);
156171
$this->identityMap->add($page);
157172
} catch (\Exception $exception) {
@@ -168,7 +183,7 @@ public function save(\Magento\Cms\Api\Data\PageInterface $page)
168183
*
169184
* @param string $pageId
170185
* @return Page
171-
* @throws \Magento\Framework\Exception\NoSuchEntityException
186+
* @throws NoSuchEntityException
172187
*/
173188
public function getById($pageId)
174189
{
@@ -187,17 +202,15 @@ public function getById($pageId)
187202
*
188203
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
189204
* @SuppressWarnings(PHPMD.NPathComplexity)
190-
* @param \Magento\Framework\Api\SearchCriteriaInterface $criteria
191-
* @return \Magento\Cms\Api\Data\PageSearchResultsInterface
205+
* @param SearchCriteriaInterface $criteria
206+
* @return PageSearchResultsInterface
192207
*/
193-
public function getList(\Magento\Framework\Api\SearchCriteriaInterface $criteria)
208+
public function getList(SearchCriteriaInterface $criteria)
194209
{
195-
/** @var \Magento\Cms\Model\ResourceModel\Page\Collection $collection */
196210
$collection = $this->pageCollectionFactory->create();
197211

198212
$this->collectionProcessor->process($criteria, $collection);
199213

200-
/** @var Data\PageSearchResultsInterface $searchResults */
201214
$searchResults = $this->searchResultsFactory->create();
202215
$searchResults->setSearchCriteria($criteria);
203216
$searchResults->setItems($collection->getItems());
@@ -208,11 +221,11 @@ public function getList(\Magento\Framework\Api\SearchCriteriaInterface $criteria
208221
/**
209222
* Delete Page
210223
*
211-
* @param \Magento\Cms\Api\Data\PageInterface $page
224+
* @param PageInterface $page
212225
* @return bool
213226
* @throws CouldNotDeleteException
214227
*/
215-
public function delete(\Magento\Cms\Api\Data\PageInterface $page)
228+
public function delete(PageInterface $page)
216229
{
217230
try {
218231
$this->resource->delete($page);
@@ -247,10 +260,26 @@ public function deleteById($pageId)
247260
private function getCollectionProcessor()
248261
{
249262
if (!$this->collectionProcessor) {
250-
$this->collectionProcessor = \Magento\Framework\App\ObjectManager::getInstance()->get(
251-
\Magento\Cms\Model\Api\SearchCriteria\PageCollectionProcessor::class
263+
$this->collectionProcessor = ObjectManager::getInstance()->get(
264+
PageCollectionProcessor::class
252265
);
253266
}
254267
return $this->collectionProcessor;
255268
}
269+
270+
/**
271+
* Checks that page identifier doesn't duplicate existed routes
272+
*
273+
* @param PageInterface $page
274+
* @return void
275+
* @throws CouldNotSaveException
276+
*/
277+
private function validateRoutesDuplication($page): void
278+
{
279+
if ($this->routeConfig->getRouteByFrontName($page->getIdentifier())) {
280+
throw new CouldNotSaveException(
281+
__('The value specified in the URL Key field would generate a URL that already exists.')
282+
);
283+
}
284+
}
256285
}

0 commit comments

Comments
 (0)