From d7f6baa1f20492a43ef76d32cb32be8b5f4b903d Mon Sep 17 00:00:00 2001 From: Jeroen van Leusden Date: Thu, 8 Feb 2018 17:07:49 +0100 Subject: [PATCH 1/2] Correctly save Product Custom Option values --- .../Catalog/Model/Product/Option/Value.php | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/app/code/Magento/Catalog/Model/Product/Option/Value.php b/app/code/Magento/Catalog/Model/Product/Option/Value.php index d4c78772e7c0b..7b37c0b2a55df 100644 --- a/app/code/Magento/Catalog/Model/Product/Option/Value.php +++ b/app/code/Magento/Catalog/Model/Product/Option/Value.php @@ -190,27 +190,29 @@ public function getProduct() public function saveValues() { foreach ($this->getValues() as $value) { - $this->isDeleted(false); - $this->setData( + $optionValue = clone $this; + $optionValue->isDeleted(false); + + $optionValue->setData( $value )->setData( 'option_id', - $this->getOption()->getId() + $optionValue->getOption()->getId() )->setData( 'store_id', - $this->getOption()->getStoreId() + $optionValue->getOption()->getStoreId() ); - if ($this->getData('is_delete') == '1') { - if ($this->getId()) { - $this->deleteValues($this->getId()); - $this->delete(); + if ($optionValue->getData('is_delete') == '1') { + if ($optionValue->getId()) { + $optionValue->deleteValues($optionValue->getId()); + $optionValue->delete(); } } else { - $this->save(); + $optionValue->save(); } } - //eof foreach() + return $this; } From 0b3fd22abb39e1f3aa802204e4c17df4c268a090 Mon Sep 17 00:00:00 2001 From: Jeroen van Leusden Date: Thu, 17 May 2018 16:47:00 +0200 Subject: [PATCH 2/2] Correctly save Product Custom Option values --- .../Magento/Catalog/Model/Product/Option.php | 28 +++++++++++----- .../Catalog/Model/Product/Option/Value.php | 32 ++++++++----------- 2 files changed, 34 insertions(+), 26 deletions(-) diff --git a/app/code/Magento/Catalog/Model/Product/Option.php b/app/code/Magento/Catalog/Model/Product/Option.php index 6d29eedc9885d..4eccfd1337fcc 100644 --- a/app/code/Magento/Catalog/Model/Product/Option.php +++ b/app/code/Magento/Catalog/Model/Product/Option.php @@ -8,6 +8,7 @@ use Magento\Catalog\Api\Data\ProductCustomOptionInterface; use Magento\Catalog\Api\Data\ProductCustomOptionValuesInterface; +use Magento\Catalog\Api\Data\ProductCustomOptionValuesInterfaceFactory; use Magento\Catalog\Api\Data\ProductInterface; use Magento\Catalog\Model\Product; use Magento\Catalog\Model\ResourceModel\Product\Option\Value\Collection; @@ -102,6 +103,11 @@ class Option extends AbstractExtensibleModel implements ProductCustomOptionInter */ private $metadataPool; + /** + * @var ProductCustomOptionValuesInterfaceFactory + */ + private $customOptionValuesFactory; + /** * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry @@ -114,6 +120,7 @@ class Option extends AbstractExtensibleModel implements ProductCustomOptionInter * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection * @param array $data + * @param ProductCustomOptionValuesInterfaceFactory|null $customOptionValuesFactory * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ public function __construct( @@ -127,12 +134,16 @@ public function __construct( Option\Validator\Pool $validatorPool, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, - array $data = [] + array $data = [], + ProductCustomOptionValuesInterfaceFactory $customOptionValuesFactory = null ) { $this->productOptionValue = $productOptionValue; $this->optionTypeFactory = $optionFactory; $this->validatorPool = $validatorPool; $this->string = $string; + $this->customOptionValuesFactory = $customOptionValuesFactory ?: + \Magento\Framework\App\ObjectManager::getInstance()->get(ProductCustomOptionValuesInterfaceFactory::class); + parent::__construct( $context, $registry, @@ -391,20 +402,21 @@ public function beforeSave() */ public function afterSave() { - $this->getValueInstance()->unsetValues(); $values = $this->getValues() ?: $this->getData('values'); if (is_array($values)) { foreach ($values as $value) { - if ($value instanceof \Magento\Catalog\Api\Data\ProductCustomOptionValuesInterface) { + if ($value instanceof ProductCustomOptionValuesInterface) { $data = $value->getData(); } else { $data = $value; } - $this->getValueInstance()->addValue($data); - } - $this->getValueInstance()->setOption($this)->saveValues(); - } elseif ($this->getGroupByType($this->getType()) == self::OPTION_GROUP_SELECT) { + $this->customOptionValuesFactory->create() + ->addValue($data) + ->setOption($this) + ->saveValues(); + } + } elseif ($this->getGroupByType($this->getType()) === self::OPTION_GROUP_SELECT) { throw new LocalizedException(__('Select type options required values rows.')); } @@ -805,7 +817,7 @@ public function setImageSizeY($imageSizeY) } /** - * @param \Magento\Catalog\Api\Data\ProductCustomOptionValuesInterface[] $values + * @param ProductCustomOptionValuesInterface[] $values * @return $this */ public function setValues(array $values = null) diff --git a/app/code/Magento/Catalog/Model/Product/Option/Value.php b/app/code/Magento/Catalog/Model/Product/Option/Value.php index a1ee91b497094..e7c770d065824 100644 --- a/app/code/Magento/Catalog/Model/Product/Option/Value.php +++ b/app/code/Magento/Catalog/Model/Product/Option/Value.php @@ -78,6 +78,7 @@ class Value extends AbstractModel implements \Magento\Catalog\Api\Data\ProductCu * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection * @param array $data + * @param CustomOptionPriceCalculator|null $customOptionPriceCalculator */ public function __construct( \Magento\Framework\Model\Context $context, @@ -91,6 +92,7 @@ public function __construct( $this->_valueCollectionFactory = $valueCollectionFactory; $this->customOptionPriceCalculator = $customOptionPriceCalculator ?? \Magento\Framework\App\ObjectManager::getInstance()->get(CustomOptionPriceCalculator::class); + parent::__construct( $context, $registry, @@ -203,27 +205,21 @@ public function getProduct() */ public function saveValues() { + $option = $this->getOption(); + foreach ($this->getValues() as $value) { - $optionValue = clone $this; - $optionValue->isDeleted(false); - - $optionValue->setData( - $value - )->setData( - 'option_id', - $optionValue->getOption()->getId() - )->setData( - 'store_id', - $optionValue->getOption()->getStoreId() - ); - - if ($optionValue->getData('is_delete') == '1') { - if ($optionValue->getId()) { - $optionValue->deleteValues($optionValue->getId()); - $optionValue->delete(); + $this->isDeleted(false); + $this->setData($value) + ->setData('option_id', $option->getId()) + ->setData('store_id', $option->getStoreId()); + + if ((bool) $this->getData('is_delete') === true) { + if ($this->getId()) { + $this->deleteValues($this->getId()); + $this->delete(); } } else { - $optionValue->save(); + $this->save(); } }