Options.php 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Widget\Block\Adminhtml\Widget;
  7. /**
  8. * WYSIWYG widget options form
  9. *
  10. * @api
  11. * @since 100.0.2
  12. */
  13. class Options extends \Magento\Backend\Block\Widget\Form\Generic
  14. {
  15. /**
  16. * Element type used by default if configuration is omitted
  17. * @var string
  18. */
  19. protected $_defaultElementType = 'text';
  20. /**
  21. * @var \Magento\Widget\Model\Widget
  22. */
  23. protected $_widget;
  24. /**
  25. * @var \Magento\Framework\Option\ArrayPool
  26. */
  27. protected $_sourceModelPool;
  28. /**
  29. * @param \Magento\Backend\Block\Template\Context $context
  30. * @param \Magento\Framework\Registry $registry
  31. * @param \Magento\Framework\Data\FormFactory $formFactory
  32. * @param \Magento\Framework\Option\ArrayPool $sourceModelPool
  33. * @param \Magento\Widget\Model\Widget $widget
  34. * @param array $data
  35. */
  36. public function __construct(
  37. \Magento\Backend\Block\Template\Context $context,
  38. \Magento\Framework\Registry $registry,
  39. \Magento\Framework\Data\FormFactory $formFactory,
  40. \Magento\Framework\Option\ArrayPool $sourceModelPool,
  41. \Magento\Widget\Model\Widget $widget,
  42. array $data = []
  43. ) {
  44. $this->_sourceModelPool = $sourceModelPool;
  45. $this->_widget = $widget;
  46. parent::__construct($context, $registry, $formFactory, $data);
  47. }
  48. /**
  49. * Prepare Widget Options Form and values according to specified type
  50. *
  51. * The widget_type must be set in data before
  52. * widget_values may be set before to render element values
  53. *
  54. * @return $this
  55. */
  56. protected function _prepareForm()
  57. {
  58. $this->getForm()->setUseContainer(false);
  59. $this->addFields();
  60. return $this;
  61. }
  62. /**
  63. * Form getter/instantiation
  64. *
  65. * @return \Magento\Framework\Data\Form
  66. */
  67. public function getForm()
  68. {
  69. if ($this->_form instanceof \Magento\Framework\Data\Form) {
  70. return $this->_form;
  71. }
  72. /** @var \Magento\Framework\Data\Form $form */
  73. $form = $this->_formFactory->create();
  74. $this->setForm($form);
  75. return $form;
  76. }
  77. /**
  78. * Fieldset getter/instantiation
  79. *
  80. * @return \Magento\Framework\Data\Form\Element\Fieldset
  81. */
  82. public function getMainFieldset()
  83. {
  84. if ($this->_getData('main_fieldset') instanceof \Magento\Framework\Data\Form\Element\Fieldset) {
  85. return $this->_getData('main_fieldset');
  86. }
  87. $mainFieldsetHtmlId = 'options_fieldset' . md5($this->getWidgetType());
  88. $this->setMainFieldsetHtmlId($mainFieldsetHtmlId);
  89. $fieldset = $this->getForm()->addFieldset(
  90. $mainFieldsetHtmlId,
  91. ['legend' => __('Widget Options'), 'class' => 'fieldset-wide fieldset-widget-options']
  92. );
  93. $this->setData('main_fieldset', $fieldset);
  94. // add dependence javascript block
  95. $block = $this->getLayout()->createBlock(\Magento\Backend\Block\Widget\Form\Element\Dependence::class);
  96. $this->setChild('form_after', $block);
  97. return $fieldset;
  98. }
  99. /**
  100. * Add fields to main fieldset based on specified widget type
  101. *
  102. * @throws \Magento\Framework\Exception\LocalizedException
  103. * @return $this
  104. */
  105. public function addFields()
  106. {
  107. // get configuration node and translation helper
  108. if (!$this->getWidgetType()) {
  109. throw new \Magento\Framework\Exception\LocalizedException(__('Please specify a Widget Type.'));
  110. }
  111. $config = $this->_widget->getConfigAsObject($this->getWidgetType());
  112. if (!$config->getParameters()) {
  113. return $this;
  114. }
  115. foreach ($config->getParameters() as $parameter) {
  116. $this->_addField($parameter);
  117. }
  118. return $this;
  119. }
  120. /**
  121. * Add field to Options form based on parameter configuration
  122. *
  123. * @param \Magento\Framework\DataObject $parameter
  124. * @return \Magento\Framework\Data\Form\Element\AbstractElement
  125. * @SuppressWarnings(PHPMD.CyclomaticComplexity)
  126. * @SuppressWarnings(PHPMD.NPathComplexity)
  127. */
  128. protected function _addField($parameter)
  129. {
  130. $form = $this->getForm();
  131. $fieldset = $this->getMainFieldset();
  132. //$form->getElement('options_fieldset');
  133. // prepare element data with values (either from request of from default values)
  134. $fieldName = $parameter->getKey();
  135. $data = [
  136. 'name' => $form->addSuffixToName($fieldName, 'parameters'),
  137. 'label' => __($parameter->getLabel()),
  138. 'required' => $parameter->getRequired(),
  139. 'class' => 'widget-option',
  140. 'note' => __($parameter->getDescription()),
  141. ];
  142. if ($values = $this->getWidgetValues()) {
  143. $data['value'] = isset($values[$fieldName]) ? $values[$fieldName] : '';
  144. } else {
  145. $data['value'] = $parameter->getValue();
  146. }
  147. //prepare unique id value
  148. if ($fieldName == 'unique_id' && $data['value'] == '') {
  149. $data['value'] = hash('sha256', microtime(1));
  150. }
  151. if (is_array($data['value'])) {
  152. foreach ($data['value'] as &$value) {
  153. $value = html_entity_decode($value);
  154. }
  155. } else {
  156. $data['value'] = html_entity_decode($data['value']);
  157. }
  158. // prepare element dropdown values
  159. if ($values = $parameter->getValues()) {
  160. // dropdown options are specified in configuration
  161. $data['values'] = [];
  162. foreach ($values as $option) {
  163. $data['values'][] = ['label' => __($option['label']), 'value' => $option['value']];
  164. }
  165. // otherwise, a source model is specified
  166. } elseif ($sourceModel = $parameter->getSourceModel()) {
  167. $data['values'] = $this->_sourceModelPool->get($sourceModel)->toOptionArray();
  168. }
  169. // prepare field type or renderer
  170. $fieldRenderer = null;
  171. $fieldType = $parameter->getType();
  172. // hidden element
  173. if (!$parameter->getVisible()) {
  174. $fieldType = 'hidden';
  175. // just an element renderer
  176. } elseif ($fieldType && $this->_isClassName($fieldType)) {
  177. $fieldRenderer = $this->getLayout()->createBlock($fieldType);
  178. $fieldType = $this->_defaultElementType;
  179. }
  180. // instantiate field and render html
  181. $field = $fieldset->addField($this->getMainFieldsetHtmlId() . '_' . $fieldName, $fieldType, $data);
  182. if ($fieldRenderer) {
  183. $field->setRenderer($fieldRenderer);
  184. }
  185. // extra html preparations
  186. if ($helper = $parameter->getHelperBlock()) {
  187. $helperBlock = $this->getLayout()->createBlock(
  188. $helper->getType(),
  189. '',
  190. ['data' => $helper->getData()]
  191. );
  192. if ($helperBlock instanceof \Magento\Framework\DataObject) {
  193. $helperBlock->setConfig(
  194. $helper->getData()
  195. )->setFieldsetId(
  196. $fieldset->getId()
  197. )->prepareElementHtml(
  198. $field
  199. );
  200. }
  201. }
  202. // dependencies from other fields
  203. $dependenceBlock = $this->getChildBlock('form_after');
  204. $dependenceBlock->addFieldMap($field->getId(), $fieldName);
  205. if ($parameter->getDepends()) {
  206. foreach ($parameter->getDepends() as $from => $row) {
  207. $values = isset($row['values']) ? array_values($row['values']) : (string)$row['value'];
  208. $dependenceBlock->addFieldDependence($fieldName, $from, $values);
  209. }
  210. }
  211. return $field;
  212. }
  213. /**
  214. * Checks whether $fieldType is a class name of custom renderer, and not just a type of input element
  215. *
  216. * @param string $fieldType
  217. * @return bool
  218. */
  219. protected function _isClassName($fieldType)
  220. {
  221. return preg_match('/[A-Z]/', $fieldType) > 0;
  222. }
  223. }