Magento – Magento 2. Image chooser Widget problem

imagejavascriptmagento2

I have a image chooser in widget, when I click it first time, pop-up is open and I can choose image, but if I want choose another image and click on button I get a exception.
enter image description here

widget.xml

<parameter name="image" xsi:type="block" required="true" visible="true" sort_order="10">
     <label translate="true">Banner image</label>
     <block class="Namespace\Widget\Block\Adminhtml\Widget\ImageChooser">
         <data>
              <item name="button" xsi:type="array">
                 <item name="open" xsi:type="string">Choose Image...</item>
              </item>
         </data>
     </block>
</parameter>

ImageChooser.php

class ImageChooser extends \Magento\Backend\Block\Template
{

protected $elementFactory;

/**
 * Image Chooser construct
 *
 * @param \Magento\Backend\Block\Template\Context $context
 * @param \Magento\Framework\Data\Form\Element\Factory $elementFactory
 * @param array $data
 */
public function __construct(
    \Magento\Backend\Block\Template\Context $context,
    \Magento\Framework\Data\Form\Element\Factory $elementFactory,
    array $data = []
) {
    $this->elementFactory = $elementFactory;
    parent::__construct($context, $data);
}

/**
 * Prepare chooser element HTML
 *
 * @param \Magento\Framework\Data\Form\Element\AbstractElement $element Form Element
 * @return \Magento\Framework\Data\Form\Element\AbstractElement
 */
public function prepareElementHtml(\Magento\Framework\Data\Form\Element\AbstractElement $element)
{
    $config = $this->_getData('config');
    $sourceUrl = $this->getUrl(
        'cms/wysiwyg_images/index',
        ['target_element_id' => $element->getId(), 'type' => 'file']
    );
    $chooser = $this->getLayout()->createBlock('Magento\Backend\Block\Widget\Button')
        ->setType('button')
        ->setClass('btn-chooser')
        ->setLabel($config['button']['open'])
        ->setOnClick('MediabrowserUtility.openDialog(\''. $sourceUrl .'\')')
        ->setDisabled($element->getReadonly());
    $input = $this->elementFactory->create("text", ['data' => $element->getData()]);
    $input->setId($element->getId());
    $input->setForm($element->getForm());
    $input->setClass("widget-option input-text admin__control-text");
    if ($element->getRequired()) {
        $input->addClass('required-entry');
    }
    $element->setData('after_element_html', $input->getElementHtml() . $chooser->toHtml());
    return $element;
}

Has anyone encountered this error?

Best Answer

Add media script in the element of set data:

$element->setData('after_element_html', $input->getElementHtml() . $chooser->toHtml() . "<script>require(['mage/adminhtml/browser']);</script>");
Related Topic