diff --git a/lib/internal/Magento/Framework/Data/Form/Element/Editablemultiselect.php b/lib/internal/Magento/Framework/Data/Form/Element/Editablemultiselect.php index 8df9b4175675f..3c03155fb163e 100644 --- a/lib/internal/Magento/Framework/Data/Form/Element/Editablemultiselect.php +++ b/lib/internal/Magento/Framework/Data/Form/Element/Editablemultiselect.php @@ -13,8 +13,36 @@ */ namespace Magento\Framework\Data\Form\Element; +use Magento\Framework\Escaper; + class Editablemultiselect extends \Magento\Framework\Data\Form\Element\Multiselect { + /** + * @var \Magento\Framework\Serialize\Serializer\Json + */ + private $serializer; + + /** + * Editablemultiselect constructor. + * @param Factory $factoryElement + * @param CollectionFactory $factoryCollection + * @param Escaper $escaper + * @param array $data + * @param \Magento\Framework\Serialize\Serializer\Json|null $serializer + * @throws \RuntimeException + */ + public function __construct( + Factory $factoryElement, + CollectionFactory $factoryCollection, + Escaper $escaper, + array $data = [], + \Magento\Framework\Serialize\Serializer\Json $serializer = null + ) { + parent::__construct($factoryElement, $factoryCollection, $escaper, $data); + $this->serializer = $serializer ?: \Magento\Framework\App\ObjectManager::getInstance() + ->get(\Magento\Framework\Serialize\Serializer\Json::class); + } + /** * Name of the default JavaScript class that is used to make multiselect editable * @@ -26,6 +54,7 @@ class Editablemultiselect extends \Magento\Framework\Data\Form\Element\Multisele * Retrieve HTML markup of the element * * @return string + * @throws \InvalidArgumentException */ public function getElementHtml() { @@ -41,7 +70,7 @@ public function getElementHtml() $elementJsClass = $this->getData('element_js_class'); } - $selectConfigJson = \Zend_Json::encode($selectConfig); + $selectConfigJson = $this->serializer->serialize($selectConfig); $jsObjectName = $this->getJsObjectName(); // TODO: TaxRateEditableMultiselect should be moved to a static .js module. diff --git a/lib/internal/Magento/Framework/Data/Form/Element/Editor.php b/lib/internal/Magento/Framework/Data/Form/Element/Editor.php index 50d553f5e06ab..6ed2d8293e61d 100644 --- a/lib/internal/Magento/Framework/Data/Form/Element/Editor.php +++ b/lib/internal/Magento/Framework/Data/Form/Element/Editor.php @@ -16,16 +16,25 @@ class Editor extends Textarea { /** + * @var \Magento\Framework\Serialize\Serializer\Json + */ + private $serializer; + + /** + * Editor constructor. * @param Factory $factoryElement * @param CollectionFactory $factoryCollection * @param Escaper $escaper * @param array $data + * @param \Magento\Framework\Serialize\Serializer\Json|null $serializer + * @throws \RuntimeException */ public function __construct( Factory $factoryElement, CollectionFactory $factoryCollection, Escaper $escaper, - $data = [] + $data = [], + \Magento\Framework\Serialize\Serializer\Json $serializer = null ) { parent::__construct($factoryElement, $factoryCollection, $escaper, $data); @@ -36,6 +45,8 @@ public function __construct( $this->setType('textarea'); $this->setExtType('textarea'); } + $this->serializer = $serializer ?: \Magento\Framework\App\ObjectManager::getInstance() + ->get(\Magento\Framework\Serialize\Serializer\Json::class); } /** @@ -52,6 +63,21 @@ protected function getButtonTranslations() return $buttonTranslations; } + /** + * @return bool|string + * @throws \InvalidArgumentException + */ + private function getJsonConfig() + { + if (is_object($this->getConfig()) && method_exists($this->getConfig(), 'toJson')) { + return $this->getConfig()->toJson(); + } else { + return $this->serializer->serialize( + $this->getConfig() + ); + } + } + /** * @return string * @SuppressWarnings(PHPMD.ExcessiveMethodLength) @@ -132,7 +158,7 @@ public function getElementHtml() ], function(jQuery){' . "\n" . ' (function($) {$.mage.translate.add(' . - \Zend_Json::encode( + $this->serializer->serialize( $this->getButtonTranslations() ) . ')})(jQuery);' . @@ -141,9 +167,7 @@ public function getElementHtml() ' = new tinyMceWysiwygSetup("' . $this->getHtmlId() . '", ' . - \Zend_Json::encode( - $this->getConfig() - ) . + $this->getJsonConfig() . ');' . $forceLoad . ' @@ -180,7 +204,7 @@ public function getElementHtml() //getButtonTranslations()) . ') + $.mage.translate.add(' . $this->serializer->serialize($this->getButtonTranslations()) . ') })(jQuery); }); //]]> diff --git a/lib/internal/Magento/Framework/Data/Test/Unit/Form/Element/EditorTest.php b/lib/internal/Magento/Framework/Data/Test/Unit/Form/Element/EditorTest.php index 8f635d0cddfa1..be9fa81ddfc45 100644 --- a/lib/internal/Magento/Framework/Data/Test/Unit/Form/Element/EditorTest.php +++ b/lib/internal/Magento/Framework/Data/Test/Unit/Form/Element/EditorTest.php @@ -48,6 +48,11 @@ class EditorTest extends \PHPUnit_Framework_TestCase */ protected $objectManager; + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + private $serializer; + protected function setUp() { $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); @@ -62,13 +67,16 @@ protected function setUp() $this->escaperMock = $this->getMock(\Magento\Framework\Escaper::class, [], [], '', false); $this->configMock = $this->getMock(\Magento\Framework\DataObject::class, ['getData'], [], '', false); + $this->serializer = $this->getMock(\Magento\Framework\Serialize\Serializer\Json::class, [], [], '', false); + $this->model = $this->objectManager->getObject( \Magento\Framework\Data\Form\Element\Editor::class, [ 'factoryElement' => $this->factoryMock, 'factoryCollection' => $this->collectionFactoryMock, 'escaper' => $this->escaperMock, - 'data' => ['config' => $this->configMock] + 'data' => ['config' => $this->configMock], + 'serializer' => $this->serializer ] ); @@ -203,7 +211,14 @@ public function testGetConfig() public function testGetTranslatedString() { $this->configMock->expects($this->any())->method('getData')->withConsecutive(['enabled'])->willReturn(true); + $this->serializer->expects($this->any()) + ->method('serialize') + ->willReturnCallback(function ($params) { + return json_encode($params); + } + ); $html = $this->model->getElementHtml(); + $this->assertRegExp('/.*"Insert Image...":"Insert Image...".*/i', $html); } }