Skip to content

Commit 511145b

Browse files
committed
Merge branch '2.4-develop' of https://github.com/magento-commerce/magento2ce into ACP2E-1345
2 parents c91f2c7 + 7e90ca5 commit 511145b

File tree

19 files changed

+442
-78
lines changed

19 files changed

+442
-78
lines changed

app/code/Magento/Backend/Test/Mftf/Test/AdminLoginSuccessfulTest.xml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,6 @@
1919
<group value="example"/>
2020
<group value="login"/>
2121
</annotations>
22-
23-
2422
<actionGroup ref="AdminLoginActionGroup" stepKey="loginAsAdmin"/>
2523
<actionGroup ref="AssertAdminSuccessLoginActionGroup" stepKey="assertLoggedIn"/>
2624
<actionGroup ref="AdminLogoutActionGroup" stepKey="logoutFromAdmin"/>

app/code/Magento/Bundle/Test/Mftf/ActionGroup/SetBundleProductAttributesActionGroup.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
<checkOption selector="{{AdminProductFormBundleSection.dynamicWeightToggle}}" stepKey="dynamicWeight"/>
6161

6262
<!--Weight-->
63+
<scrollTo selector="{{AdminProductFormBundleSection.weightFieldLabel}}" stepKey="scrollToWeight"/>
6364
<fillField selector="{{AdminProductFormBundleSection.weightField}}" userInput="{{weight}}" stepKey="fillIn"/>
6465

6566
<!--Visibility-->

app/code/Magento/Bundle/Test/Mftf/Section/AdminProductFormBundleSection.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,5 +124,6 @@
124124
<element name="customizableOptionPrice" type="input" selector=".//*[@name='product[options][0][price]']" />
125125
<element name="priceType" type="select" selector="[name='product[options][0][price_type]']" />
126126
<element name="priceTypeSelectPercent" type="select" selector="//*[@name='product[options][0][price_type]']/option[2]" />
127+
<element name="weightFieldLabel" type="input" selector="//div[@data-index='weight']/div/label/span"/>
127128
</section>
128129
</sections>

app/code/Magento/Catalog/Model/Category/AttributeRepository.php

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@ class AttributeRepository implements CategoryAttributeRepositoryInterface
2929
*/
3030
private $eavConfig;
3131

32+
/**
33+
* @var array
34+
*/
35+
private $metadataCache;
36+
3237
/**
3338
* @param \Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder
3439
* @param \Magento\Framework\Api\FilterBuilder $filterBuilder
@@ -48,7 +53,7 @@ public function __construct(
4853
}
4954

5055
/**
51-
* {@inheritdoc}
56+
* @inheritdoc
5257
*/
5358
public function getList(\Magento\Framework\Api\SearchCriteriaInterface $searchCriteria)
5459
{
@@ -59,7 +64,7 @@ public function getList(\Magento\Framework\Api\SearchCriteriaInterface $searchCr
5964
}
6065

6166
/**
62-
* {@inheritdoc}
67+
* @inheritdoc
6368
*/
6469
public function get($attributeCode)
6570
{
@@ -70,23 +75,27 @@ public function get($attributeCode)
7075
}
7176

7277
/**
73-
* {@inheritdoc}
78+
* @inheritdoc
79+
*
7480
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
7581
*/
7682
public function getCustomAttributesMetadata($dataObjectClassName = null)
7783
{
78-
$defaultAttributeSetId = $this->eavConfig
79-
->getEntityType(\Magento\Catalog\Api\Data\CategoryAttributeInterface::ENTITY_TYPE_CODE)
80-
->getDefaultAttributeSetId();
81-
$searchCriteria = $this->searchCriteriaBuilder->addFilters(
82-
[
83-
$this->filterBuilder
84-
->setField('attribute_set_id')
85-
->setValue($defaultAttributeSetId)
86-
->create(),
87-
]
88-
);
89-
90-
return $this->getList($searchCriteria->create())->getItems();
84+
if (!isset($this->metadataCache[$dataObjectClassName])) {
85+
$defaultAttributeSetId = $this->eavConfig
86+
->getEntityType(\Magento\Catalog\Api\Data\CategoryAttributeInterface::ENTITY_TYPE_CODE)
87+
->getDefaultAttributeSetId();
88+
$searchCriteria = $this->searchCriteriaBuilder->addFilters(
89+
[
90+
$this->filterBuilder
91+
->setField('attribute_set_id')
92+
->setValue($defaultAttributeSetId)
93+
->create(),
94+
]
95+
);
96+
$this->metadataCache[$dataObjectClassName] = $this->getList($searchCriteria->create())
97+
->getItems();
98+
}
99+
return $this->metadataCache[$dataObjectClassName];
91100
}
92101
}

