Skip to content

Commit 1b96ea1

Browse files
ENGCOM-6119: Replaced hardcoded custom option types and groups with injected array… #25055
2 parents cc599e5 + 8bf91b3 commit 1b96ea1

File tree

2 files changed

+66
-21
lines changed

2 files changed

+66
-21
lines changed

app/code/Magento/Catalog/Model/Product/Option.php

Lines changed: 44 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@
1111
use Magento\Catalog\Api\Data\ProductCustomOptionValuesInterfaceFactory;
1212
use Magento\Catalog\Api\Data\ProductInterface;
1313
use Magento\Catalog\Model\Product;
14+
use Magento\Catalog\Model\Product\Option\Type\Date;
15+
use Magento\Catalog\Model\Product\Option\Type\DefaultType;
16+
use Magento\Catalog\Model\Product\Option\Type\File;
17+
use Magento\Catalog\Model\Product\Option\Type\Select;
18+
use Magento\Catalog\Model\Product\Option\Type\Text;
1419
use Magento\Catalog\Model\ResourceModel\Product\Option\Value\Collection;
1520
use Magento\Catalog\Pricing\Price\BasePrice;
1621
use Magento\Framework\EntityManager\MetadataPool;
@@ -98,6 +103,16 @@ class Option extends AbstractExtensibleModel implements ProductCustomOptionInter
98103
*/
99104
protected $validatorPool;
100105

