Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/MC-18561' into 2.3-develop-pr30
Browse files Browse the repository at this point in the history
  • Loading branch information
serhii-balko committed Aug 23, 2019
2 parents 17a9daa + e0a82d0 commit 3696290
Show file tree
Hide file tree
Showing 3 changed files with 222 additions and 0 deletions.
102 changes: 102 additions & 0 deletions app/code/Magento/CmsUrlRewrite/Plugin/Cms/Model/Store/View.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);

namespace Magento\CmsUrlRewrite\Plugin\Cms\Model\Store;

use Magento\Cms\Api\PageRepositoryInterface;
use Magento\CmsUrlRewrite\Model\CmsPageUrlRewriteGenerator;
use Magento\Framework\Api\SearchCriteriaBuilder;
use Magento\Framework\Model\AbstractModel;
use Magento\Store\Model\ResourceModel\Store as ResourceStore;
use Magento\UrlRewrite\Model\UrlPersistInterface;

/**
* Plugin which is listening store resource model and on save replace cms page url rewrites
*
* @see ResourceStore
*/
class View
{
/**
* @var UrlPersistInterface
*/
private $urlPersist;

/**
* @var CmsPageUrlRewriteGenerator
*/
private $cmsPageUrlRewriteGenerator;

/**
* @var PageRepositoryInterface
*/
private $pageRepository;

/**
* @var SearchCriteriaBuilder
*/
private $searchCriteriaBuilder;

/**
* Update store view plugin constructor
*
* @param UrlPersistInterface $urlPersist
* @param SearchCriteriaBuilder $searchCriteriaBuilder
* @param PageRepositoryInterface $pageRepository
* @param CmsPageUrlRewriteGenerator $cmsPageUrlRewriteGenerator
*/
public function __construct(
UrlPersistInterface $urlPersist,
SearchCriteriaBuilder $searchCriteriaBuilder,
PageRepositoryInterface $pageRepository,
CmsPageUrlRewriteGenerator $cmsPageUrlRewriteGenerator
) {
$this->urlPersist = $urlPersist;
$this->searchCriteriaBuilder = $searchCriteriaBuilder;
$this->pageRepository = $pageRepository;
$this->cmsPageUrlRewriteGenerator = $cmsPageUrlRewriteGenerator;
}

/**
* Replace cms page url rewrites on store view save
*
* @param ResourceStore $object
* @param ResourceStore $result
* @param ResourceStore $store
* @return void
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
public function afterSave(ResourceStore $object, ResourceStore $result, AbstractModel $store): void
{
if ($store->isObjectNew() || $store->dataHasChangedFor('group_id')) {
$this->urlPersist->replace(
$this->generateCmsPagesUrls((int)$store->getId())
);
}
}

/**
* Generate url rewrites for cms pages to store view
*
* @param int $storeId
* @return array
*/
private function generateCmsPagesUrls(int $storeId): array
{
$rewrites = [];
$urls = [];
$searchCriteria = $this->searchCriteriaBuilder->create();
$cmsPagesCollection = $this->pageRepository->getList($searchCriteria)->getItems();
foreach ($cmsPagesCollection as $page) {
$page->setStoreId($storeId);
$rewrites[] = $this->cmsPageUrlRewriteGenerator->generate($page);
}
$urls = array_merge($urls, ...$rewrites);

return $urls;
}
}
12 changes: 12 additions & 0 deletions app/code/Magento/CmsUrlRewrite/etc/adminhtml/di.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?xml version="1.0"?>
<!--
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\Store\Model\ResourceModel\Store">
<plugin name="update_cms_url_rewrites_after_store_save" type="Magento\CmsUrlRewrite\Plugin\Cms\Model\Store\View"/>
</type>
</config>
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);

namespace Magento\CmsUrlRewrite\Plugin\Cms\Model\Store;

use Magento\Framework\ObjectManagerInterface;
use Magento\Store\Model\Store;
use Magento\Store\Model\StoreFactory;
use Magento\TestFramework\Helper\Bootstrap;
use Magento\UrlRewrite\Model\UrlFinderInterface;
use Magento\UrlRewrite\Service\V1\Data\UrlRewrite;

/**
* Test for plugin which is listening store resource model and on save replace cms page url rewrites
*
* @magentoAppArea adminhtml
*/
class ViewTest extends \PHPUnit\Framework\TestCase
{
/**
* @var UrlFinderInterface
*/
private $urlFinder;

/**
* @var ObjectManagerInterface
*/
private $objectManager;

/**
* @var Store
*/
private $storeFactory;

/**
* @inheritdoc
*/
protected function setUp()
{
$this->objectManager = Bootstrap::getObjectManager();
$this->urlFinder = $this->objectManager->create(UrlFinderInterface::class);
$this->storeFactory = $this->objectManager->create(StoreFactory::class);
}

/**
* Test of replacing cms page url rewrites on create and delete store
*
* @magentoDataFixture Magento/Cms/_files/pages.php
*/
public function testUrlRewritesChangesAfterStoreSave()
{
$storeId = $this->createStore();
$this->assertUrlRewritesCount($storeId, 1);
$this->deleteStore($storeId);
$this->assertUrlRewritesCount($storeId, 0);
}

/**
* Assert url rewrites count by store id
*
* @param int $storeId
* @param int $expectedCount
*/
private function assertUrlRewritesCount(int $storeId, int $expectedCount): void
{
$data = [
UrlRewrite::REQUEST_PATH => 'page100',
UrlRewrite::STORE_ID => $storeId
];
$urlRewrites = $this->urlFinder->findAllByData($data);
$this->assertCount($expectedCount, $urlRewrites);
}

/**
* Create test store
*
* @return int
*/
private function createStore(): int
{
$store = $this->storeFactory->create();
$store->setCode('test_' . random_int(0, 999))
->setName('Test Store')
->unsId()
->save();

return (int)$store->getId();
}

/**
* Delete test store
*
* @param int $storeId
* @return void
*/
private function deleteStore(int $storeId): void
{
$store = $this->storeFactory->create();
$store->load($storeId);
if ($store !== null) {
$store->delete();
}
}
}

0 comments on commit 3696290

Please sign in to comment.