/** * Convert custom attribute data array to array of AttributeValue Data Object * * @param array $customAttributesValueArray * @param string $dataObjectClassName * @return AttributeValue[] */ protected function convertCustomAttributeValue($customAttributesValueArray, $dataObjectClassName) { $result = []; $dataObjectClassName = ltrim($dataObjectClassName, '\\'); $camelCaseAttributeCodeKey = lcfirst(SimpleDataObjectConverter::snakeCaseToUpperCamelCase(AttributeValue::ATTRIBUTE_CODE)); foreach ($customAttributesValueArray as $key => $customAttribute) { if (!is_array($customAttribute)) { $customAttribute = [AttributeValue::ATTRIBUTE_CODE => $key, AttributeValue::VALUE => $customAttribute]; } if (isset($customAttribute[AttributeValue::ATTRIBUTE_CODE])) { $customAttributeCode = $customAttribute[AttributeValue::ATTRIBUTE_CODE]; } elseif (isset($customAttribute[$camelCaseAttributeCodeKey])) { $customAttributeCode = $customAttribute[$camelCaseAttributeCodeKey]; } else { $customAttributeCode = null; } //Check if type is defined, else default to string $type = $this->customAttributeTypeLocator->getType($customAttributeCode, $dataObjectClassName); $type = $type ? $type : TypeProcessor::ANY_TYPE; $customAttributeValue = $customAttribute[AttributeValue::VALUE]; if (is_array($customAttributeValue)) { //If type for AttributeValue's value as array is mixed, further processing is not possible if ($type === TypeProcessor::ANY_TYPE) { $attributeValue = $customAttributeValue; } else { $attributeValue = $this->_createDataObjectForTypeAndArrayValue($type, $customAttributeValue); } } else { $attributeValue = $this->convertValue($customAttributeValue, $type); } //Populate the attribute value data object once the value for custom attribute is derived based on type $result[$customAttributeCode] = $this->attributeValueFactory->create()->setAttributeCode($customAttributeCode)->setValue($attributeValue); } return $result; }
/** * Convert custom attribute data array to array of AttributeValue Data Object * * @param array $customAttributesValueArray * @param string $dataObjectClassName * @return AttributeValue[] * @throws SerializationException */ protected function convertCustomAttributeValue($customAttributesValueArray, $dataObjectClassName) { $result = []; $dataObjectClassName = ltrim($dataObjectClassName, '\\'); foreach ($customAttributesValueArray as $key => $customAttribute) { if (!is_array($customAttribute)) { $customAttribute = [AttributeValue::ATTRIBUTE_CODE => $key, AttributeValue::VALUE => $customAttribute]; } list($customAttributeCode, $customAttributeValue) = $this->processCustomAttribute($customAttribute); $type = $this->customAttributeTypeLocator->getType($customAttributeCode, $dataObjectClassName); if ($this->typeProcessor->isTypeAny($type) || $this->typeProcessor->isTypeSimple($type) || !is_array($customAttributeValue)) { try { $attributeValue = $this->convertValue($customAttributeValue, $type); } catch (SerializationException $e) { throw new SerializationException(new Phrase('Attribute "%attribute_code" has invalid value. %details', ['attribute_code' => $customAttributeCode, 'details' => $e->getMessage()])); } } else { $attributeValue = $this->_createDataObjectForTypeAndArrayValue($type, $customAttributeValue); } //Populate the attribute value data object once the value for custom attribute is derived based on type $result[$customAttributeCode] = $this->attributeValueFactory->create()->setAttributeCode($customAttributeCode)->setValue($attributeValue); } return $result; }