Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
Options.php
Go to the documentation of this file.
1 <?php
7 
14 class Options extends \Magento\Backend\Block\Widget\Form\Generic
15 {
20  protected $_defaultElementType = 'text';
21 
25  protected $_widget;
26 
30  protected $_sourceModelPool;
31 
40  public function __construct(
41  \Magento\Backend\Block\Template\Context $context,
42  \Magento\Framework\Registry $registry,
43  \Magento\Framework\Data\FormFactory $formFactory,
44  \Magento\Framework\Option\ArrayPool $sourceModelPool,
45  \Magento\Widget\Model\Widget $widget,
46  array $data = []
47  ) {
48  $this->_sourceModelPool = $sourceModelPool;
49  $this->_widget = $widget;
50  parent::__construct($context, $registry, $formFactory, $data);
51  }
52 
61  protected function _prepareForm()
62  {
63  $this->getForm()->setUseContainer(false);
64  $this->addFields();
65  return $this;
66  }
67 
73  public function getForm()
74  {
75  if ($this->_form instanceof \Magento\Framework\Data\Form) {
76  return $this->_form;
77  }
79  $form = $this->_formFactory->create();
80  $this->setForm($form);
81  return $form;
82  }
83 
89  public function getMainFieldset()
90  {
91  if ($this->_getData('main_fieldset') instanceof \Magento\Framework\Data\Form\Element\Fieldset) {
92  return $this->_getData('main_fieldset');
93  }
94  $mainFieldsetHtmlId = 'options_fieldset' . md5($this->getWidgetType());
95  $this->setMainFieldsetHtmlId($mainFieldsetHtmlId);
96  $fieldset = $this->getForm()->addFieldset(
97  $mainFieldsetHtmlId,
98  ['legend' => __('Widget Options'), 'class' => 'fieldset-wide fieldset-widget-options']
99  );
100  $this->setData('main_fieldset', $fieldset);
101 
102  // add dependence javascript block
103  $block = $this->getLayout()->createBlock(\Magento\Backend\Block\Widget\Form\Element\Dependence::class);
104  $this->setChild('form_after', $block);
105 
106  return $fieldset;
107  }
108 
115  public function addFields()
116  {
117  // get configuration node and translation helper
118  if (!$this->getWidgetType()) {
119  throw new \Magento\Framework\Exception\LocalizedException(__('Please specify a Widget Type.'));
120  }
121  $config = $this->_widget->getConfigAsObject($this->getWidgetType());
122  if (!$config->getParameters()) {
123  return $this;
124  }
125  foreach ($config->getParameters() as $parameter) {
126  $this->_addField($parameter);
127  }
128 
129  return $this;
130  }
131 
140  protected function _addField($parameter)
141  {
142  $form = $this->getForm();
143  $fieldset = $this->getMainFieldset();
144  //$form->getElement('options_fieldset');
145 
146  // prepare element data with values (either from request of from default values)
147  $fieldName = $parameter->getKey();
148  $data = [
149  'name' => $form->addSuffixToName($fieldName, 'parameters'),
150  'label' => __($parameter->getLabel()),
151  'required' => $parameter->getRequired(),
152  'class' => 'widget-option',
153  'note' => __($parameter->getDescription()),
154  ];
155 
156  if ($values = $this->getWidgetValues()) {
157  $data['value'] = isset($values[$fieldName]) ? $values[$fieldName] : '';
158  } else {
159  $data['value'] = $parameter->getValue();
160  }
161 
162  //prepare unique id value
163  if ($fieldName == 'unique_id' && $data['value'] == '') {
164  $data['value'] = hash('sha256', microtime(1));
165  }
166 
167  if (is_array($data['value'])) {
168  foreach ($data['value'] as &$value) {
169  $value = html_entity_decode($value);
170  }
171  } else {
172  $data['value'] = html_entity_decode($data['value']);
173  }
174 
175  // prepare element dropdown values
176  if ($values = $parameter->getValues()) {
177  // dropdown options are specified in configuration
178  $data['values'] = [];
179  foreach ($values as $option) {
180  $data['values'][] = ['label' => __($option['label']), 'value' => $option['value']];
181  }
182  // otherwise, a source model is specified
183  } elseif ($sourceModel = $parameter->getSourceModel()) {
184  $data['values'] = $this->_sourceModelPool->get($sourceModel)->toOptionArray();
185  }
186 
187  // prepare field type or renderer
188  $fieldRenderer = null;
189  $fieldType = $parameter->getType();
190  // hidden element
191  if (!$parameter->getVisible()) {
192  $fieldType = 'hidden';
193  // just an element renderer
194  } elseif ($fieldType && $this->_isClassName($fieldType)) {
195  $fieldRenderer = $this->getLayout()->createBlock($fieldType);
196  $fieldType = $this->_defaultElementType;
197  }
198 
199  // instantiate field and render html
200  $field = $fieldset->addField($this->getMainFieldsetHtmlId() . '_' . $fieldName, $fieldType, $data);
201  if ($fieldRenderer) {
202  $field->setRenderer($fieldRenderer);
203  }
204 
205  // extra html preparations
206  if ($helper = $parameter->getHelperBlock()) {
207  $helperBlock = $this->getLayout()->createBlock(
208  $helper->getType(),
209  '',
210  ['data' => $helper->getData()]
211  );
212  if ($helperBlock instanceof \Magento\Framework\DataObject) {
213  $helperBlock->setConfig(
214  $helper->getData()
215  )->setFieldsetId(
216  $fieldset->getId()
217  )->prepareElementHtml(
218  $field
219  );
220  }
221  }
222 
223  // dependencies from other fields
224  $dependenceBlock = $this->getChildBlock('form_after');
225  $dependenceBlock->addFieldMap($field->getId(), $fieldName);
226  if ($parameter->getDepends()) {
227  foreach ($parameter->getDepends() as $from => $row) {
228  $values = isset($row['values']) ? array_values($row['values']) : (string)$row['value'];
229  $dependenceBlock->addFieldDependence($fieldName, $from, $values);
230  }
231  }
232 
233  return $field;
234  }
235 
242  protected function _isClassName($fieldType)
243  {
244  return preg_match('/[A-Z]/', $fieldType) > 0;
245  }
246 }
__construct(\Magento\Backend\Block\Template\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\Data\FormFactory $formFactory, \Magento\Framework\Option\ArrayPool $sourceModelPool, \Magento\Widget\Model\Widget $widget, array $data=[])
Definition: Options.php:40
$helper
Definition: iframe.phtml:13
elseif(isset( $params[ 'redirect_parent']))
Definition: iframe.phtml:17
setForm(\Magento\Framework\Data\Form $form)
Definition: Form.php:112
$config
Definition: fraud_order.php:17
$values
Definition: options.phtml:88
__()
Definition: __.php:13
$block
Definition: block.php:8
$value
Definition: gender.phtml:16
setData($key, $value=null)
Definition: DataObject.php:72