Skip to content

Commit 6c841d9

Browse files
committed
PB-69: Manually add products into ProductList by name/SKU and sort them by the order they added into the list
1 parent a80fe04 commit 6c841d9

File tree

8 files changed

+90
-20
lines changed

8 files changed

+90
-20
lines changed

app/code/Magento/PageBuilder/Model/Catalog/Sorting/SimpleOption.php

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,14 @@ class SimpleOption implements OptionInterface
3737

3838
/**
3939
* @param string $label
40-
* @param string $sortDirection
41-
* @param string $attributeField
40+
* @param string|null $sortDirection
41+
* @param string|null $attributeField
4242
* @param string|null $secondarySortDirection
4343
*/
4444
public function __construct(
4545
string $label,
46-
string $sortDirection,
47-
string $attributeField,
46+
string $sortDirection = null,
47+
string $attributeField = null,
4848
string $secondarySortDirection = null
4949
) {
5050
$this->label = $label;
@@ -59,10 +59,11 @@ public function __construct(
5959
public function sort(
6060
\Magento\Catalog\Model\ResourceModel\Product\Collection $collection
6161
): \Magento\Catalog\Model\ResourceModel\Product\Collection {
62-
$collection->getSelect()->reset(Select::ORDER);
63-
$collection->addAttributeToSort($this->attributeField, $this->sortDirection);
64-
$collection->addAttributeToSort('entity_id', $this->secondarySortDirection);
65-
62+
if ($this->attributeField && $this->sortDirection) {
63+
$collection->getSelect()->reset(Select::ORDER);
64+
$collection->addAttributeToSort($this->attributeField, $this->sortDirection);
65+
$collection->addAttributeToSort('entity_id', $this->secondarySortDirection);
66+
}
6667
return $collection;
6768
}
6869

app/code/Magento/PageBuilder/Plugin/Catalog/Block/Product/ProductsListPlugin.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,8 @@ public function afterCreateCollection(
6060
\Magento\CatalogWidget\Block\Product\ProductsList $subject,
6161
\Magento\Catalog\Model\ResourceModel\Product\Collection $result
6262
) {
63-
$categoryId = $subject->getData('category_ids');
63+
$conditionOption = $subject->getData('condition_option');
64+
$categoryId = $conditionOption === 'category_ids' ? $subject->getData('condition_option_value') : null;
6465
$sortOption = $subject->getData('sort_order');
6566

6667
$this->stock->addIsInStockFilterToCollection($result);
@@ -93,6 +94,7 @@ public function afterCreateCollection(
9394
public function afterGetCacheKeyInfo(\Magento\CatalogWidget\Block\Product\ProductsList $subject, array $cacheKeys)
9495
{
9596
$cacheKeys[] = $subject->getData('sort_order');
97+
$cacheKeys[] = $subject->getData('condition_option');
9698
return $cacheKeys;
9799
}
98100

@@ -105,7 +107,8 @@ public function afterGetCacheKeyInfo(\Magento\CatalogWidget\Block\Product\Produc
105107
*/
106108
public function afterGetIdentities(\Magento\CatalogWidget\Block\Product\ProductsList $subject, array $result)
107109
{
108-
$categoryId = $subject->getData('category_ids');
110+
$conditionOption = $subject->getData('condition_option');
111+
$categoryId = $conditionOption === 'category_ids' ? $subject->getData('condition_option_value') : null;
109112
$sortOption = $subject->getData('sort_order');
110113

111114
if (!empty($categoryId) && $sortOption === 'position') {

app/code/Magento/PageBuilder/etc/di.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,10 +222,16 @@
222222
<argument name="attributeField" xsi:type="string">position</argument>
223223
</arguments>
224224
</virtualType>
225+
<virtualType name="Magento\PageBuilder\Model\Catalog\Sorting\PositionBySku" type="Magento\PageBuilder\Model\Catalog\Sorting\SimpleOption">
226+
<arguments>
227+
<argument name="label" xsi:type="string">Position</argument>
228+
</arguments>
229+
</virtualType>
225230
<type name="Magento\PageBuilder\Model\Catalog\Sorting">
226231
<arguments>
227232
<argument name="sortClasses" xsi:type="array">
228233
<item name="position" xsi:type="string">Magento\PageBuilder\Model\Catalog\Sorting\Position</item>
234+
<item name="position_by_sku" xsi:type="string">Magento\PageBuilder\Model\Catalog\Sorting\PositionBySku</item>
229235
<item name="date_newest_top" xsi:type="string">Magento\PageBuilder\Model\Catalog\Sorting\Date\NewestTop</item>
230236
<item name="date_oldest_top" xsi:type="string">Magento\PageBuilder\Model\Catalog\Sorting\Date\OldestTop</item>
231237
<item name="name_ascending" xsi:type="string">Magento\PageBuilder\Model\Catalog\Sorting\Name\Ascending</item>

app/code/Magento/PageBuilder/view/adminhtml/ui_component/pagebuilder_products_form.xml

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@
8383
<exports>
8484
<link name="category_idsVisible">${$.parentName}.category_ids:visible</link>
8585
<link name="conditionVisible">${$.parentName}.conditions_form:visible</link>
86+
<link name="skuVisible">${$.parentName}.sku:visible</link>
8687
<link name="value">${$.parentName}.sort_order:filter</link>
8788
</exports>
8889
<dataScope>condition_option</dataScope>
@@ -97,6 +98,11 @@
9798
<item name="title" xsi:type="string" translate="true">Category</item>
9899
</option>
99100
<option name="1" xsi:type="array">
101+
<item name="size" xsi:type="string">small</item>
102+
<item name="value" xsi:type="string">sku</item>
103+
<item name="title" xsi:type="string" translate="true">SKU</item>
104+
</option>
105+
<option name="2" xsi:type="array">
100106
<item name="size" xsi:type="string">small</item>
101107
<item name="value" xsi:type="string">condition</item>
102108
<item name="title" xsi:type="string" translate="true">Condition</item>
@@ -134,6 +140,22 @@
134140
</select>
135141
</formElements>
136142
</field>
143+
<field name="sku" sortOrder="5" formElement="input">
144+
<argument name="data" xsi:type="array">
145+
<item name="config" xsi:type="array">
146+
<item name="condition_operator" xsi:type="string">()</item>
147+
</item>
148+
</argument>
149+
<settings>
150+
<dataType>text</dataType>
151+
<label translate="true">Product SKUs</label>
152+
<dataScope>sku</dataScope>
153+
<visible>false</visible>
154+
<exports>
155+
<link name="condition_operator">${ $.provider }:data.sku-condition_operator</link>
156+
</exports>
157+
</settings>
158+
</field>
137159
<htmlContent name="conditions_form" sortOrder="5" template="Magento_PageBuilder/form/element/widget-conditions">
138160
<settings>
139161
<visible>false</visible>
@@ -154,7 +176,9 @@
154176
<item name="config" xsi:type="array">
155177
<item name="default" xsi:type="string">position</item>
156178
<item name="excludeOptions" xsi:type="array">
157-
<item name="condition" xsi:type="string">position</item>
179+
<item name="condition" xsi:type="string">position,position_by_sku</item>
180+
<item name="sku" xsi:type="string">position</item>
181+
<item name="category_ids" xsi:type="string">position_by_sku</item>
158182
</item>
159183
</item>
160184
</argument>

app/code/Magento/PageBuilder/view/adminhtml/web/js/content-type/products/mass-converter/widget-directive.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/code/Magento/PageBuilder/view/adminhtml/web/js/form/provider/conditions-data-processor.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,10 @@ define([
3434
* Add pairs in case conditions source is not rules configurator
3535
*/
3636
if (data.condition_option !== 'condition') {
37-
pairs['parameters[' + attribute + '][1--1][operator]'] = "==";
37+
var conditionOperator = data[data.condition_option + '-condition_operator']
38+
? data[data.condition_option + '-condition_operator']
39+
: "==";
40+
pairs['parameters[' + attribute + '][1--1][operator]'] = conditionOperator;
3841
pairs['parameters[' + attribute + '][1--1][type]'] = "Magento\\CatalogWidget\\Model\\Rule\\Condition\\Product";
3942
pairs['parameters[' + attribute + '][1][aggregator]'] = "all";
4043
pairs['parameters[' + attribute + '][1][new_child]'] = "";

app/code/Magento/PageBuilder/view/adminhtml/web/ts/js/content-type/products/mass-converter/widget-directive.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,13 @@ export default class WidgetDirective extends BaseWidgetDirective {
2424
products_count: number;
2525
sort_order: string;
2626
condition_option: string;
27-
category_ids: string|any[];
27+
condition_option_value: string;
2828
};
2929

3030
data.products_count = attributes.products_count;
3131
data.sort_order = attributes.sort_order;
3232
data.condition_option = attributes.condition_option;
33-
data.category_ids = attributes.condition_option === "category_ids" ? attributes.category_ids : [];
33+
data[data.condition_option] = attributes.condition_option_value;
3434
data.conditions_encoded = this.decodeWysiwygCharacters(attributes.conditions_encoded || "");
3535
data[data.condition_option + "_source"] = data.conditions_encoded;
3636
return data;
@@ -53,7 +53,7 @@ export default class WidgetDirective extends BaseWidgetDirective {
5353
products_count: data.products_count,
5454
sort_order: data.sort_order,
5555
condition_option: data.condition_option,
56-
category_ids: data.condition_option === "category_ids" ? data.category_ids : [],
56+
condition_option_value: data[data.condition_option],
5757
type_name: "Catalog Products List",
5858
conditions_encoded: this.encodeWysiwygCharacters(data.conditions_encoded || ""),
5959
};

dev/tests/integration/testsuite/Magento/PageBuilder/Model/Catalog/SortingTest.php

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
use Magento\TestFramework\Helper\Bootstrap;
1010
use Magento\Catalog\Api\CategoryRepositoryInterface;
11+
use Magento\CatalogWidget\Block\Product\ProductsList;
1112

1213
/**
1314
* Class SortingTest
@@ -39,6 +40,11 @@ class SortingTest extends \PHPUnit\Framework\TestCase
3940
*/
4041
private $categoryId = 333;
4142

43+
/**
44+
* @var ProductsList
45+
*/
46+
private $productList;
47+
4248
/**
4349
* Set up instances and mock objects
4450
*/
@@ -52,6 +58,8 @@ protected function setUp()
5258
$this->categoryRepository = $objectManager->create(
5359
CategoryRepositoryInterface::class
5460
);
61+
62+
$this->productList = $objectManager->create(ProductsList::class);
5563
}
5664

5765
/**
@@ -62,9 +70,28 @@ protected function setUp()
6270
public function testSortOptions(array $productSortData)
6371
{
6472
foreach ($productSortData as $rule => $expectedOrder) {
65-
$collection = $this->productCollectionFactory->create();
66-
$collection->addAttributeToSelect('*');
67-
$collection->addCategoriesFilter(['in' => [$this->categoryId]]);
73+
74+
$this->productList->setData(
75+
[
76+
'store_id' => 1,
77+
'conditions_encoded' => '^[
78+
`1`:^[
79+
`aggregator`:`all`,
80+
`new_child`:``,
81+
`type`:`Magento||CatalogWidget||Model||Rule||Condition||Combine`,
82+
`value`:`1`
83+
^],
84+
`1--1`:^[
85+
`operator`:`()`,
86+
`type`:`Magento||CatalogWidget||Model||Rule||Condition||Product`,
87+
`attribute`:`sku`,
88+
`value`:`B_PB_PRODUCT,a_pb_product,C_PB_PRODUCT,1_PB_PRODUCT`
89+
^]
90+
^]'
91+
]
92+
);
93+
94+
$collection = $this->productList->createCollection();
6895

6996
if ($rule === 'position') {
7097
$collection->addCategoryFilter($this->categoryRepository->get($this->categoryId));
@@ -160,6 +187,12 @@ public function productSortDataProvider() : array
160187
'a_pb_product',
161188
'1_PB_PRODUCT',
162189
'C_PB_PRODUCT'
190+
],
191+
'position_by_sku' => [
192+
'B_PB_PRODUCT',
193+
'a_pb_product',
194+
'C_PB_PRODUCT',
195+
'1_PB_PRODUCT'
163196
]
164197
],
165198
]

0 commit comments

Comments
 (0)