Skip to content

Commit 92c4822

Browse files
committed
Merge remote-tracking branch 'origin/MAGETWO-90798' into 2.3-develop-pr20
2 parents b7ec090 + cde1442 commit 92c4822

File tree

5 files changed

+271
-0
lines changed

5 files changed

+271
-0
lines changed
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\CatalogUrlRewrite\Plugin\Store\Block;
9+
10+
use Magento\Framework\Data\Helper\PostHelper;
11+
use Magento\Store\Api\StoreResolverInterface;
12+
use Magento\Store\Model\Store;
13+
use Magento\UrlRewrite\Model\UrlFinderInterface;
14+
use Magento\UrlRewrite\Service\V1\Data\UrlRewrite;
15+
use Magento\Framework\App\Request\Http as HttpRequest;
16+
17+
/**
18+
* Plugin makes connection between Store and UrlRewrite modules
19+
* because Magento\Store\Block\Switcher should not know about UrlRewrite module functionality.
20+
*/
21+
class Switcher
22+
{
23+
/**
24+
* @var PostHelper
25+
*/
26+
private $postHelper;
27+
28+
/**
29+
* @var UrlFinderInterface
30+
*/
31+
private $urlFinder;
32+
33+
/**
34+
* @var HttpRequest
35+
*/
36+
private $request;
37+
38+
/**
39+
* @param PostHelper $postHelper
40+
* @param UrlFinderInterface $urlFinder
41+
* @param HttpRequest $request
42+
*/
43+
public function __construct(
44+
PostHelper $postHelper,
45+
UrlFinderInterface $urlFinder,
46+
HttpRequest $request
47+
) {
48+
$this->postHelper = $postHelper;
49+
$this->urlFinder = $urlFinder;
50+
$this->request = $request;
51+
}
52+
53+
/**
54+
* @param \Magento\Store\Block\Switcher $subject
55+
* @param string $result
56+
* @param Store $store
57+
* @param array $data
58+
* @return string
59+
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
60+
*/
61+
public function afterGetTargetStorePostData(
62+
\Magento\Store\Block\Switcher $subject,
63+
string $result,
64+
Store $store,
65+
array $data = []
66+
): string {
67+
$data[StoreResolverInterface::PARAM_NAME] = $store->getCode();
68+
$currentUrl = $store->getCurrentUrl(true);
69+
$baseUrl = $store->getBaseUrl();
70+
$urlPath = parse_url($currentUrl, PHP_URL_PATH);
71+
$urlToSwitch = $currentUrl;
72+
73+
//check only catalog pages
74+
if ($this->request->getFrontName() === 'catalog') {
75+
$currentRewrite = $this->urlFinder->findOneByData([
76+
UrlRewrite::REQUEST_PATH => ltrim($urlPath, '/'),
77+
UrlRewrite::STORE_ID => $store->getId(),
78+
]);
79+
if (null === $currentRewrite) {
80+
$urlToSwitch = $baseUrl;
81+
}
82+
}
83+
84+
return $this->postHelper->getPostData($urlToSwitch, $data);
85+
}
86+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?xml version="1.0"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
9+
<type name="\Magento\Store\Block\Switcher">
10+
<plugin name="store_switcher_plugin" type="Magento\CatalogUrlRewrite\Plugin\Store\Block\Switcher"/>
11+
</type>
12+
</config>
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\CatalogUrlRewrite\Plugin\Store\Block;
9+
10+
/**
11+
* Integration tests for Magento\CatalogUrlRewrite\Plugin\Store\Block\Switcher block.
12+
*/
13+
class SwitcherTest extends \PHPUnit\Framework\TestCase
14+
{
15+
/**
16+
* @var \Magento\TestFramework\ObjectManager
17+
*/
18+
private $objectManager;
19+
20+
/**
21+
* @var \Magento\Store\Block\Switcher
22+
*/
23+
private $model;
24+
25+
/**
26+
* @var \Magento\Store\Api\StoreRepositoryInterface
27+
*/
28+
private $storeRepository;
29+
30+
/**
31+
* {@inheritdoc}
32+
*/
33+
protected function setUp()
34+
{
35+
$this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
36+
$this->model = $this->objectManager->create(\Magento\Store\Block\Switcher::class);
37+
$this->storeRepository = $this->objectManager->create(\Magento\Store\Api\StoreRepositoryInterface::class);
38+
}
39+
40+
/**
41+
* Test that after switching from Store 1 to Store 2 with another root Category user gets correct store url.
42+
*
43+
* @magentoDataFixture Magento/Store/_files/store.php
44+
* @magentoDataFixture Magento/CatalogUrlRewrite/_files/two_categories_per_two_store_groups.php
45+
* @magentoAppArea frontend
46+
* @return void
47+
*/
48+
public function testGetTargetStorePostData(): void
49+
{
50+
$storeCode = 'test';
51+
$store = $this->storeRepository->get($storeCode);
52+
$result = json_decode($this->model->getTargetStorePostData($store), true);
53+
54+
$this->assertContains($storeCode, $result['action']);
55+
}
56+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
9+
$defaultCategory = $objectManager->create(\Magento\Catalog\Helper\DefaultCategory::class);
10+
/** @var \Magento\Catalog\Model\Category $category */
11+
$category = $objectManager->create(\Magento\Catalog\Model\Category::class);
12+
$category->isObjectNew(true);
13+
$category->setCreatedAt('2014-06-23 09:50:07')
14+
->setName('Category 1')
15+
->setParentId($defaultCategory->getId())
16+
->setPath('1/2/3')
17+
->setLevel(2)
18+
->setAvailableSortBy('name')
19+
->setDefaultSortBy('name')
20+
->setIsActive(true)
21+
->setPosition(1)
22+
->setAvailableSortBy(['position'])
23+
->save();
24+
25+
/** @var \Magento\Store\Model\Store $store */
26+
$store = $objectManager->create(\Magento\Store\Model\Store::class);
27+
28+
$category->setStoreId($store->load('default')->getId())
29+
->setName('category-default-store')
30+
->setUrlKey('category-default-store')
31+
->save();
32+
33+
$rootCategoryForTestStoreGroup = $objectManager->create(\Magento\Catalog\Model\Category::class);
34+
$rootCategoryForTestStoreGroup->isObjectNew(true);
35+
$rootCategoryForTestStoreGroup->setCreatedAt('2014-06-23 09:50:07')
36+
->setName('Category 2')
37+
->setParentId(\Magento\Catalog\Model\Category::TREE_ROOT_ID)
38+
->setPath('1/2/334')
39+
->setLevel(2)
40+
->setAvailableSortBy('name')
41+
->setDefaultSortBy('name')
42+
->setIsActive(true)
43+
->setPosition(1)
44+
->setAvailableSortBy(['position'])
45+
->save();
46+
47+
$rootCategoryForTestStoreGroup->setStoreId($store->load('test')->getId())
48+
->setName('category-test-store')
49+
->setUrlKey('category-test-store')
50+
->save();
51+
52+
$storeCode = 'test';
53+
/** @var \Magento\Store\Api\StoreRepositoryInterface $storeRepository */
54+
$storeRepository = $objectManager->create(\Magento\Store\Api\StoreRepositoryInterface::class);
55+
/** @var \Magento\Store\Api\Data\StoreInterface $store */
56+
$store = $storeRepository->get($storeCode);
57+
58+
/** @var \Magento\Store\Model\Group $storeGroup */
59+
$storeGroup = $objectManager->create(\Magento\Store\Model\Group::class)
60+
->setWebsiteId('1')
61+
->setCode('test_store_group')
62+
->setName('Test Store Group')
63+
->setRootCategoryId($rootCategoryForTestStoreGroup->getId())
64+
->setDefaultStoreId($store->getId())
65+
->save();
66+
67+
$store->setGroupId($storeGroup->getId())->save();
68+
69+
/* Refresh stores memory cache */
70+
$objectManager->get(\Magento\Store\Model\StoreManagerInterface::class)->reinitStores();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
use Magento\Framework\Registry;
9+
use Magento\Store\Model\Group;
10+
use Magento\TestFramework\Helper\Bootstrap;
11+
use Magento\Catalog\Api\CategoryListInterface;
12+
use Magento\Catalog\Api\CategoryRepositoryInterface;
13+
use Magento\Framework\Api\SearchCriteriaBuilder;
14+
15+
$objectManager = Bootstrap::getObjectManager();
16+
17+
/** @var Registry $registry */
18+
$registry = $objectManager->get(Registry::class);
19+
$registry->unregister('isSecureArea');
20+
$registry->register('isSecureArea', true);
21+
// Delete first category
22+
/** @var SearchCriteriaBuilder $searchCriteriaBuilder */
23+
$searchCriteriaBuilder = $objectManager->get(SearchCriteriaBuilder::class);
24+
$searchCriteria = $searchCriteriaBuilder->addFilter('name', 'Category 1')->create();
25+
/** @var CategoryListInterface $categoryList */
26+
$categoryList = $objectManager->get(CategoryListInterface::class);
27+
$categories = $categoryList->getList($searchCriteria)->getItems();
28+
/** @var CategoryRepositoryInterface $categoryRepository */
29+
$categoryRepository = $objectManager->get(CategoryRepositoryInterface::class);
30+
foreach ($categories as $category) {
31+
$categoryRepository->delete($category);
32+
}
33+
// Delete second category
34+
$searchCriteria = $searchCriteriaBuilder->addFilter('name', 'Category 2')->create();
35+
$categories = $categoryList->getList($searchCriteria)->getItems();
36+
foreach ($categories as $category) {
37+
$categoryRepository->delete($category);
38+
}
39+
// Delete store group
40+
/** @var Group $store */
41+
$storeGroup = $objectManager->get(Group::class);
42+
$storeGroup->load('test_store_group', 'code');
43+
if ($storeGroup->getId()) {
44+
$storeGroup->delete();
45+
}
46+
$registry->unregister('isSecureArea');
47+
$registry->register('isSecureArea', false);

0 commit comments

Comments
 (0)