app/code/Magento/Catalog/Test/Mftf/Section/StorefrontCategoryMainSection.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,5 +43,6 @@
4343
<element name="searchStore" type="input" selector="//div/input[@id='search']" />
4444
<element name="productAttributeName" type="button" selector="//div[@class='filter-options-title' and contains(text(),'{{var1}}')]" parameterized="true"/>
4545
<element name="productAttributeOptionValue" type="button" selector="//div[@id='narrow-by-list']//a[contains(text(), '{{var1}}')]" parameterized="true"/>
46+
<element name="outOfStockProductCategoryPage" type="text" selector="//div[@class='stock unavailable']//span[text()='Out of stock']"/>
4647
</section>
4748
</sections>

app/code/Magento/Catalog/Test/Mftf/Section/StorefrontCategoryTopToolbarSection.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,6 @@
1414
<element name="sortByDropdown" type="select" selector=".//*[@class='toolbar toolbar-products'][1]//*[@id='sorter']" timeout="30"/>
1515
<element name="sortDirectionAsc" type="button" selector=".//*[@class='toolbar toolbar-products'][1]//a[contains(@class, 'sort-asc')]" timeout="30"/>
1616
<element name="sortDirectionDesc" type="button" selector=".//*[@class='toolbar toolbar-products'][1]//a[contains(@class, 'sort-desc')]" timeout="30"/>
17+
<element name="showDropdown" type="select" selector="//*[@id='limiter']" timeout="30"/>
1718
</section>
1819
</sections>
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
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+
<tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
9+
xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd">
10+
<test name="AdminChangeCategoryDisplaySettingsOnStorefrontTest">
11+
<annotations>
12+
<features value="Catalog"/>
13+
<stories value="ChangeCategoryDisplaySettingsOnStorefront"/>
14+
<title value="Verify correctness of Sorting,Navigation, Listing products"/>
15+
<description value="Verify correctness of Sorting, Navigation, Listing products at the Storefront Category"/>
16+
<severity value="MAJOR"/>
17+
<testCaseId value="AC-4150"/>
18+
<group value="Catalog"/>
19+
</annotations>
20+
<before>
21+
<!-- create category -->
22+
<createData entity="_defaultCategory" stepKey="createCategory"/>
23+
<!-- create 11 simple products -->
24+
<createData entity="SimpleProduct" stepKey="createSimpleProduct1">
25+
<field key="price">10</field>
26+
<field key="quantity">1000</field>
27+
<requiredEntity createDataKey="createCategory"/>
28+
</createData>
29+
<createData entity="SimpleProduct" stepKey="createSimpleProduct2">
30+
<field key="price">11</field>
31+
<field key="quantity">1000</field>
32+
<requiredEntity createDataKey="createCategory"/>
33+
</createData>
34+
<createData entity="SimpleProduct" stepKey="createSimpleProduct3">
35+
<field key="price">12</field>
36+
<field key="quantity">1000</field>
37+
<requiredEntity createDataKey="createCategory"/>
38+
</createData>
39+
<createData entity="SimpleProduct" stepKey="createSimpleProduct4">
40+
<field key="price">13</field>
41+
<field key="quantity">1000</field>
42+
<requiredEntity createDataKey="createCategory"/>
43+
</createData>
44+
<createData entity="SimpleProduct" stepKey="createSimpleProduct5">
45+
<field key="price">14</field>
46+
<field key="quantity">1000</field>
47+
<requiredEntity createDataKey="createCategory"/>
48+
</createData>
49+
<createData entity="SimpleProduct" stepKey="createSimpleProduct6">
50+
<field key="price">15</field>
51+
<field key="quantity">1000</field>
52+
<requiredEntity createDataKey="createCategory"/>
53+
</createData>
54+
<createData entity="SimpleProduct" stepKey="createSimpleProduct7">
55+
<field key="price">16</field>
56+
<field key="quantity">1000</field>
57+
<requiredEntity createDataKey="createCategory"/>
58+
</createData>
59+
<createData entity="SimpleProduct" stepKey="createSimpleProduct8">
60+
<field key="price">17</field>
61+
<field key="quantity">1000</field>
62+
<requiredEntity createDataKey="createCategory"/>
63+
</createData>
64+
<createData entity="SimpleProduct" stepKey="createSimpleProduct9">
65+
<field key="price">18</field>
66+
<field key="quantity">1000</field>
67+
<requiredEntity createDataKey="createCategory"/>
68+
</createData>
69+
<createData entity="SimpleProduct" stepKey="createSimpleProduct10">
70+
<field key="price">19</field>
71+
<field key="quantity">1000</field>
72+
<requiredEntity createDataKey="createCategory"/>
73+
</createData>
74+
<createData entity="SimpleProduct" stepKey="createSimpleProduct11">
75+
<field key="price">20</field>
76+
<field key="quantity">1000</field>
77+
<requiredEntity createDataKey="createCategory"/>
78+
</createData>
79+
<createData entity="SimpleProduct" stepKey="createSimpleProduct12">
80+
<field key="price">21</field>
81+
<field key="quantity">1000</field>
82+
<requiredEntity createDataKey="createCategory"/>
83+
</createData><createData entity="SimpleProduct" stepKey="createSimpleProduct13">
84+
<field key="price">22</field>
85+
<field key="quantity">1000</field>
86+
<requiredEntity createDataKey="createCategory"/>
87+
</createData><createData entity="SimpleProduct" stepKey="createSimpleProduct14">
88+
<field key="price">23</field>
89+
<field key="quantity">1000</field>
90+
<requiredEntity createDataKey="createCategory"/>
91+
</createData><createData entity="SimpleProduct" stepKey="createSimpleProduct15">
92+
<field key="price">24</field>
93+
<field key="quantity">1000</field>
94+
<requiredEntity createDataKey="createCategory"/>
95+
</createData>
96+
</before>
97+
<after>
98+
<!-- delete created entities -->
99+
<deleteData createDataKey="createSimpleProduct1" stepKey="deleteSimpleProduct1"/>
100+
<deleteData createDataKey="createSimpleProduct2" stepKey="deleteSimpleProduct2"/>
101+
<deleteData createDataKey="createSimpleProduct3" stepKey="deleteSimpleProduct3"/>
102+
<deleteData createDataKey="createSimpleProduct4" stepKey="deleteSimpleProduct4"/>
103+
<deleteData createDataKey="createSimpleProduct5" stepKey="deleteSimpleProduct5"/>
104+
<deleteData createDataKey="createSimpleProduct6" stepKey="deleteSimpleProduct6"/>
105+
<deleteData createDataKey="createSimpleProduct7" stepKey="deleteSimpleProduct7"/>
106+
<deleteData createDataKey="createSimpleProduct8" stepKey="deleteSimpleProduct8"/>
107+
<deleteData createDataKey="createSimpleProduct9" stepKey="deleteSimpleProduct9"/>
108+
<deleteData createDataKey="createSimpleProduct10" stepKey="deleteSimpleProduct10"/>
109+
<deleteData createDataKey="createSimpleProduct11" stepKey="deleteSimpleProduct11"/>
110+
<deleteData createDataKey="createSimpleProduct12" stepKey="deleteSimpleProduct12"/>
111+
<deleteData createDataKey="createSimpleProduct13" stepKey="deleteSimpleProduct13"/>
112+
<deleteData createDataKey="createSimpleProduct14" stepKey="deleteSimpleProduct14"/>
113+
<deleteData createDataKey="createSimpleProduct15" stepKey="deleteSimpleProduct15"/>
114+
<deleteData createDataKey="createCategory" stepKey="deleteCategory"/>
115+
</after>
116+
<!-- Login to Admin page -->
117+
<actionGroup ref="AdminLoginActionGroup" stepKey="loginAsAdmin"/>
118+
<actionGroup ref="AssertAdminSuccessLoginActionGroup" stepKey="assertLoggedIn"/>
119+
<!-- Open created category on Storefront -->
120+
<actionGroup ref="StorefrontGoToCategoryPageActionGroup" stepKey="openCategoryPage">
121+
<argument name="categoryName" value="$$createCategory.name$$"/>
122+
</actionGroup>
123+
<!-- Switch category view to List mode -->
124+
<actionGroup ref="StorefrontSwitchCategoryViewToListModeActionGroup" stepKey="switchCategoryViewToListMode"/>
125+
<!-- Sort products By Price -->
126+
<actionGroup ref="StorefrontCategoryPageSortProductActionGroup" stepKey="sortProductByPrice"/>
127+
<!-- Set Ascending Direction -->
128+
<actionGroup ref="StorefrontCategoryPageSortAscendingActionGroup" stepKey="setAscendingDirection"/>
129+
<!-- Sort products By ProductName -->
130+
<selectOption selector="{{StorefrontCategoryTopToolbarSection.sortByDropdown}}" userInput="Product Name" stepKey="selectSortByProductName"/>
131+
<!-- Set Descending Direction -->
132+
<actionGroup ref="StorefrontCategoryPageSortDescendingActionGroup" stepKey="setDescendingDirection"/>
133+
<selectOption selector="{{StorefrontCategoryTopToolbarSection.showDropdown}}" userInput="15" stepKey="selectShowProducts"/>
134+
<actionGroup ref="AdminLogoutActionGroup" stepKey="logoutFromAdmin"/>
135+
</test>
136+
</tests>
137+
138+

