Skip to content

Commit 8fc0d36

Browse files
committed
Merge remote-tracking branch 'origin/imported-magento-magento2-32598' into 2.4-develop-pr137
2 parents b242759 + b92d437 commit 8fc0d36

File tree

5 files changed

+411
-23
lines changed

5 files changed

+411
-23
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
9+
<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
10+
xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd">
11+
<actionGroup name="AdminChangeSeoUrlKeyToDefaultValueWithoutRedirectActionGroup">
12+
<annotations>
13+
<description>Requires navigation to category creation/edit page. Selects 'Use Default Value' checkbox for the 'URL Key' with 'Create Permanent Redirect for old URL' unchecked.</description>
14+
</annotations>
15+
16+
<conditionalClick selector="{{AdminCategorySEOSection.SectionHeader}}" dependentSelector="{{AdminCategorySEOSection.UrlKeyInput}}" visible="false" stepKey="clickOnSEOTab"/>
17+
<waitForElementVisible selector="{{AdminCategorySEOSection.UrlKeyInput}}" stepKey="waitForSEOTabOpened"/>
18+
<clearField selector="{{AdminCategorySEOSection.UrlKeyInput}}" stepKey="clearUrlKeyField"/>
19+
<uncheckOption selector="{{AdminCategorySEOSection.UrlKeyRedirectCheckbox}}" stepKey="uncheckRedirectCheckbox"/>
20+
<checkOption selector="{{AdminCategorySEOSection.UrlKeyDefaultValueCheckbox}}" stepKey="checkUseDefaultValueCheckbox"/>
21+
</actionGroup>
22+
</actionGroups>
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
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\Model\ResourceModel\Category;
9+
10+
use Magento\Catalog\Api\Data\CategoryInterface;
11+
use Magento\Catalog\Model\Category;
12+
use Magento\Eav\Model\Config as EavConfig;
13+
use Magento\Framework\App\ResourceConnection;
14+
use Magento\Framework\DB\Select;
15+
use Magento\Framework\EntityManager\MetadataPool;
16+
use Magento\Store\Model\Store;
17+
18+
/**
19+
* Fetch category 'url_key' default value from the database.
20+
*/
21+
class GetDefaultUrlKey
22+
{
23+
/**
24+
* @var MetadataPool
25+
*/
26+
private $metadataPool;
27+
28+
/**
29+
* @var ResourceConnection
30+
*/
31+
private $resourceConnection;
32+
33+
/**
34+
* @var EavConfig
35+
*/
36+
private $eavConfig;
37+
38+
/**
39+
* @param MetadataPool $metadataPool
40+
* @param ResourceConnection $resourceConnection
41+
* @param EavConfig $eavConfig
42+
*/
43+
public function __construct(
44+
MetadataPool $metadataPool,
45+
ResourceConnection $resourceConnection,
46+
EavConfig $eavConfig
47+
) {
48+
$this->metadataPool = $metadataPool;
49+
$this->resourceConnection = $resourceConnection;
50+
$this->eavConfig = $eavConfig;
51+
}
52+
53+
/**
54+
* Retrieve 'url_key' value for default store.
55+
*
56+
* @param int $categoryId
57+
* @return string|null
58+
*/
59+
public function execute(int $categoryId): ?string
60+
{
61+
$metadata = $this->metadataPool->getMetadata(CategoryInterface::class);
62+
$entityTypeId = $this->eavConfig->getEntityType(Category::ENTITY)->getId();
63+
$linkField = $metadata->getLinkField();
64+
$whereConditions = [
65+
'e.entity_type_id = ' . $entityTypeId,
66+
"e.attribute_code = 'url_key'",
67+
'c.' . $linkField . ' = ' . $categoryId,
68+
'c.store_id = ' . Store::DEFAULT_STORE_ID,
69+
];
70+
$connection = $this->resourceConnection->getConnection();
71+
$select = $connection->select()
72+
->from(['c' => $this->resourceConnection->getTableName('catalog_category_entity_varchar')])
73+
->joinLeft(
74+
['e' => $this->resourceConnection->getTableName('eav_attribute')],
75+
'e.attribute_id = c.attribute_id'
76+
)
77+
->reset(Select::COLUMNS)
78+
->columns(['c.value'])
79+
->where(implode(' AND ', $whereConditions));
80+
81+
return $connection->fetchOne($select) ?: null;
82+
}
83+
}

