parameterFactory = $parameterFactory; $this->normalizer = $normalizer; parent::__construct($serialize, $json); } /** * Convert conditions_encoded part of block content from serialized to JSON format * * @param string $value * @return string * @throws DataConversionException */ public function convert($value) { preg_match_all('/(.*?){{widget(.*?)}}/si', $value, $matches, PREG_SET_ORDER); if (empty($matches)) { return $value; } $convertedValue = ''; foreach ($matches as $match) { $convertedValue .= $match[1] . '{{widget' . $this->convertWidgetParams($match[2]) . '}}'; } preg_match_all('/(.*?{{widget.*?}})*(?.*?)$/si', $value, $matchesTwo, PREG_SET_ORDER); if (isset($matchesTwo[0])) { $convertedValue .= $matchesTwo[0]['ending']; } return $convertedValue; } /** * @inheritdoc */ protected function isValidJsonValue($value) { return parent::isValidJsonValue($this->normalizer->restoreReservedCharacters($value)); } /** * Convert widget parameters from serialized format to JSON format * * @param string $paramsString * @return string */ private function convertWidgetParams($paramsString) { /** @var \Magento\Framework\Filter\Template\Tokenizer\Parameter $tokenizer */ $tokenizer = $this->parameterFactory->create(); $tokenizer->setString($paramsString); $widgetParameters = $tokenizer->tokenize(); if (isset($widgetParameters['conditions_encoded'])) { if ($this->isValidJsonValue($widgetParameters['conditions_encoded'])) { return $paramsString; } $conditions = $this->restoreReservedCharactersInSerializedContent($widgetParameters['conditions_encoded']); $widgetParameters['conditions_encoded'] = $this->normalizer->replaceReservedCharacters( parent::convert($conditions) ); $newParamsString = ''; foreach ($widgetParameters as $key => $parameter) { $newParamsString .= ' ' . $key . '="' . $parameter . '"'; } return $newParamsString; } else { return $paramsString; } } /** * 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 ); } }