diff --git a/Controller/ApiAttributeTraitController.php b/Controller/ApiAttributeTraitController.php index 8bffbda..8661888 100644 --- a/Controller/ApiAttributeTraitController.php +++ b/Controller/ApiAttributeTraitController.php @@ -37,29 +37,42 @@ trait ApiAttributeTraitController * Method to create item attribute from request. * * @param RequestAbstract $request Request + * @param AttributeType $type Attribute type * * @return Attribute * * @since 1.0.0 */ - private function createAttributeFromRequest(RequestAbstract $request) : Attribute + private function createAttributeFromRequest(RequestAbstract $request, AttributeType $type) : Attribute { - $attribute = new Attribute(); - $attribute->ref = (int) $request->getData('ref'); - $attribute->type = new NullAttributeType((int) $request->getData('type')); + $new = new Attribute(); + $new->ref = (int) $request->getData('ref'); + $new->type = $type; - if ($request->hasData('value')) { - $attribute->value = new NullAttributeValue((int) $request->getData('value')); + if ($new->type->custom) { + if ($request->hasData('value_id')) { + $new->value = new NullAttributeValue((int) $request->getData('value_id')); + } else { + // @todo: consider to check if custom value already exist and just reference the id? Problematic if content of id gets changed. + $new->value = new AttributeValue(); + $new->value->setValue($request->getData('value'), $new->type->datatype); + } } else { - $newRequest = clone $request; - $newRequest->setData('value', $request->getData('custom'), true); + // @todo: fix by only accepting the value id to be used + // this is a workaround for now because the front end doesn't allow to dynamically show default values. + $value = new NullAttributeValue((int) $request->getData('value_id')); - $value = $this->createAttributeValueFromRequest($newRequest, $attribute->type); + // Couldn't find matching default value + /* + if ($value->id === 0) { + return $new; + } + */ - $attribute->value = $value; + $new->value = $value; } - return $attribute; + return $new; } /** @@ -75,7 +88,7 @@ trait ApiAttributeTraitController { $val = []; if (($val['type'] = !$request->hasData('type')) - || ($val['value'] = (!$request->hasData('value') && !$request->hasData('custom'))) + || ($val['value'] = (!$request->hasData('value') && !$request->hasData('value_id'))) ) { return $val; } @@ -267,21 +280,24 @@ trait ApiAttributeTraitController public function updateAttributeFromRequest(RequestAbstract $request, Attribute $new) : Attribute { if ($new->type->custom) { - if ($request->hasData('value')) { - $new->value = new NullAttributeValue((int) $request->getData('value')); + if ($request->hasData('value_id')) { + $new->value = new NullAttributeValue((int) $request->getData('value_id')); } else { // @todo: consider to check if custom value already exist and just reference the id? Problematic if content of id gets changed. $new->value = new AttributeValue(); - $new->value->setValue($request->getData('custom'), $new->type->datatype); + $new->value->setValue($request->getData('value'), $new->type->datatype); } } else { - // @todo: fix by only accepting the value id to be used - // this is a workaround for now because the front end doesn't allow to dynamically show default values. - $value = $new->type->getDefaultByValue($request->getData('value')); + if ($request->hasData('value_id')) { + // @todo: check if value_id part of default values + $value = new NullAttributeValue((int) $request->getData('value_id')); + } else { + $value = $new->type->getDefaultByValue($request->getData('value')); - // Couldn't find matching default value - if ($value->id === 0) { - return $new; + // Couldn't find matching default value + if ($value->id === 0) { + return $new; + } } $new->value = $value; @@ -303,7 +319,7 @@ trait ApiAttributeTraitController { $val = []; if (($val['id'] = !$request->hasData('id')) - || ($val['value'] = (!$request->hasData('value') && !$request->hasData('custom'))) + || ($val['value'] = (!$request->hasData('value') && !$request->hasData('value_id'))) ) { return $val; } diff --git a/Controller/ApiController.php b/Controller/ApiController.php index 058cb4b..89e037a 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -62,7 +62,7 @@ final class ApiController extends Controller return; } - $attribute = $this->createAttributeFromRequest($request); + $attribute = $this->createAttributeFromRequest($request, new NullAttributeType((int) $request->getData('type'))); $this->createModel($request->header->account, $attribute, AttributeMapper::class, 'attribute', $request->getOrigin()); $response->header->status = RequestStatusCode::R_400; @@ -73,29 +73,43 @@ final class ApiController extends Controller * Method to create item attribute from request. * * @param RequestAbstract $request Request + * @param AttributeType $type Attribute type * * @return Attribute * * @since 1.0.0 */ - private function createAttributeFromRequest(RequestAbstract $request) : Attribute + private function createAttributeFromRequest(RequestAbstract $request, AttributeType $type) : Attribute { - $attribute = new Attribute(); - $attribute->ref = (int) $request->getData('ref'); - $attribute->type = new NullAttributeType((int) $request->getData('type')); + $new = new Attribute(); + $new->ref = (int) $request->getData('ref'); + $new->type = $type; - if ($request->hasData('value')) { - $attribute->value = new NullAttributeValue((int) $request->getData('value')); + if ($new->type->custom) { + if ($request->hasData('value_id')) { + $new->value = new NullAttributeValue((int) $request->getData('value_id')); + } else { + // @todo: consider to check if custom value already exist and just reference the id? Problematic if content of id gets changed. + $new->value = new AttributeValue(); + $new->value->setValue($request->getData('value'), $new->type->datatype); + } } else { - $newRequest = clone $request; - $newRequest->setData('value', $request->getData('custom'), true); + if ($request->hasData('value_id')) { + // @todo: check if value_id part of default values + $value = new NullAttributeValue((int) $request->getData('value_id')); + } else { + $value = $new->type->getDefaultByValue($request->getData('value')); - $value = $this->createAttributeValueFromRequest($newRequest); + // Couldn't find matching default value + if ($value->id === 0) { + return $new; + } + } - $attribute->value = $value; + $new->value = $value; } - return $attribute; + return $new; } /** diff --git a/Theme/Backend/Components/AttributeView.php b/Theme/Backend/Components/AttributeView.php index dec239a..5fc1e67 100644 --- a/Theme/Backend/Components/AttributeView.php +++ b/Theme/Backend/Components/AttributeView.php @@ -62,6 +62,14 @@ class AttributeView extends View */ public string $apiUri = ''; + /** + * Reference id + * + * @var string + * @since 1.0.0 + */ + public int $refId = 0; + /** * {@inheritdoc} */ @@ -81,6 +89,7 @@ class AttributeView extends View $this->attributeTypes = $data[1]; $this->units = $data[2]; $this->apiUri = $data[3]; + $this->refId = $data[4]; return parent::render(); } diff --git a/Theme/Backend/Components/attributes.tpl.php b/Theme/Backend/Components/attributes.tpl.php index d6f8657..2e2c149 100644 --- a/Theme/Backend/Components/attributes.tpl.php +++ b/Theme/Backend/Components/attributes.tpl.php @@ -33,6 +33,8 @@ $l11n = $this->data['defaultlocalization'] ?? new NullLocalization(); data-add-tpl="#attributeTable tbody .oms-add-tpl-attribute">
getHtml('Attribute', 'Attribute', 'Backend'); ?>
+ +
@@ -48,6 +50,7 @@ $l11n = $this->data['defaultlocalization'] ?? new NullLocalization();
+
@@ -67,7 +71,7 @@ $l11n = $this->data['defaultlocalization'] ?? new NullLocalization();
- +
@@ -91,7 +95,7 @@ $l11n = $this->data['defaultlocalization'] ?? new NullLocalization(); getHtml('Unit', 'Attribute', 'Backend'); ?>