1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198
<?php
/* --------------------------------------------------------------
AbstractJsonSerializer.inc.php 2016-02-25
Gambio GmbH
http://www.gambio.de
Copyright (c) 2016 Gambio GmbH
Released under the GNU General Public License (Version 2)
[http://www.gnu.org/licenses/gpl-2.0.html]
--------------------------------------------------------------
*/
MainFactory::load_class('SerializerInterface');
/**
* Abstract Json Serializer
*
* Serializers that extend this class should parse and encode entities
* so that they can be used in the shop's APIs.
*
* Serialization must follow the "null" approach in order to enhance response clarity.
* That means that serializers must provide a null value than an empty string or an omitted node.
*
* @category System
* @package Extensions
* @subpackage Serializers
*/
abstract class AbstractJsonSerializer implements SerializerInterface
{
/**
* Used for the resources that require multiple languages.
*
* @var LanguageProviderInterface $languageProvider
*/
protected $languageProvider;
/**
* AbstractJsonSerializer Constructor
*
* If you override this constructor do not forget to call it from the child class.
*/
public function __construct()
{
$this->languageProvider = MainFactory::create('LanguageProvider',
StaticGXCoreLoader::getDatabaseQueryBuilder());
}
abstract public function serialize($object, $encode = true);
abstract public function deserialize($string, $baseObject = null);
/**
* JSON Encode Wrapper
*
* This function provides PHP v5.3 compatibility and it should be used when serialized objects
* need to be encoded directly from the serializer instance.
*
* @param array $data Contains the data to be JSON encoded.
*
* @return string Returns the encoded JSON string that represents the data.
*/
public function jsonEncode(array $data)
{
if(defined(JSON_PRETTY_PRINT) && defined(JSON_UNESCAPED_SLASHES))
{
$dataJsonString = json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
}
else
{
$dataJsonString = json_encode($data); // PHP v5.3
}
return $dataJsonString;
}
/**
* Serialize Addon Values
*
* Common method for serializing addon values in various resource serializer classes.
*
* @param \KeyValueCollection $addonValues
*
* @return array
*/
protected function _serializeAddonValues(KeyValueCollection $addonValues)
{
if($addonValues->count())
{
$addonValuesArray = array();
foreach($addonValues->getArray() as $key => $value)
{
$addonValuesArray[$key] = $value;
}
}
else
{
$addonValuesArray = null;
}
return $addonValuesArray;
}
/**
* Deserialize Addon Values
*
* Common method for deserializing addon values in various resource serializer classes.
*
* @param $json
*
* @return array
*/
protected function _deserializeAddonValues($json)
{
$itemAddonValuesArray = array();
foreach($json as $propertyKey => $propertyValue)
{
$itemAddonValuesArray[$propertyKey] = $propertyValue;
}
return $itemAddonValuesArray;
}
/**
* Serialize Language Specific Property
*
* In order for this method to work there has to be a proper getter method in the object instance. Otherwise
* a RuntimeException will be thrown.
*
* @param mixed $object The object instance containing the property.
* @param string $property The property name to be serialized.
*
* @return array
*
* @throws \RuntimeException If there is no getter for the provided property.
*/
protected function _serializeLanguageSpecificProperty($object, $property)
{
$method = 'get' . ucfirst($property);
$resource = array($object, $method);
if(!is_callable($resource))
{
throw new \RuntimeException('The requested resource is not supported.', 400);
}
$propertyArray = array();
foreach($this->languageProvider->getCodes()->getArray() as $languageCode)
{
$propertyArray[strtolower($languageCode->asString())] = call_user_func($resource, $languageCode);
}
return $propertyArray;
}
/**
* Deserialize Language Specific Property
*
* This method will deserialize the value of a JSON property and set the value to the
* object by using the corresponding setter method.
*
* @param mixed $object The object being deserialized.
* @param stdobject $json The JSON object containing the property value.
* @param string $property The property name to be deserialized.
*
* @throws \RuntimeException If the setter method does not exist.
*/
protected function _deserializeLanguageSpecificProperty($object, $json, $property, $type = 'StringType')
{
$method = 'set' . ucfirst($property);
$resource = array($object, $method);
if(!is_callable($resource))
{
throw new RuntimeException('The requested resource is not supported.', 400);
}
if ($json === null)
{
return; // The provided $json object is empty.
}
foreach($json as $languageCode => $value)
{
$valueInstance = new $type($value);
call_user_func($resource, $valueInstance, new LanguageCode(new StringType($languageCode)));
}
}
}