Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
AttributeMerger.php
Go to the documentation of this file.
1 <?php
7 
9 use Magento\Customer\Helper\Address as AddressHelper;
11 use Magento\Directory\Helper\Data as DirectoryHelper;
12 
14 {
20  protected $formElementMap = [
21  'checkbox' => 'Magento_Ui/js/form/element/select',
22  'select' => 'Magento_Ui/js/form/element/select',
23  'textarea' => 'Magento_Ui/js/form/element/textarea',
24  'multiline' => 'Magento_Ui/js/form/components/group',
25  'multiselect' => 'Magento_Ui/js/form/element/multiselect',
26  'image' => 'Magento_Ui/js/form/element/media',
27  'file' => 'Magento_Ui/js/form/element/media',
28  ];
29 
35  protected $templateMap = [
36  'image' => 'media',
37  'file' => 'media',
38  ];
39 
45  protected $inputValidationMap = [
46  'alpha' => 'validate-alpha',
47  'numeric' => 'validate-number',
48  'alphanumeric' => 'validate-alphanum',
49  'url' => 'validate-url',
50  'email' => 'email2',
51  'length' => 'validate-length',
52  ];
53 
57  private $addressHelper;
58 
62  private $customerSession;
63 
67  private $customerRepository;
68 
72  private $customer;
73 
77  private $directoryHelper;
78 
84  private $topCountryCodes;
85 
92  public function __construct(
93  AddressHelper $addressHelper,
94  Session $customerSession,
95  CustomerRepository $customerRepository,
96  DirectoryHelper $directoryHelper
97  ) {
98  $this->addressHelper = $addressHelper;
99  $this->customerSession = $customerSession;
100  $this->customerRepository = $customerRepository;
101  $this->directoryHelper = $directoryHelper;
102  $this->topCountryCodes = $directoryHelper->getTopCountryCodes();
103  }
104 
114  public function merge($elements, $providerName, $dataScopePrefix, array $fields = [])
115  {
116  foreach ($elements as $attributeCode => $attributeConfig) {
117  $additionalConfig = isset($fields[$attributeCode]) ? $fields[$attributeCode] : [];
118  if (!$this->isFieldVisible($attributeCode, $attributeConfig, $additionalConfig)) {
119  continue;
120  }
122  $attributeCode,
123  $attributeConfig,
124  $additionalConfig,
125  $providerName,
126  $dataScopePrefix
127  );
128  }
129  return $fields;
130  }
131 
144  protected function getFieldConfig(
146  array $attributeConfig,
147  array $additionalConfig,
148  $providerName,
149  $dataScopePrefix
150  ) {
151  // street attribute is unique in terms of configuration, so it has its own configuration builder
152  if (isset($attributeConfig['validation']['input_validation'])) {
153  $validationRule = $attributeConfig['validation']['input_validation'];
154  $attributeConfig['validation'][$this->inputValidationMap[$validationRule]] = true;
155  unset($attributeConfig['validation']['input_validation']);
156  }
157 
158  if ($attributeConfig['formElement'] == 'multiline') {
159  return $this->getMultilineFieldConfig($attributeCode, $attributeConfig, $providerName, $dataScopePrefix);
160  }
161 
162  $uiComponent = isset($this->formElementMap[$attributeConfig['formElement']])
163  ? $this->formElementMap[$attributeConfig['formElement']]
164  : 'Magento_Ui/js/form/element/abstract';
165  $elementTemplate = isset($this->templateMap[$attributeConfig['formElement']])
166  ? 'ui/form/element/' . $this->templateMap[$attributeConfig['formElement']]
167  : 'ui/form/element/' . $attributeConfig['formElement'];
168 
169  $element = [
170  'component' => isset($additionalConfig['component']) ? $additionalConfig['component'] : $uiComponent,
171  'config' => $this->mergeConfigurationNode(
172  'config',
173  $additionalConfig,
174  [
175  'config' => [
176  // customScope is used to group elements within a single
177  // form (e.g. they can be validated separately)
178  'customScope' => $dataScopePrefix,
179  'template' => 'ui/form/field',
180  'elementTmpl' => $elementTemplate,
181  ],
182  ]
183  ),
184  'dataScope' => $dataScopePrefix . '.' . $attributeCode,
185  'label' => $attributeConfig['label'],
186  'provider' => $providerName,
187  'sortOrder' => isset($additionalConfig['sortOrder'])
188  ? $additionalConfig['sortOrder']
189  : $attributeConfig['sortOrder'],
190  'validation' => $this->mergeConfigurationNode('validation', $additionalConfig, $attributeConfig),
191  'options' => $this->getFieldOptions($attributeCode, $attributeConfig),
192  'filterBy' => isset($additionalConfig['filterBy']) ? $additionalConfig['filterBy'] : null,
193  'customEntry' => isset($additionalConfig['customEntry']) ? $additionalConfig['customEntry'] : null,
194  'visible' => isset($additionalConfig['visible']) ? $additionalConfig['visible'] : true,
195  ];
196 
197  if ($attributeCode === 'region_id' || $attributeCode === 'country_id') {
198  unset($element['options']);
199  $element['deps'] = [$providerName];
200  $element['imports'] = [
201  'initialOptions' => 'index = ' . $providerName . ':dictionaries.' . $attributeCode,
202  'setOptions' => 'index = ' . $providerName . ':dictionaries.' . $attributeCode
203  ];
204  }
205 
206  if (isset($attributeConfig['value']) && $attributeConfig['value'] != null) {
207  $element['value'] = $attributeConfig['value'];
208  } elseif (isset($attributeConfig['default']) && $attributeConfig['default'] != null) {
209  $element['value'] = $attributeConfig['default'];
210  } else {
211  $defaultValue = $this->getDefaultValue($attributeCode);
212  if (null !== $defaultValue) {
213  $element['value'] = $defaultValue;
214  }
215  }
216  return $element;
217  }
218 
227  protected function mergeConfigurationNode($nodeName, array $mainSource, array $additionalSource)
228  {
229  $mainData = isset($mainSource[$nodeName]) ? $mainSource[$nodeName] : [];
230  $additionalData = isset($additionalSource[$nodeName]) ? $additionalSource[$nodeName] : [];
231  return array_replace_recursive($additionalData, $mainData);
232  }
233 
242  protected function isFieldVisible($attributeCode, array $attributeConfig, array $additionalConfig = [])
243  {
244  // TODO move this logic to separate model so it can be customized
245  if ($attributeConfig['visible'] == false
246  || (isset($additionalConfig['visible']) && $additionalConfig['visible'] == false)
247  ) {
248  return false;
249  }
250  if ($attributeCode == 'vat_id' && !$this->addressHelper->isVatAttributeVisible()) {
251  return false;
252  }
253  return true;
254  }
255 
265  protected function getMultilineFieldConfig($attributeCode, array $attributeConfig, $providerName, $dataScopePrefix)
266  {
267  $lines = [];
268  unset($attributeConfig['validation']['required-entry']);
269  for ($lineIndex = 0; $lineIndex < (int)$attributeConfig['size']; $lineIndex++) {
270  $isFirstLine = $lineIndex === 0;
271  $line = [
272  'component' => 'Magento_Ui/js/form/element/abstract',
273  'config' => [
274  // customScope is used to group elements within a single form e.g. they can be validated separately
275  'customScope' => $dataScopePrefix,
276  'template' => 'ui/form/field',
277  'elementTmpl' => 'ui/form/element/input'
278  ],
279  'dataScope' => $lineIndex,
280  'provider' => $providerName,
281  'validation' => $isFirstLine
282  ? array_merge(
283  ['required-entry' => (bool)$attributeConfig['required']],
284  $attributeConfig['validation']
285  )
286  : $attributeConfig['validation'],
287  'additionalClasses' => $isFirstLine ? 'field' : 'additional'
288 
289  ];
290  if ($isFirstLine && isset($attributeConfig['default']) && $attributeConfig['default'] != null) {
291  $line['value'] = $attributeConfig['default'];
292  }
293  $lines[] = $line;
294  }
295  return [
296  'component' => 'Magento_Ui/js/form/components/group',
297  'label' => $attributeConfig['label'],
298  'required' => (bool)$attributeConfig['required'],
299  'dataScope' => $dataScopePrefix . '.' . $attributeCode,
300  'provider' => $providerName,
301  'sortOrder' => $attributeConfig['sortOrder'],
302  'type' => 'group',
303  'config' => [
304  'template' => 'ui/group/group',
305  'additionalClasses' => $attributeCode
306  ],
307  'children' => $lines,
308  ];
309  }
310 
315  protected function getDefaultValue($attributeCode)
316  {
317  if ($attributeCode === 'country_id') {
318  return $this->directoryHelper->getDefaultCountry();
319  }
320 
321  $customer = $this->getCustomer();
322  if ($customer === null) {
323  return null;
324  }
325 
326  $attributeValue = null;
327  switch ($attributeCode) {
328  case 'prefix':
329  $attributeValue = $customer->getPrefix();
330  break;
331  case 'firstname':
332  $attributeValue = $customer->getFirstname();
333  break;
334  case 'middlename':
335  $attributeValue = $customer->getMiddlename();
336  break;
337  case 'lastname':
338  $attributeValue = $customer->getLastname();
339  break;
340  case 'suffix':
341  $attributeValue = $customer->getSuffix();
342  break;
343  }
344 
345  return $attributeValue;
346  }
347 
351  protected function getCustomer()
352  {
353  if (!$this->customer) {
354  if ($this->customerSession->isLoggedIn()) {
355  $this->customer = $this->customerRepository->getById($this->customerSession->getCustomerId());
356  } else {
357  return null;
358  }
359  }
360  return $this->customer;
361  }
362 
371  protected function getFieldOptions($attributeCode, array $attributeConfig)
372  {
373  return isset($attributeConfig['options']) ? $attributeConfig['options'] : [];
374  }
375 
383  protected function orderCountryOptions(array $countryOptions)
384  {
385  if (empty($this->topCountryCodes)) {
386  return $countryOptions;
387  }
388 
389  $headOptions = [];
390  $tailOptions = [[
391  'value' => 'delimiter',
392  'label' => '──────────',
393  'disabled' => true,
394  ]];
395  foreach ($countryOptions as $countryOption) {
396  if (empty($countryOption['value']) || in_array($countryOption['value'], $this->topCountryCodes)) {
397  $headOptions[] = $countryOption;
398  } else {
399  $tailOptions[] = $countryOption;
400  }
401  }
402  return array_merge($headOptions, $tailOptions);
403  }
404 }
elseif(isset( $params[ 'redirect_parent']))
Definition: iframe.phtml:17
$fields
Definition: details.phtml:14
__construct(AddressHelper $addressHelper, Session $customerSession, CustomerRepository $customerRepository, DirectoryHelper $directoryHelper)
$customerRepository
merge($elements, $providerName, $dataScopePrefix, array $fields=[])
getFieldOptions($attributeCode, array $attributeConfig)
$attributeCode
Definition: extend.phtml:12
mergeConfigurationNode($nodeName, array $mainSource, array $additionalSource)
getFieldConfig( $attributeCode, array $attributeConfig, array $additionalConfig, $providerName, $dataScopePrefix)
getMultilineFieldConfig($attributeCode, array $attributeConfig, $providerName, $dataScopePrefix)
isFieldVisible($attributeCode, array $attributeConfig, array $additionalConfig=[])
$element
Definition: element.phtml:12