app/code/Magento/CatalogGraphQl/Model/Category/CategoryFilter.php

Lines changed: 13 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,11 @@
77

88
namespace Magento\CatalogGraphQl\Model\Category;
99

10-
use Magento\Catalog\Api\CategoryRepositoryInterface;
11-
use Magento\Catalog\Api\Data\CategorySearchResultsInterface;
12-
use Magento\Catalog\Api\Data\CategorySearchResultsInterfaceFactory;
1310
use Magento\Catalog\Model\ResourceModel\Category\CollectionFactory;
1411
use Magento\CatalogGraphQl\Model\Resolver\Categories\DataProvider\Category\CollectionProcessorInterface;
1512
use Magento\CatalogGraphQl\Model\Category\Filter\SearchCriteria;
1613
use Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface;
14+
use Magento\Framework\DB\Select;
1715
use Magento\Framework\Exception\InputException;
1816
use Magento\Framework\GraphQl\Exception\GraphQlInputException;
1917
use Magento\GraphQl\Model\Query\ContextInterface;
@@ -39,16 +37,6 @@ class CategoryFilter
3937
*/
4038
private $extensionAttributesJoinProcessor;
4139

42-
/**
43-
* @var CategorySearchResultsInterfaceFactory
44-
*/
45-
private $categorySearchResultsFactory;
46-
47-
/**
48-
* @var CategoryRepositoryInterface
49-
*/
50-
private $categoryRepository;
51-
5240
/**
5341
* @var SearchCriteria
5442
*/
@@ -58,23 +46,17 @@ class CategoryFilter
5846
* @param CollectionFactory $categoryCollectionFactory
5947
* @param CollectionProcessorInterface $collectionProcessor
6048
* @param JoinProcessorInterface $extensionAttributesJoinProcessor
61-
* @param CategorySearchResultsInterfaceFactory $categorySearchResultsFactory
62-
* @param CategoryRepositoryInterface $categoryRepository
6349
* @param SearchCriteria $searchCriteria
6450
*/
6551
public function __construct(
6652
CollectionFactory $categoryCollectionFactory,
6753
CollectionProcessorInterface $collectionProcessor,
6854
JoinProcessorInterface $extensionAttributesJoinProcessor,
69-
CategorySearchResultsInterfaceFactory $categorySearchResultsFactory,
70-
CategoryRepositoryInterface $categoryRepository,
7155
SearchCriteria $searchCriteria
7256
) {
7357
$this->categoryCollectionFactory = $categoryCollectionFactory;
7458
$this->collectionProcessor = $collectionProcessor;
7559
$this->extensionAttributesJoinProcessor = $extensionAttributesJoinProcessor;
76-
$this->categorySearchResultsFactory = $categorySearchResultsFactory;
77-
$this->categoryRepository = $categoryRepository;
7860
$this->searchCriteria = $searchCriteria;
7961
}
8062

