From 8d6234124c08699e1891c121266be61946306a9f Mon Sep 17 00:00:00 2001 From: nmalevanec <mikola.malevanec@transoftgroup.com> Date: Tue, 19 Dec 2017 16:13:22 +0200 Subject: [PATCH] magento/magento2#11897: Catalog product list widget not working with multiple sku --- .../Condition/Product/AbstractProduct.php | 36 ++++++++++++++++++- .../Block/Product/ProductListTest.php | 28 +++++++++++++-- 2 files changed, 61 insertions(+), 3 deletions(-) diff --git a/app/code/Magento/Rule/Model/Condition/Product/AbstractProduct.php b/app/code/Magento/Rule/Model/Condition/Product/AbstractProduct.php index 9a6f1b48620..10da7c7a65e 100644 --- a/app/code/Magento/Rule/Model/Condition/Product/AbstractProduct.php +++ b/app/code/Magento/Rule/Model/Condition/Product/AbstractProduct.php @@ -137,6 +137,7 @@ abstract class AbstractProduct extends \Magento\Rule\Model\Condition\AbstractCon */ $this->_defaultOperatorInputByType['category'] = ['==', '!=', '{}', '!{}', '()', '!()']; $this->_arrayInputTypes[] = 'category'; + $this->_defaultOperatorInputByType['sku'] = ['==', '!=', '{}', '!{}', '()', '!()']; } return $this->_defaultOperatorInputByType; } @@ -382,6 +383,9 @@ abstract class AbstractProduct extends \Magento\Rule\Model\Condition\AbstractCon if ($this->getAttributeObject()->getAttributeCode() == 'category_ids') { return 'category'; } + if ($this->getAttributeObject()->getAttributeCode() == 'sku') { + return 'sku'; + } switch ($this->getAttributeObject()->getFrontendInput()) { case 'select': return 'select'; @@ -606,7 +610,10 @@ abstract class AbstractProduct extends \Magento\Rule\Model\Condition\AbstractCon $this->getValueParsed() )->__toString() ); + } elseif ($this->getAttribute() === 'sku') { + $this->isMultipleSku(); } + return parent::getBindArgumentValue(); } @@ -704,7 +711,7 @@ abstract class AbstractProduct extends \Magento\Rule\Model\Condition\AbstractCon public function getOperatorForValidate() { $operator = $this->getOperator(); - if ($this->getInputType() == 'category') { + if ($this->getInputType() == 'category' || $this->isMultipleSku()) { if ($operator == '==') { $operator = '{}'; } elseif ($operator == '!=') { @@ -753,4 +760,31 @@ abstract class AbstractProduct extends \Magento\Rule\Model\Condition\AbstractCon return $selectOptions; } + + /** + * Check condition contains multiple sku. + * + * @return bool + */ + private function isMultipleSku() + { + $result = false; + if ($this->getInputType() === 'sku') { + if ($this->hasValueParsed()) { + $value = $this->getData('value_parsed'); + if (count($value > 1)) { + $result = true; + } + } else { + $value = $this->getData('value'); + $value = preg_split('#\s*[,;]\s*#', $value, null, PREG_SPLIT_NO_EMPTY); + if (count($value > 1)) { + $this->setValueParsed($value); + $result = true; + } + } + } + + return $result; + } } diff --git a/dev/tests/integration/testsuite/Magento/CatalogWidget/Block/Product/ProductListTest.php b/dev/tests/integration/testsuite/Magento/CatalogWidget/Block/Product/ProductListTest.php index 6892f7b3a8a..3b270bb42c5 100644 --- a/dev/tests/integration/testsuite/Magento/CatalogWidget/Block/Product/ProductListTest.php +++ b/dev/tests/integration/testsuite/Magento/CatalogWidget/Block/Product/ProductListTest.php @@ -67,12 +67,36 @@ class ProductListTest extends \PHPUnit\Framework\TestCase . '`attribute`:`multiselect_attribute`,`operator`:`^[^]`,' . '`value`:[`' . implode(',', $multiselectAttributeOptionIds) . '`]^]^]'; $this->block->setData('conditions_encoded', $encodedConditions); + $this->performAssertions(1); + } + + /** + * Test product list widget can process condition with multiple product sku. + * + * @magentoDataFixture Magento/Catalog/_files/multiple_products.php + */ + public function testCreateCollectionWithMultipleSkuCondition() + { + $encodedConditions = '^[`1`:^[`type`:`Magento||CatalogWidget||Model||Rule||Condition||Combine`,' . + '`aggregator`:`all`,`value`:`1`,`new_child`:``^],`1--1`:^[`type`:`Magento||CatalogWidget||Model||Rule|' . + '|Condition||Product`,`attribute`:`sku`,`operator`:`==`,`value`:`simple1, simple2`^]^]'; + $this->block->setData('conditions_encoded', $encodedConditions); + $this->performAssertions(2); + } - // Load products collection filtered using specified conditions and perform assesrions + /** + * Check product collection includes correct amount of products. + * + * @param int $count + * @return void + */ + private function performAssertions(int $count) + { + // Load products collection filtered using specified conditions and perform assertions. $productCollection = $this->block->createCollection(); $productCollection->load(); $this->assertEquals( - 1, + $count, $productCollection->count(), "Product collection was not filtered according to the widget condition." ); -- GitLab