app/code/Magento/CatalogUrlRewrite/Observer/CategoryUrlPathAutogeneratorObserver.php

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111
use Magento\Catalog\Model\Category;
1212
use Magento\CatalogUrlRewrite\Model\Category\ChildrenCategoriesProvider;
1313
use Magento\CatalogUrlRewrite\Model\CategoryUrlPathGenerator;
14+
use Magento\CatalogUrlRewrite\Model\ResourceModel\Category\GetDefaultUrlKey;
1415
use Magento\CatalogUrlRewrite\Service\V1\StoreViewService;
16+
use Magento\Framework\Event\Observer;
1517
use Magento\Framework\Event\ObserverInterface;
1618
use Magento\Framework\Exception\LocalizedException;
1719
use Magento\Framework\Exception\NoSuchEntityException;
@@ -49,35 +51,43 @@ class CategoryUrlPathAutogeneratorObserver implements ObserverInterface
4951
*/
5052
private $compositeUrlValidator;
5153

54+
/**
55+
* @var GetDefaultUrlKey
56+
*/
57+
private $getDefaultUrlKey;
58+
5259
/**
5360
* @param CategoryUrlPathGenerator $categoryUrlPathGenerator
5461
* @param ChildrenCategoriesProvider $childrenCategoriesProvider
5562
* @param StoreViewService $storeViewService
5663
* @param CategoryRepositoryInterface $categoryRepository
5764
* @param CompositeUrlKey $compositeUrlValidator
65+
* @param GetDefaultUrlKey $getDefaultUrlKey
5866
*/
5967
public function __construct(
6068
CategoryUrlPathGenerator $categoryUrlPathGenerator,
6169
ChildrenCategoriesProvider $childrenCategoriesProvider,
6270
StoreViewService $storeViewService,
6371
CategoryRepositoryInterface $categoryRepository,
64-
CompositeUrlKey $compositeUrlValidator
72+
CompositeUrlKey $compositeUrlValidator,
73+
GetDefaultUrlKey $getDefaultUrlKey
6574
) {
6675
$this->categoryUrlPathGenerator = $categoryUrlPathGenerator;
6776
$this->childrenCategoriesProvider = $childrenCategoriesProvider;
6877
$this->storeViewService = $storeViewService;
6978
$this->categoryRepository = $categoryRepository;
7079
$this->compositeUrlValidator = $compositeUrlValidator;
80+
$this->getDefaultUrlKey = $getDefaultUrlKey;
7181
}
7282