106+
/**
107+
* @var string[]
108+
*/
109+
private $optionGroups;
110+
111+
/**
112+
* @var string[]
113+
*/
114+
private $optionTypesToGroups;
115+
101116
/**
102117
* @var MetadataPool
103118
*/
@@ -121,6 +136,8 @@ class Option extends AbstractExtensibleModel implements ProductCustomOptionInter
121136
* @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection
122137
* @param array $data
123138
* @param ProductCustomOptionValuesInterfaceFactory|null $customOptionValuesFactory
139+
* @param array $optionGroups
140+
* @param array $optionTypesToGroups
124141
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
125142
*/
126143
public function __construct(
@@ -135,14 +152,34 @@ public function __construct(
135152
\Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
136153
\Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
137154
array $data = [],
138-
ProductCustomOptionValuesInterfaceFactory $customOptionValuesFactory = null
155+
ProductCustomOptionValuesInterfaceFactory $customOptionValuesFactory = null,
156+
array $optionGroups = [],
157+
array $optionTypesToGroups = []
139158
) {
140159
$this->productOptionValue = $productOptionValue;
141160
$this->optionTypeFactory = $optionFactory;
142-
$this->validatorPool = $validatorPool;
143161
$this->string = $string;
162+
$this->validatorPool = $validatorPool;
144163
$this->customOptionValuesFactory = $customOptionValuesFactory ?:
145164
\Magento\Framework\App\ObjectManager::getInstance()->get(ProductCustomOptionValuesInterfaceFactory::class);
165+
$this->optionGroups = $optionGroups ?: [
166+
self::OPTION_GROUP_DATE => Date::class,
167+
self::OPTION_GROUP_FILE => File::class,
168+
self::OPTION_GROUP_SELECT => Select::class,
169+
self::OPTION_GROUP_TEXT => Text::class,
170+
];
171+
$this->optionTypesToGroups = $optionTypesToGroups ?: [
172+
self::OPTION_TYPE_FIELD => self::OPTION_GROUP_TEXT,
173+
self::OPTION_TYPE_AREA => self::OPTION_GROUP_TEXT,
174+
self::OPTION_TYPE_FILE => self::OPTION_GROUP_FILE,
175+
self::OPTION_TYPE_DROP_DOWN => self::OPTION_GROUP_SELECT,
176+
self::OPTION_TYPE_RADIO => self::OPTION_GROUP_SELECT,
177+
self::OPTION_TYPE_CHECKBOX => self::OPTION_GROUP_SELECT,
178+
self::OPTION_TYPE_MULTIPLE => self::OPTION_GROUP_SELECT,
179+
self::OPTION_TYPE_DATE => self::OPTION_GROUP_DATE,
180+
self::OPTION_TYPE_DATE_TIME => self::OPTION_GROUP_DATE,
181+
self::OPTION_TYPE_TIME => self::OPTION_GROUP_DATE,
182+
];
146183

147184
parent::__construct(
148185
$context,
@@ -306,44 +343,30 @@ public function setProduct(Product $product = null)
306343
/**
307344
* Get group name of option by given option type
308345
*
309-
* @param string $type
346+
* @param string|null $type
310347
* @return string
311348
*/
312349
public function getGroupByType($type = null)
313350
{
314351
if ($type === null) {
315352
$type = $this->getType();
316353
}
317-
$optionGroupsToTypes = [
318-
self::OPTION_TYPE_FIELD => self::OPTION_GROUP_TEXT,
319-
self::OPTION_TYPE_AREA => self::OPTION_GROUP_TEXT,
320-
self::OPTION_TYPE_FILE => self::OPTION_GROUP_FILE,
321-
self::OPTION_TYPE_DROP_DOWN => self::OPTION_GROUP_SELECT,
322-
self::OPTION_TYPE_RADIO => self::OPTION_GROUP_SELECT,
323-
self::OPTION_TYPE_CHECKBOX => self::OPTION_GROUP_SELECT,
324-
self::OPTION_TYPE_MULTIPLE => self::OPTION_GROUP_SELECT,
325-
self::OPTION_TYPE_DATE => self::OPTION_GROUP_DATE,
326-
self::OPTION_TYPE_DATE_TIME => self::OPTION_GROUP_DATE,
327-
self::OPTION_TYPE_TIME => self::OPTION_GROUP_DATE,
328-
];
329354

330-
return $optionGroupsToTypes[$type] ?? '';
355+
return $this->optionTypesToGroups[$type] ?? '';
331356
}
332357

333358
/**
334359
* Group model factory
335360
*
336361
* @param string $type Option type
337-
* @return \Magento\Catalog\Model\Product\Option\Type\DefaultType
362+
* @return DefaultType
338363
* @throws LocalizedException
339364
*/
340365
public function groupFactory($type)
341366
{
342367
$group = $this->getGroupByType($type);
343-
if (!empty($group)) {
344-
return $this->optionTypeFactory->create(
345-
'Magento\Catalog\Model\Product\Option\Type\\' . $this->string->upperCaseWords($group)
346-
);
368+
if (!empty($group) && isset($this->optionGroups[$group])) {
369+
return $this->optionTypeFactory->create($this->optionGroups[$group]);
347370
}
348371
throw new LocalizedException(__('The option type to get group instance is incorrect.'));
349372
}

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,28 @@
411411
</argument>
412412
</arguments>
413413
</type>
414+
<type name="Magento\Catalog\Model\Product\Option">
415+
<arguments>
416+
<argument name="optionGroups" xsi:type="array">
417+
<item name="date" xsi:type="string">Magento\Catalog\Model\Product\Option\Type\Date</item>
418+
<item name="file" xsi:type="string">Magento\Catalog\Model\Product\Option\Type\File</item>
419+
<item name="select" xsi:type="string">Magento\Catalog\Model\Product\Option\Type\Select</item>
420+
<item name="text" xsi:type="string">Magento\Catalog\Model\Product\Option\Type\Text</item>
421+
</argument>
422+
<argument name="optionTypesToGroups" xsi:type="array">
423+
<item name="field" xsi:type="const">Magento\Catalog\Api\Data\ProductCustomOptionInterface::OPTION_GROUP_TEXT</item>
424+
<item name="area" xsi:type="const">Magento\Catalog\Api\Data\ProductCustomOptionInterface::OPTION_GROUP_TEXT</item>
425+
<item name="file" xsi:type="const">Magento\Catalog\Api\Data\ProductCustomOptionInterface::OPTION_GROUP_FILE</item>
426+
<item name="drop_down" xsi:type="const">Magento\Catalog\Api\Data\ProductCustomOptionInterface::OPTION_GROUP_SELECT</item>
427+
<item name="radio" xsi:type="const">Magento\Catalog\Api\Data\ProductCustomOptionInterface::OPTION_GROUP_SELECT</item>
428+
<item name="checkbox" xsi:type="const">Magento\Catalog\Api\Data\ProductCustomOptionInterface::OPTION_GROUP_SELECT</item>
429+
<item name="multiple" xsi:type="const">Magento\Catalog\Api\Data\ProductCustomOptionInterface::OPTION_GROUP_SELECT</item>
430+
<item name="date" xsi:type="const">Magento\Catalog\Api\Data\ProductCustomOptionInterface::OPTION_GROUP_DATE</item>
431+
<item name="date_time" xsi:type="const">Magento\Catalog\Api\Data\ProductCustomOptionInterface::OPTION_GROUP_DATE</item>
432+
<item name="time" xsi:type="const">Magento\Catalog\Api\Data\ProductCustomOptionInterface::OPTION_GROUP_DATE</item>
433+
</argument>
434+
</arguments>
435+
</type>
414436
<type name="Magento\Catalog\Model\Product\Option\Validator\Pool">
415437
<arguments>
416438
<argument name="validators" xsi:type="array">

0 commit comments

Comments
 (0)