@@ -95,22 +77,21 @@ public function getResult(array $criteria, StoreInterface $store, array $attribu
9577
$this->extensionAttributesJoinProcessor->process($collection);
9678
$this->collectionProcessor->process($collection, $searchCriteria, $attributeNames, $context);
9779

98-
/** @var CategorySearchResultsInterface $searchResult */
99-
$categories = $this->categorySearchResultsFactory->create();
100-
$categories->setSearchCriteria($searchCriteria);
101-
$categories->setItems($collection->getItems());
102-
$categories->setTotalCount($collection->getSize());
80+
// only fetch necessary category entity id
81+
$collection
82+
->getSelect()
83+
->reset(Select::COLUMNS)
84+
->columns(
85+
'e.entity_id'
86+
);
10387

104-
$categoryIds = [];
105-
foreach ($categories->getItems() as $category) {
106-
$categoryIds[] = (int)$category->getId();
107-
}
88+
$categoryIds = $collection->load()->getLoadedIds();
10889

10990
$totalPages = 0;
110-
if ($categories->getTotalCount() > 0 && $searchCriteria->getPageSize() > 0) {
111-
$totalPages = ceil($categories->getTotalCount() / $searchCriteria->getPageSize());
91+
if ($collection->getSize() > 0 && $searchCriteria->getPageSize() > 0) {
92+
$totalPages = ceil($collection->getSize() / $searchCriteria->getPageSize());
11293
}
113-
if ($searchCriteria->getCurrentPage() > $totalPages && $categories->getTotalCount() > 0) {
94+
if ($searchCriteria->getCurrentPage() > $totalPages && $collection->getSize() > 0) {
11495
throw new GraphQlInputException(
11596
__(
11697
'currentPage value %1 specified is greater than the %2 page(s) available.',
@@ -121,7 +102,7 @@ public function getResult(array $criteria, StoreInterface $store, array $attribu
121102

122103
return [
123104
'category_ids' => $categoryIds,
124-
'total_count' => $categories->getTotalCount(),
105+
'total_count' => $collection->getSize(),
125106
'page_info' => [
126107
'total_pages' => $totalPages,
127108
'page_size' => $searchCriteria->getPageSize(),

app/code/Magento/CatalogGraphQl/Model/Category/Hydrator.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,12 @@ public function hydrateCategory(Category $category, $basicFieldsOnly = false) :
6060
if ($basicFieldsOnly) {
6161
$categoryData = $category->getData();
6262
} else {
63-
$categoryData = $this->dataObjectProcessor->buildOutputDataArray($category, CategoryInterface::class);
63+
$categoryData = $this->dataObjectProcessor->buildOutputDataArray(
64+
$category,
65+
CategoryInterface::class
66+
);
6467
}
68+
6569
$categoryData['id'] = $category->getId();
6670
$categoryData['uid'] = $this->uidEncoder->encode((string) $category->getId());
6771
$categoryData['children'] = [];

app/code/Magento/CatalogGraphQl/etc/graphql/di.xml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,11 @@
191191
<type name="Magento\Catalog\Api\ProductRepositoryInterface">
192192
<plugin name="availableProductsFilter" type="Magento\CatalogGraphQl\Plugin\AvailableProductsFilter" />
193193
</type>
194+
<type name="Magento\CatalogGraphQl\Model\Category\Hydrator">
195+
<arguments>
196+
<argument name="dataObjectProcessor" xsi:type="object">Magento\CatalogGraphQl\Category\DataObjectProcessor</argument>
197+
</arguments>
198+
</type>
194199
<virtualType name="Magento\CatalogGraphQl\Model\Resolver\Products\DataProvider\ChildProduct"
195200
type="Magento\CatalogGraphQl\Model\Resolver\Products\DataProvider\Product">
196201
<arguments>
@@ -207,4 +212,16 @@
207212
</argument>
208213
</arguments>
209214
</virtualType>
215+
<virtualType
216+
name="Magento\CatalogGraphQl\Category\DataObjectProcessor"
217+
type="Magento\Framework\Reflection\DataObjectProcessor"
218+
>
219+
<arguments>
220+
<argument name="excludedMethodsClassMap" xsi:type="array">
221+
<item name="Magento\Catalog\Api\Data\CategoryInterface" xsi:type="array">
222+
<item name="getChildren" xsi:type="string">getChildren</item>
223+
</item>
224+
</argument>
225+
</arguments>
226+
</virtualType>
210227
</config>

0 commit comments

Comments
 (0)