7383
/**
7484
* Method for update/set url path.
7585
*
76-
* @param \Magento\Framework\Event\Observer $observer
86+
* @param Observer $observer
7787
* @return void
7888
* @throws LocalizedException
7989
*/
80-
public function execute(\Magento\Framework\Event\Observer $observer)
90+
public function execute(Observer $observer)
8191
{
8292
/** @var Category $category */
8393
$category = $observer->getEvent()->getCategory();
@@ -90,6 +100,12 @@ public function execute(\Magento\Framework\Event\Observer $observer)
90100
$resultUrlKey = $category->formatUrlKey($category->getOrigData('name'));
91101
$this->updateUrlKey($category, $resultUrlKey);
92102
}
103+
if ($category->hasChildren()) {
104+
$defaultUrlKey = $this->getDefaultUrlKey->execute((int)$category->getId());
105+
if ($defaultUrlKey) {
106+
$this->updateUrlKey($category, $defaultUrlKey);
107+
}
108+
}
93109
$category->setUrlKey(null)->setUrlPath(null);
94110
}
95111
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
9+
<tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
10+
xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd">
11+
<test name="StorefrontCheckCategoryUrlPathForCustomStoreAfterChangingHierarchyTest">
12+
<annotations>
13+
<features value="CatalogUrlRewrite"/>
14+
<stories value="Url rewrites"/>
15+
<title value="Checking category URL path for custom store after changing hierarchy"/>
16+
<description value="Checks that category and its children have correct URL path for custom store after changing hierarchy"/>
17+
<severity value="MAJOR"/>
18+
<testCaseId value="MC-41615"/>
19+
<useCaseId value="MC-40780"/>
20+
<group value="catalog"/>
21+
<group value="urlRewrite"/>
22+
</annotations>
23+
<before>
24+
<!-- Create categories -->
25+
<createData entity="_defaultCategory" stepKey="createCategory1"/>
26+
<createData entity="SubCategoryWithParent" stepKey="createCategory2">
27+
<requiredEntity createDataKey="createCategory1"/>
28+
</createData>
29+
<createData entity="_defaultCategory" stepKey="createCategory3"/>
30+
<createData entity="_defaultCategory" stepKey="createCategory4"/>
31+
<!-- Login as Admin -->
32+
<actionGroup ref="AdminLoginActionGroup" stepKey="loginAsAdmin"/>
33+
<!-- Create "EN" Store View -->
34+
<actionGroup ref="AdminCreateStoreViewActionGroup" stepKey="createEnStoreView">
35+
<argument name="customStore" value="customStoreEN"/>
36+
</actionGroup>
37+
</before>
38+
<after>
39+
<!-- Delete categories -->
40+
<deleteData createDataKey="createCategory4" stepKey="deleteCategory4"/>
41+
<deleteData createDataKey="createCategory3" stepKey="deleteCategory3"/>
42+
<deleteData createDataKey="createCategory2" stepKey="deleteCategory2"/>
43+
<deleteData createDataKey="createCategory1" stepKey="deleteCategory1"/>
44+
<actionGroup ref="AdminDeleteStoreViewActionGroup" stepKey="deleteEnStoreView">
45+
<argument name="customStore" value="customStoreEN"/>
46+
</actionGroup>
47+
<!-- Clear grid filters -->
48+
<actionGroup ref="ClearFiltersAdminDataGridActionGroup" stepKey="clearStoreFilters"/>
49+
<actionGroup ref="AdminLogoutActionGroup" stepKey="logoutFromAdmin"/>
50+
</after>
51+
52+
<!-- Go to Category 1 edit page on "EN" store view -->
53+
<actionGroup ref="SwitchCategoryStoreViewActionGroup" stepKey="goToCategory1PageOnEnStoreView">
54+
<argument name="Store" value="customStoreEN.name"/>
55+
<argument name="CatName" value="$createCategory1.name$"/>
56+
</actionGroup>
57+
58+
<!-- Change Name and URL key for Category 1 -->
59+
<actionGroup ref="AdminChangeCategoryNameOnStoreViewLevelActionGroup" stepKey="changeCategory1NameForEnStoreView">
60+
<argument name="categoryName" value="EN 1"/>
61+
</actionGroup>
62+
<actionGroup ref="AdminChangeSeoUrlKeyForSubCategoryWithoutRedirectActionGroup" stepKey="changeCategory1UrlKeyForEnStoreView">
63+
<argument name="value" value="en 1"/>
64+
</actionGroup>
65+
66+
<!-- Change Name and URL key for Category 2 -->
67+
<actionGroup ref="AdminCategoriesOpenCategoryActionGroup" stepKey="openCategory2EditPage">
68+
<argument name="category" value="$createCategory2$"/>
69+
</actionGroup>
70+
<actionGroup ref="AdminChangeCategoryNameOnStoreViewLevelActionGroup" stepKey="changeCategory2NameForEnStoreView">
71+
<argument name="categoryName" value="EN 2"/>
72+
</actionGroup>
73+
<actionGroup ref="AdminChangeSeoUrlKeyForSubCategoryWithoutRedirectActionGroup" stepKey="changeCategory2UrlKeyForEnStoreView">
74+
<argument name="value" value="en 2"/>
75+
</actionGroup>
76+
77+
<!-- Change Name and URL key for Category 3 -->
78+
<actionGroup ref="AdminCategoriesOpenCategoryActionGroup" stepKey="openCategory3EditPage">
79+
<argument name="category" value="$createCategory3$"/>
80+
</actionGroup>
81+
<actionGroup ref="AdminChangeCategoryNameOnStoreViewLevelActionGroup" stepKey="changeCategory3NameForEnStoreView">
82+
<argument name="categoryName" value="EN 3"/>
83+
</actionGroup>
84+
<actionGroup ref="AdminChangeSeoUrlKeyForSubCategoryWithoutRedirectActionGroup" stepKey="changeCategory3UrlKeyForEnStoreView">
85+
<argument name="value" value="en 3"/>
86+
</actionGroup>
87+
88+
<!-- Change Name and URL key for Category 4 -->
89+
<actionGroup ref="AdminCategoriesOpenCategoryActionGroup" stepKey="openCategory4EditPage">
90+
<argument name="category" value="$createCategory4$"/>
91+
</actionGroup>
92+
<actionGroup ref="AdminChangeCategoryNameOnStoreViewLevelActionGroup" stepKey="changeCategory4NameForEnStoreView">
93+
<argument name="categoryName" value="EN 4"/>
94+
</actionGroup>
95+
<actionGroup ref="AdminChangeSeoUrlKeyForSubCategoryWithoutRedirectActionGroup" stepKey="changeCategory4UrlKeyForEnStoreView">
96+
<argument name="value" value="en 4"/>
97+
</actionGroup>
98+
99+
<!-- Go to Home page on the Storefront -->
100+
<actionGroup ref="StorefrontOpenHomePageActionGroup" stepKey="goToHomePage"/>
101+
<!-- Switch store view to 'EN' -->
102+
<actionGroup ref="StorefrontSwitchStoreViewActionGroup" stepKey="switchStoreViewToEn">
103+
<argument name="storeView" value="customStoreEN"/>
104+
</actionGroup>
105+
106+
<!-- Assert Category 2 URL path on the 'EN' store view -->
107+
<actionGroup ref="StorefrontGoToSubCategoryPageActionGroup" stepKey="navigateToCategory2Page">
108+
<argument name="categoryName" value="EN 1"/>
109+
<argument name="subCategoryName" value="EN 2"/>
110+
</actionGroup>
111+
<actionGroup ref="StorefrontAssertProperUrlIsShownActionGroup" stepKey="assertUrlPathForCategory2">
112+
<argument name="urlPath" value="/en-1/en-2.html"/>
113+
</actionGroup>
114+
115+
<!-- Go to Categories page on the Admin -->
116+
<actionGroup ref="AdminOpenCategoryPageActionGroup" stepKey="goToAdminCategoriesPage"/>
117+
<see userInput="All Store View" selector="{{AdminMainActionsSection.storeViewDropdown}}" stepKey="assertAllStoreView"/>
118+
119+
<!-- Move Category 2 to 'Default Category' -->
120+
<actionGroup ref="MoveCategoryActionGroup" stepKey="moveCategory2ToDefaultCategory">
121+
<argument name="childCategory" value="$createCategory2.name$"/>
122+
<argument name="parentCategory" value="Default Category"/>
123+
</actionGroup>
124+
<!-- Move Category 4 to Category 3 -->
125+
<actionGroup ref="MoveCategoryActionGroup" stepKey="moveCategory4ToCategory3">
126+
<argument name="childCategory" value="$createCategory4.name$"/>
127+
<argument name="parentCategory" value="$createCategory3.name$"/>
128+
</actionGroup>
129+
130+
<!-- Create Category 5 -->
131+
<actionGroup ref="AdminCategoriesOpenCategoryActionGroup" stepKey="navigateToCategory2EditPage">
132+
<argument name="category" value="$createCategory2$"/>
133+
</actionGroup>
134+
<click selector="{{AdminCategorySidebarActionSection.AddSubcategoryButton}}" stepKey="clickToAddCategory5"/>
135+
<checkOption selector="{{AdminCategoryBasicFieldSection.EnableCategory}}" stepKey="enableCategory5"/>
136+
<fillField selector="{{AdminCategoryBasicFieldSection.CategoryNameInput}}" userInput="{{SimpleSubCategory.name}}" stepKey="fillCategory5Name"/>
137+
<actionGroup ref="AdminSaveCategoryActionGroup" stepKey="saveCategory5"/>
138+
<actionGroup ref="AssertAdminCategorySaveSuccessMessageActionGroup" stepKey="assertCategory5Saved"/>
139+
140+
<!-- Assert Category 5 URL path on the 'EN' store view -->
141+
<actionGroup ref="StorefrontGoToSubCategoryPageActionGroup" stepKey="navigateToCategory5Page">
142+
<argument name="categoryName" value="EN 2"/>
143+
<argument name="subCategoryName" value="{{SimpleSubCategory.name}}"/>
144+
</actionGroup>
145+
<actionGroup ref="StorefrontAssertProperUrlIsShownActionGroup" stepKey="assertUrlPathForCategory5">
146+
<argument name="urlPath" value="en-2/{{SimpleSubCategory.name_lwr}}.html"/>
147+
</actionGroup>
148+
149+
<!-- Go to Category 2 edit page on "EN" store view -->
150+
<actionGroup ref="AdminOpenCategoryPageActionGroup" stepKey="goToAdminCategoryIndexPage"/>
151+
<actionGroup ref="AdminCategoriesOpenCategoryActionGroup" stepKey="goToCategory2EditPage">
152+
<argument name="category" value="$createCategory2$"/>
153+
</actionGroup>
154+
<actionGroup ref="AdminSwitchStoreViewActionGroup" stepKey="switchToDefaultStoreView">
155+
<argument name="storeView" value="customStoreEN.name"/>
156+
</actionGroup>
157+
158+
<!-- Change Category 2 URL key to default value -->
159+
<actionGroup ref="AdminChangeSeoUrlKeyToDefaultValueWithoutRedirectActionGroup" stepKey="changeCategory2UrlKeyToDefaultValue"/>
160+
<actionGroup ref="AdminSaveCategoryActionGroup" stepKey="saveCategory2"/>
161+
<actionGroup ref="AssertAdminCategorySaveSuccessMessageActionGroup" stepKey="assertCategory2Saved"/>
162+
163+
<!-- Go to Home page on the Storefront -->
164+
<actionGroup ref="StorefrontOpenHomePageActionGroup" stepKey="navigateToHomePage"/>
165+
<!-- Assert Category 5 URL path on the 'EN' store view after change parent category -->
166+
<actionGroup ref="StorefrontGoToSubCategoryPageActionGroup" stepKey="goToCategory5Page">
167+
<argument name="categoryName" value="EN 2"/>
168+
<argument name="subCategoryName" value="{{SimpleSubCategory.name}}"/>
169+
</actionGroup>
170+
<actionGroup ref="StorefrontAssertProperUrlIsShownActionGroup" stepKey="assertUrlPathForCategory5AfterChangeParent">
171+
<argument name="urlPath" value="$createCategory2.name_lwr$/{{SimpleSubCategory.name_lwr}}.html"/>
172+
</actionGroup>
173+
</test>
174+
</tests>

0 commit comments

Comments
 (0)