From baf700d9e2148ac97220acc8842703a709593801 Mon Sep 17 00:00:00 2001 From: "Galla, Daniel" Date: Fri, 25 Jan 2019 14:21:59 +0100 Subject: [PATCH 1/4] Add more default units - #22 #38 --- Setup/UpgradeData.php | 191 ++++++++++++++++++++++++++++++++++++++++++ etc/module.xml | 2 +- 2 files changed, 192 insertions(+), 1 deletion(-) create mode 100644 Setup/UpgradeData.php diff --git a/Setup/UpgradeData.php b/Setup/UpgradeData.php new file mode 100644 index 0000000..7aa4b68 --- /dev/null +++ b/Setup/UpgradeData.php @@ -0,0 +1,191 @@ +eavSetupFactory = $eavSetupFactory; + $this->productAttributeOptionManagementInterface = $productAttributeOptionManagementInterface; + $this->configResource = $configResource; + $this->serializer = $serializer; + $this->scopeConfig = $scopeConfig; + } + + /** + * Upgrades data for a module + * + * @param ModuleDataSetupInterface $setup + * @param ModuleContextInterface $context + * + * @throws \Magento\Framework\Exception\InputException + * @throws \Magento\Framework\Exception\StateException + */ + public function upgrade(ModuleDataSetupInterface $setup, ModuleContextInterface $context) + { + $setup->startSetup(); + $eavSetup = $this->eavSetupFactory->create(['setup' => $setup]); + if (version_compare($context->getVersion(), '1.1.0', '<')) { + $options = ['km', 'qm', 'cbm', 'pc']; + + // holds the conversion rates + $dataTemplate = [ + 'km' => [ + [ + 'reference_unit' => 'm', + 'conversion_rate' => '0.001', + ], + [ + 'reference_unit' => 'cm', + 'conversion_rate' => '0.00001', + ], + [ + 'reference_unit' => 'mm', + 'conversion_rate' => '0.000001', + ], + ], + 'm' => [ + [ + 'reference_unit' => 'km', + 'conversion_rate' => '1000', + ], + ], + 'cm' => [ + [ + 'reference_unit' => 'km', + 'conversion_rate' => '100000', + ], + ], + 'mm' => [ + [ + 'reference_unit' => 'km', + 'conversion_rate' => '1000000', + ], + ], + + ]; + + $this->addOption($eavSetup, $options); + $this->addToSystemConfiguration($dataTemplate); + } + $setup->endSetup(); + } + + /** + * @param $eavSetup + * @param array $options + */ + protected function addOption($eavSetup, array $options) + { + foreach (self::UNIT_ATTRIBUTE_CODES as $attributeCode) { + $attributeId = $eavSetup->getAttribute(Product::ENTITY, $attributeCode, 'attribute_id'); + + $eavSetup->addAttributeOption([ + 'attribute_id' => $attributeId, + 'values' => $options, + ]); + } + } + + /** + * Sets conversations for added default units + * + * @param array $dataTemplate + * + * @throws \Magento\Framework\Exception\InputException + * @throws \Magento\Framework\Exception\StateException + */ + protected function addToSystemConfiguration(array $dataTemplate) + { + // get all attribute options for product unit + $productUnitOptions = []; + foreach ($this->productAttributeOptionManagementInterface->getItems('baseprice_product_unit') as $option) { + $productUnitOptions[$option->getLabel()] = $option->getValue(); + } + + // get all attribute options for reference unit + $referenceUnitOptions = []; + foreach ($this->productAttributeOptionManagementInterface->getItems('baseprice_reference_unit') as $option) { + $referenceUnitOptions[$option->getLabel()] = $option->getValue(); + } + + // iterate over attribute options in order to replace labels with option ids + $data = $this->serializer->unserialize($this->scopeConfig->getValue(Data::CONVERSION_CONFIG_PATH)); + foreach ($dataTemplate as $unit => $unitData) { + foreach ($unitData as $key => $unitDataEntry) { + $data[] = [ + 'product_unit' => $productUnitOptions[$unit], + 'reference_unit' => $referenceUnitOptions[$unitDataEntry['reference_unit']], + 'conversion_rate' => $unitDataEntry['conversion_rate'], + ]; + } + } + + //save system configuration + $this->configResource->saveConfig( + Data::CONVERSION_CONFIG_PATH, + $this->serializer->serialize($data), + ScopeConfigInterface::SCOPE_TYPE_DEFAULT, + 0 + ); + } +} \ No newline at end of file diff --git a/etc/module.xml b/etc/module.xml index a7b8ecd..b1250b5 100644 --- a/etc/module.xml +++ b/etc/module.xml @@ -18,7 +18,7 @@ */ --> - + From 12d1baa255cf1de640c1486d52dfa54b9173d37d Mon Sep 17 00:00:00 2001 From: "Galla, Daniel" Date: Fri, 25 Jan 2019 14:22:46 +0100 Subject: [PATCH 2/4] Add option to translate reference unit --- Helper/Data.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Helper/Data.php b/Helper/Data.php index 238d3de..c7bd67c 100644 --- a/Helper/Data.php +++ b/Helper/Data.php @@ -122,7 +122,7 @@ public function getBasePriceText(Product $product) */ public function getReferenceUnit(Product $product) { - return $product->getAttributeText('baseprice_reference_unit'); + return __($product->getAttributeText('baseprice_reference_unit')); } /** From 19ea706615fb530b09edd50ab163bd5c6f4a00c3 Mon Sep 17 00:00:00 2001 From: "Galla, Daniel" Date: Fri, 25 Jan 2019 18:07:20 +0100 Subject: [PATCH 3/4] Fix: no config data is found when first installing module --- Setup/UpgradeData.php | 97 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 95 insertions(+), 2 deletions(-) diff --git a/Setup/UpgradeData.php b/Setup/UpgradeData.php index 7aa4b68..d93577e 100644 --- a/Setup/UpgradeData.php +++ b/Setup/UpgradeData.php @@ -32,6 +32,86 @@ class UpgradeData implements UpgradeDataInterface { const UNIT_ATTRIBUTE_CODES = ['baseprice_product_unit', 'baseprice_reference_unit']; + /** + * Conversion rates from InstallData. + * Used to add all conversion rates when first installing the module. + * @see \Magenerds\BasePrice\Setup\InstallData::setSystemConfiguration() + */ + const DEFAULT_DATA_TEMPLATE = [ + 'kg' => [ + [ + 'reference_unit' => 'g', + 'conversion_rate' => '0.001' + ], + [ + 'reference_unit' => 'mg', + 'conversion_rate' => '0.000001' + ] + ], + 'g' => [ + [ + 'reference_unit' => 'kg', + 'conversion_rate' => '1000' + ], + [ + 'reference_unit' => 'mg', + 'conversion_rate' => '0.001' + ] + ], + 'mg' => [ + [ + 'reference_unit' => 'kg', + 'conversion_rate' => '1000000' + ], + [ + 'reference_unit' => 'g', + 'conversion_rate' => '1000' + ] + ], + 'l' => [ + [ + 'reference_unit' => 'ml', + 'conversion_rate' => '0.001' + ] + ], + 'ml' => [ + [ + 'reference_unit' => 'l', + 'conversion_rate' => '1000' + ] + ], + 'm' => [ + [ + 'reference_unit' => 'cm', + 'conversion_rate' => '0.01' + ], + [ + 'reference_unit' => 'mm', + 'conversion_rate' => '0.001' + ] + ], + 'cm' => [ + [ + 'reference_unit' => 'm', + 'conversion_rate' => '100' + ], + [ + 'reference_unit' => 'mm', + 'conversion_rate' => '0.001' + ] + ], + 'mm' => [ + [ + 'reference_unit' => 'm', + 'conversion_rate' => '1000' + ], + [ + 'reference_unit' => 'cm', + 'conversion_rate' => '10' + ] + ], + ]; + /** * @var EavSetupFactory */ @@ -62,13 +142,17 @@ public function __construct( ProductAttributeOptionManagementInterface $productAttributeOptionManagementInterface, ResourceConfig $configResource, SerializerInterface $serializer, - ScopeConfigInterface $scopeConfig + ScopeConfigInterface $scopeConfig, + EavConfig $eavConfig, + AttributeRepositoryInterface $attributeRepository ) { $this->eavSetupFactory = $eavSetupFactory; $this->productAttributeOptionManagementInterface = $productAttributeOptionManagementInterface; $this->configResource = $configResource; $this->serializer = $serializer; $this->scopeConfig = $scopeConfig; + $this->eavConfig = $eavConfig; + $this->attributeRepository = $attributeRepository; } /** @@ -78,6 +162,7 @@ public function __construct( * @param ModuleContextInterface $context * * @throws \Magento\Framework\Exception\InputException + * @throws \Magento\Framework\Exception\NoSuchEntityException * @throws \Magento\Framework\Exception\StateException */ public function upgrade(ModuleDataSetupInterface $setup, ModuleContextInterface $context) @@ -125,6 +210,7 @@ public function upgrade(ModuleDataSetupInterface $setup, ModuleContextInterface ]; $this->addOption($eavSetup, $options); + $this->eavConfig->clear(); $this->addToSystemConfiguration($dataTemplate); } $setup->endSetup(); @@ -168,8 +254,15 @@ protected function addToSystemConfiguration(array $dataTemplate) $referenceUnitOptions[$option->getLabel()] = $option->getValue(); } + //Config value is not available during first installation -> maybe config cache + if (is_null($this->scopeConfig->getValue(Data::CONVERSION_CONFIG_PATH))) { + $data = []; + $dataTemplate = array_merge_recursive(self::DEFAULT_DATA_TEMPLATE, $dataTemplate); + } else { + $data = $this->serializer->unserialize($this->scopeConfig->getValue(Data::CONVERSION_CONFIG_PATH)); + } + // iterate over attribute options in order to replace labels with option ids - $data = $this->serializer->unserialize($this->scopeConfig->getValue(Data::CONVERSION_CONFIG_PATH)); foreach ($dataTemplate as $unit => $unitData) { foreach ($unitData as $key => $unitDataEntry) { $data[] = [ From 3fd0c8b5a5f6fe9e344863587bb0aa84ecaa2c65 Mon Sep 17 00:00:00 2001 From: "Galla, Daniel" Date: Fri, 25 Jan 2019 18:08:11 +0100 Subject: [PATCH 4/4] Sort options after adding new --- Setup/UpgradeData.php | 48 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/Setup/UpgradeData.php b/Setup/UpgradeData.php index d93577e..9fb6883 100644 --- a/Setup/UpgradeData.php +++ b/Setup/UpgradeData.php @@ -18,6 +18,8 @@ use Magenerds\BasePrice\Helper\Data; +use Magento\Eav\Api\AttributeRepositoryInterface; +use Magento\Eav\Model\Config as EavConfig; use Magento\Framework\App\Config\ScopeConfigInterface; use Magento\Catalog\Api\ProductAttributeOptionManagementInterface; use Magento\Catalog\Model\Product; @@ -32,6 +34,8 @@ class UpgradeData implements UpgradeDataInterface { const UNIT_ATTRIBUTE_CODES = ['baseprice_product_unit', 'baseprice_reference_unit']; + const OPTIONS_SORT_ORDER = ['kg', 'g', 'mg', 'l', 'ml', 'km', 'm', 'cm', 'mm', 'qm', 'cbm', 'pc']; + /** * Conversion rates from InstallData. * Used to add all conversion rates when first installing the module. @@ -137,6 +141,17 @@ class UpgradeData implements UpgradeDataInterface */ private $scopeConfig; + /** + * @var EavConfig + */ + private $eavConfig; + + /** + * @var AttributeRepositoryInterface + */ + private $attributeRepository; + + public function __construct( EavSetupFactory $eavSetupFactory, ProductAttributeOptionManagementInterface $productAttributeOptionManagementInterface, @@ -212,6 +227,7 @@ public function upgrade(ModuleDataSetupInterface $setup, ModuleContextInterface $this->addOption($eavSetup, $options); $this->eavConfig->clear(); $this->addToSystemConfiguration($dataTemplate); + $this->sortOptions($setup); } $setup->endSetup(); } @@ -281,4 +297,36 @@ protected function addToSystemConfiguration(array $dataTemplate) 0 ); } + + /** + * Sort options of the attribute(s) based on self::OPTIONS_SORT_ORDER + * + * @param ModuleDataSetupInterface $setup + * @param array $attributes + * + * @throws \Magento\Framework\Exception\NoSuchEntityException + */ + public function sortOptions(ModuleDataSetupInterface $setup, array $attributes = []) + { + if (empty($attributes)) { + $attributes = self::UNIT_ATTRIBUTE_CODES; + } + + //iterate through given attribute_codes + foreach ($attributes as $attributeCode) { + $attribute = $this->attributeRepository->get(Product::ENTITY, $attributeCode); + + //iterate through options + foreach ($attribute->getOptions() as $option) { + //get sort order based on options label + $sortOrder = array_search($option->getLabel(), self::OPTIONS_SORT_ORDER); + $table = $setup->getTable('eav_attribute_option'); + $optionId = $attribute->getSource()->getOptionId($option->getValue()); + + if ($optionId != '' && ! is_null($optionId)) { + $setup->getConnection()->update($table, ['sort_order' => $sortOrder], 'option_id=' . $optionId); + } + } + } + } } \ No newline at end of file