From af92b57e0deaaffae8128152f1fd7e42cd65579c Mon Sep 17 00:00:00 2001 From: Stanislav Lopukhov Date: Thu, 16 Jul 2015 15:31:54 +0300 Subject: [PATCH 1/3] MAGETWO-39708: Catalog Price Rule has to be applied even if description only was changed --- .../Adminhtml/Promo/Catalog/Save.php | 9 +++- app/code/Magento/CatalogRule/Model/Rule.php | 46 +++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Save.php b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Save.php index 46a8744cf4ce5..35ae184391c1f 100644 --- a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Save.php +++ b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Save.php @@ -18,6 +18,7 @@ public function execute() { if ($this->getRequest()->getPostValue()) { try { + /** @var \Magento\CatalogRule\Model\Rule $model */ $model = $this->_objectManager->create('Magento\CatalogRule\Model\Rule'); $this->_eventManager->dispatch( 'adminhtml_controller_catalogrule_prepare_save', @@ -63,7 +64,13 @@ public function execute() $this->getRequest()->setParam('rule_id', $model->getId()); $this->_forward('applyRules'); } else { - $this->_objectManager->create('Magento\CatalogRule\Model\Flag')->loadSelf()->setState(1)->save(); + if ($model->isBehaviorChanged()) { + $this->_objectManager + ->create('Magento\CatalogRule\Model\Flag') + ->loadSelf() + ->setState(1) + ->save(); + } if ($this->getRequest()->getParam('back')) { $this->_redirect('catalog_rule/*/edit', ['id' => $model->getId()]); return; diff --git a/app/code/Magento/CatalogRule/Model/Rule.php b/app/code/Magento/CatalogRule/Model/Rule.php index 1bdab229ba82a..b4bb5f4c1ff75 100644 --- a/app/code/Magento/CatalogRule/Model/Rule.php +++ b/app/code/Magento/CatalogRule/Model/Rule.php @@ -485,4 +485,50 @@ public function afterDelete() $this->_ruleProductProcessor->getIndexer()->invalidate(); return parent::afterDelete(); } + + /** + * Check behavior changed + * + * @return bool + */ + public function isBehaviorChanged() + { + if (!$this->isObjectNew()) { + $arrayDiff = $this->dataDiff($this->getOrigData(), $this->getStoredData()); + unset($arrayDiff['name']); + unset($arrayDiff['description']); + if (empty($arrayDiff)) { + return false; + } + } + return true; + } + + /** + * Get array with data differences + * @param array $array1 + * @param array $array2 + * + * @return array + */ + protected function dataDiff($array1, $array2) + { + $result = []; + foreach ($array1 as $key => $value) { + if (array_key_exists($key, $array2)) { + if (is_array($value)) { + if ($value != $array2[$key]) { + $result[$key] = true; + } + } else { + if ($value != $array2[$key]) { + $result[$key] = true; + } + } + } else { + $result[$key] = true; + } + } + return $result; + } } From d6a7f26c0721f938126c8488a70e8151e28a7805 Mon Sep 17 00:00:00 2001 From: Stanislav Lopukhov Date: Thu, 16 Jul 2015 15:57:57 +0300 Subject: [PATCH 2/3] MAGETWO-39708: Catalog Price Rule has to be applied even if description only was changed --- .../CatalogRule/Controller/Adminhtml/Promo/Catalog/Save.php | 2 +- app/code/Magento/CatalogRule/Model/Rule.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Save.php b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Save.php index 35ae184391c1f..d03e7ac48afea 100644 --- a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Save.php +++ b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Save.php @@ -64,7 +64,7 @@ public function execute() $this->getRequest()->setParam('rule_id', $model->getId()); $this->_forward('applyRules'); } else { - if ($model->isBehaviorChanged()) { + if ($model->isRuleBehaviorChanged()) { $this->_objectManager ->create('Magento\CatalogRule\Model\Flag') ->loadSelf() diff --git a/app/code/Magento/CatalogRule/Model/Rule.php b/app/code/Magento/CatalogRule/Model/Rule.php index b4bb5f4c1ff75..859dbb110dec4 100644 --- a/app/code/Magento/CatalogRule/Model/Rule.php +++ b/app/code/Magento/CatalogRule/Model/Rule.php @@ -487,11 +487,11 @@ public function afterDelete() } /** - * Check behavior changed + * Check if rule behavior changed * * @return bool */ - public function isBehaviorChanged() + public function isRuleBehaviorChanged() { if (!$this->isObjectNew()) { $arrayDiff = $this->dataDiff($this->getOrigData(), $this->getStoredData()); From 57bed0c02c40e822352fbf42ec6a8d924c73b736 Mon Sep 17 00:00:00 2001 From: Stanislav Lopukhov Date: Thu, 16 Jul 2015 16:31:52 +0300 Subject: [PATCH 3/3] MAGETWO-39708: Catalog Price Rule has to be applied even if description only was changed --- .../CatalogRule/Test/Unit/Model/RuleTest.php | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/app/code/Magento/CatalogRule/Test/Unit/Model/RuleTest.php b/app/code/Magento/CatalogRule/Test/Unit/Model/RuleTest.php index 1d41561cc8cbf..285429e8af872 100644 --- a/app/code/Magento/CatalogRule/Test/Unit/Model/RuleTest.php +++ b/app/code/Magento/CatalogRule/Test/Unit/Model/RuleTest.php @@ -226,4 +226,51 @@ public function testAfterUpdate() $this->_ruleProductProcessor->expects($this->once())->method('getIndexer')->will($this->returnValue($indexer)); $this->rule->afterSave(); } + + /** + * Test IsRuleBehaviorChanged action + * + * @dataProvider ruleData + * @param array $dataArray + * @param array $originDataArray + * @param bool $isObjectNew + * @param bool $result + * + * @return void + */ + public function testIsRuleBehaviorChanged($dataArray, $originDataArray, $isObjectNew, $result) + { + $this->rule->setData('website_ids', []); + $this->rule->isObjectNew($isObjectNew); + $indexer = $this->getMock('\Magento\Indexer\Model\IndexerInterface'); + $indexer->expects($this->any())->method('invalidate'); + $this->_ruleProductProcessor->expects($this->any())->method('getIndexer')->will($this->returnValue($indexer)); + + foreach ($dataArray as $data) { + $this->rule->setData($data); + } + $this->rule->afterSave(); + + foreach ($originDataArray as $data) { + $this->rule->setOrigData($data); + } + $this->assertEquals($result, $this->rule->isRuleBehaviorChanged()); + } + + /** + * Data provider for isRuleBehaviorChanged test + * + * @return array + */ + public function ruleData() + { + return [ + [['new name', 'new description'], ['name', 'description'], false, false], + [['name', 'description'], ['name', 'description'], false, false], + [['name', 'important_data'], ['name', 'important_data'], false, false], + [['name', 'new important_data'], ['name', 'important_data'], false, true], + [['name', 'description'], ['name', 'description'], true, true], + [['name', 'description'], ['name', 'important_data'], true, true], + ]; + } }