123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Eav\Model\Entity\Attribute\Backend;
- use Magento\Framework\Serialize\Serializer\Json;
- /**
- * Backend model for attribute that stores structures in json format
- *
- * @api
- * @since 101.0.0
- */
- class JsonEncoded extends \Magento\Eav\Model\Entity\Attribute\Backend\AbstractBackend
- {
- /**
- * @var Json
- */
- private $jsonSerializer;
- /**
- * ArrayBackend constructor.
- *
- * @param Json $jsonSerializer
- */
- public function __construct(Json $jsonSerializer)
- {
- $this->jsonSerializer = $jsonSerializer;
- }
- /**
- * Encode before saving
- *
- * @param \Magento\Framework\DataObject $object
- * @return $this
- * @since 101.0.0
- */
- public function beforeSave($object)
- {
- // parent::beforeSave() is not called intentionally
- $attrCode = $this->getAttribute()->getAttributeCode();
- if ($object->hasData($attrCode) && !$this->isJsonEncoded($object->getData($attrCode))) {
- $object->setData($attrCode, $this->jsonSerializer->serialize($object->getData($attrCode)));
- }
- return $this;
- }
- /**
- * Decode after loading
- *
- * @param \Magento\Framework\DataObject $object
- * @return $this
- * @since 101.0.0
- */
- public function afterLoad($object)
- {
- parent::afterLoad($object);
- $attrCode = $this->getAttribute()->getAttributeCode();
- $object->setData($attrCode, $this->jsonSerializer->unserialize($object->getData($attrCode) ?: '{}'));
- return $this;
- }
- /**
- * Returns true if given value is a valid json value, and false otherwise.
- *
- * @param string|int|float|bool|array|null $value
- * @return bool
- */
- private function isJsonEncoded($value): bool
- {
- $result = is_string($value);
- if ($result) {
- try {
- $this->jsonSerializer->unserialize($value);
- } catch (\InvalidArgumentException $e) {
- $result = false;
- }
- }
- return $result;
- }
- }
|