Config.php 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Widget\Model\Widget;
  7. /**
  8. * Widgets Insertion Plugin Config for Editor HTML Element
  9. */
  10. class Config implements \Magento\Framework\Data\Wysiwyg\ConfigProviderInterface
  11. {
  12. /**
  13. * @var \Magento\Framework\View\Asset\Repository
  14. */
  15. protected $_assetRepo;
  16. /**
  17. * @var \Magento\Widget\Model\Widget
  18. */
  19. protected $_widget;
  20. /**
  21. * @var \Magento\Backend\Model\UrlInterface
  22. */
  23. protected $_backendUrl;
  24. /**
  25. * @var \Magento\Framework\Url\DecoderInterface
  26. */
  27. protected $urlDecoder;
  28. /**
  29. * @var \Magento\Widget\Model\WidgetFactory
  30. */
  31. protected $_widgetFactory;
  32. /**
  33. * @var \Magento\Framework\Url\EncoderInterface
  34. */
  35. protected $urlEncoder;
  36. /**
  37. * @var \Magento\Framework\Registry
  38. */
  39. private $registry;
  40. /**
  41. * @param \Magento\Backend\Model\UrlInterface $backendUrl
  42. * @param \Magento\Framework\Url\DecoderInterface $urlDecoder
  43. * @param \Magento\Framework\View\Asset\Repository $assetRepo
  44. * @param \Magento\Widget\Model\WidgetFactory $widgetFactory
  45. * @param \Magento\Framework\Url\EncoderInterface $urlEncoder
  46. * @param \Magento\Framework\Registry $registry
  47. */
  48. public function __construct(
  49. \Magento\Backend\Model\UrlInterface $backendUrl,
  50. \Magento\Framework\Url\DecoderInterface $urlDecoder,
  51. \Magento\Framework\View\Asset\Repository $assetRepo,
  52. \Magento\Widget\Model\WidgetFactory $widgetFactory,
  53. \Magento\Framework\Url\EncoderInterface $urlEncoder,
  54. \Magento\Framework\Registry $registry
  55. ) {
  56. $this->_backendUrl = $backendUrl;
  57. $this->urlDecoder = $urlDecoder;
  58. $this->_assetRepo = $assetRepo;
  59. $this->_widgetFactory = $widgetFactory;
  60. $this->urlEncoder = $urlEncoder;
  61. $this->registry = $registry;
  62. }
  63. /**
  64. * Return config settings for widgets insertion plugin based on editor element config
  65. *
  66. * @param \Magento\Framework\DataObject $config
  67. * @return \Magento\Framework\DataObject
  68. */
  69. public function getConfig(\Magento\Framework\DataObject $config) : \Magento\Framework\DataObject
  70. {
  71. $settings = $this->getPluginSettings($config);
  72. return $config->addData($settings);
  73. }
  74. /**
  75. * Return config settings for widgets insertion plugin based on editor element config
  76. *
  77. * @param \Magento\Framework\DataObject $config
  78. * @return array
  79. */
  80. public function getPluginSettings($config)
  81. {
  82. $widgetWysiwyg = [
  83. [
  84. 'name' => 'magentowidget',
  85. 'src' => $this->getWysiwygJsPluginSrc(),
  86. 'options' => [
  87. 'window_url' => $this->getWidgetWindowUrl($config),
  88. 'types' => $this->getAvailableWidgets($config),
  89. 'error_image_url' => $this->getErrorImageUrl(),
  90. 'placeholders' => $this->getWidgetPlaceholderImageUrls(),
  91. ],
  92. ]
  93. ];
  94. $configPlugins = (array) $config->getData('plugins');
  95. $widgetConfig['plugins'] = array_merge($configPlugins, $widgetWysiwyg);
  96. return $widgetConfig;
  97. }
  98. /**
  99. * Return list of available placeholders for widget
  100. *
  101. * @return array
  102. */
  103. public function getWidgetPlaceholderImageUrls()
  104. {
  105. return $this->_widgetFactory->create()->getPlaceholderImageUrls();
  106. }
  107. /**
  108. * Return url to error image
  109. * @return string
  110. */
  111. public function getErrorImageUrl()
  112. {
  113. return $this->_assetRepo->getUrl('Magento_Widget::error.png');
  114. }
  115. /**
  116. * Return url to wysiwyg plugin
  117. * @return string
  118. */
  119. public function getWysiwygJsPluginSrc()
  120. {
  121. return $this->_assetRepo->getUrl('mage/adminhtml/wysiwyg/tiny_mce/plugins/magentowidget/editor_plugin.js');
  122. }
  123. /**
  124. * Return Widgets Insertion Plugin Window URL
  125. *
  126. * @param \Magento\Framework\DataObject $config Editor element config
  127. * @return string
  128. */
  129. public function getWidgetWindowUrl($config)
  130. {
  131. $params = [];
  132. $skipped = is_array($config->getData('skip_widgets')) ? $config->getData('skip_widgets') : [];
  133. if ($config->hasData('widget_filters')) {
  134. $all = $this->_widgetFactory->create()->getWidgets();
  135. $filtered = $this->_widgetFactory->create()->getWidgets($config->getData('widget_filters'));
  136. foreach ($all as $code => $widget) {
  137. if (!isset($filtered[$code])) {
  138. $skipped[] = $widget['@']['type'];
  139. }
  140. }
  141. }
  142. if (count($skipped) > 0) {
  143. $params['skip_widgets'] = $this->encodeWidgetsToQuery($skipped);
  144. }
  145. return $this->_backendUrl->getUrl('adminhtml/widget/index', $params);
  146. }
  147. /**
  148. * Encode list of widget types into query param
  149. *
  150. * @param string[]|string $widgets List of widgets
  151. * @return string Query param value
  152. */
  153. public function encodeWidgetsToQuery($widgets)
  154. {
  155. $widgets = is_array($widgets) ? $widgets : [$widgets];
  156. $param = implode(',', $widgets);
  157. return $this->urlEncoder->encode($param);
  158. }
  159. /**
  160. * Decode URL query param and return list of widgets
  161. *
  162. * @param string $queryParam Query param value to decode
  163. * @return string[] Array of widget types
  164. */
  165. public function decodeWidgetsFromQuery($queryParam)
  166. {
  167. $param = $this->urlDecoder->decode($queryParam);
  168. return preg_split('/\s*\,\s*/', $param, 0, PREG_SPLIT_NO_EMPTY);
  169. }
  170. /**
  171. * @param \Magento\Framework\DataObject $config Editor element config
  172. * @return array
  173. */
  174. public function getAvailableWidgets($config)
  175. {
  176. if (!$config->hasData('widget_types')) {
  177. $result = [];
  178. $allWidgets = $this->_widgetFactory->create()->getWidgetsArray();
  179. $skipped = $this->_getSkippedWidgets();
  180. foreach ($allWidgets as $widget) {
  181. if (is_array($skipped) && in_array($widget['type'], $skipped)) {
  182. continue;
  183. }
  184. $result[] = $widget['name']->getText();
  185. }
  186. }
  187. return $result;
  188. }
  189. /**
  190. * Return array of widgets disabled for selection
  191. *
  192. * @return string[]
  193. */
  194. protected function _getSkippedWidgets()
  195. {
  196. return $this->registry->registry('skip_widgets');
  197. }
  198. }