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
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Widget\Setup;
use Magento\Framework\Serialize\Serializer\Json;
use Magento\Framework\Serialize\Serializer\Serialize;
use Magento\Framework\Data\Wysiwyg\Normalizer;
use Magento\Framework\DB\DataConverter\DataConversionException;
use Magento\Framework\DB\DataConverter\SerializedToJson;
/**
* Convert conditions_encoded part of layout update data from serialized to JSON format
*/
class LayoutUpdateConverter extends SerializedToJson
{
/**
* @var Normalizer
*/
private $normalizer;
/**
* Constructor
*
* @param Serialize $serialize
* @param Json $json
* @param Normalizer $normalizer
*/
public function __construct(
Serialize $serialize,
Json $json,
Normalizer $normalizer
) {
$this->normalizer = $normalizer;
parent::__construct($serialize, $json);
}
/**
* Convert conditions_encoded part of layout update data from serialized to JSON format
*
* @param string $value
* @return string
* @throws DataConversionException
*/
public function convert($value)
{
preg_match_all(
'/^(.*?conditions_encoded<\/argument><argument [^<]*>)(.*?)(<\/argument>.*?)$/si',
$value,
$matches,
PREG_SET_ORDER
);
if (isset($matches[0])) {
$matchSegments = $matches[0];
$matchSegments[2] = parent::convert($matchSegments[2]);
return $matchSegments[1] . $matchSegments[2] . $matchSegments[3];
} else {
return $value;
}
}
/**
* @inheritdoc
*/
protected function isValidJsonValue($value)
{
$value = $this->normalizer->restoreReservedCharacters($value);
return parent::isValidJsonValue($value);
}
/**
* @inheritdoc
*/
protected function unserializeValue($value)
{
$value = htmlspecialchars_decode($value);
$value = $this->restoreReservedCharactersInSerializedContent($value);
return parent::unserializeValue($value);
}
/**
* @inheritdoc
*/
protected function encodeJson($value)
{
return htmlspecialchars(
$this->normalizer->replaceReservedCharacters(parent::encodeJson($value))
);
}
/**
* Restore the reserved characters in the existing serialized content
*
* @param string $serializedContent
* @return string
*/
private function restoreReservedCharactersInSerializedContent($serializedContent)
{
$map = [
'{' => '[',
'}' => ']',
'"' => '`',
'\\' => '|',
];
return str_replace(
array_values($map),
array_keys($map),
$serializedContent
);
}
}