Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
Public Member Functions | Protected Member Functions | Protected Attributes
AttributeMerger Class Reference

Public Member Functions

 __construct (AddressHelper $addressHelper, Session $customerSession, CustomerRepository $customerRepository, DirectoryHelper $directoryHelper)
 
 merge ($elements, $providerName, $dataScopePrefix, array $fields=[])
 

Protected Member Functions

 getFieldConfig ( $attributeCode, array $attributeConfig, array $additionalConfig, $providerName, $dataScopePrefix)
 
 mergeConfigurationNode ($nodeName, array $mainSource, array $additionalSource)
 
 isFieldVisible ($attributeCode, array $attributeConfig, array $additionalConfig=[])
 
 getMultilineFieldConfig ($attributeCode, array $attributeConfig, $providerName, $dataScopePrefix)
 
 getDefaultValue ($attributeCode)
 
 getCustomer ()
 
 getFieldOptions ($attributeCode, array $attributeConfig)
 
 orderCountryOptions (array $countryOptions)
 

Protected Attributes

 $formElementMap
 
 $templateMap
 
 $inputValidationMap
 

Detailed Description

Definition at line 13 of file AttributeMerger.php.

Constructor & Destructor Documentation

◆ __construct()

__construct ( AddressHelper  $addressHelper,
Session  $customerSession,
CustomerRepository  $customerRepository,
DirectoryHelper  $directoryHelper 
)
Parameters
AddressHelper$addressHelper
Session$customerSession
CustomerRepository$customerRepository
DirectoryHelper$directoryHelper

Definition at line 92 of file AttributeMerger.php.

97  {
98  $this->addressHelper = $addressHelper;
99  $this->customerSession = $customerSession;
100  $this->customerRepository = $customerRepository;
101  $this->directoryHelper = $directoryHelper;
102  $this->topCountryCodes = $directoryHelper->getTopCountryCodes();
103  }

Member Function Documentation

◆ getCustomer()

getCustomer ( )
protected
Returns
\Magento\Customer\Api\Data\CustomerInterface|null

Definition at line 351 of file AttributeMerger.php.

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  }

◆ getDefaultValue()

getDefaultValue (   $attributeCode)
protected
Parameters
string$attributeCode
Returns
null|string

Definition at line 315 of file AttributeMerger.php.

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  }
$attributeCode
Definition: extend.phtml:12

◆ getFieldConfig()

getFieldConfig (   $attributeCode,
array  $attributeConfig,
array  $additionalConfig,
  $providerName,
  $dataScopePrefix 
)
protected

Retrieve UI field configuration for given attribute

Parameters
string$attributeCode
array$attributeConfig
array$additionalConfigfield configuration provided via layout XML
string$providerNamename of the storage container used by UI component
string$dataScopePrefix
Returns
array @SuppressWarnings(PHPMD.CyclomaticComplexity) @SuppressWarnings(PHPMD.NPathComplexity)

Definition at line 144 of file AttributeMerger.php.

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  }
elseif(isset( $params[ 'redirect_parent']))
Definition: iframe.phtml:17
getFieldOptions($attributeCode, array $attributeConfig)
$attributeCode
Definition: extend.phtml:12
mergeConfigurationNode($nodeName, array $mainSource, array $additionalSource)
getMultilineFieldConfig($attributeCode, array $attributeConfig, $providerName, $dataScopePrefix)
$element
Definition: element.phtml:12

◆ getFieldOptions()

getFieldOptions (   $attributeCode,
array  $attributeConfig 
)
protected

Retrieve field options from attribute configuration

Parameters
string$attributeCode
array$attributeConfig
Returns
array @SuppressWarnings(PHPMD.UnusedFormalParameter)

Definition at line 371 of file AttributeMerger.php.

372  {
373  return isset($attributeConfig['options']) ? $attributeConfig['options'] : [];
374  }

◆ getMultilineFieldConfig()

getMultilineFieldConfig (   $attributeCode,
array  $attributeConfig,
  $providerName,
  $dataScopePrefix 
)
protected

Retrieve field configuration for street address attribute

Parameters
string$attributeCode
array$attributeConfig
string$providerNamename of the storage container used by UI component
string$dataScopePrefix
Returns
array

Definition at line 265 of file AttributeMerger.php.

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  }
$attributeCode
Definition: extend.phtml:12

◆ isFieldVisible()

isFieldVisible (   $attributeCode,
array  $attributeConfig,
array  $additionalConfig = [] 
)
protected

Check if address attribute is visible on frontend

Parameters
string$attributeCode
array$attributeConfig
array$additionalConfigfield configuration provided via layout XML
Returns
bool

Definition at line 242 of file AttributeMerger.php.

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  }
$attributeCode
Definition: extend.phtml:12

◆ merge()

merge (   $elements,
  $providerName,
  $dataScopePrefix,
array  $fields = [] 
)

Merge additional address fields for given provider

Parameters
array$elements
string$providerNamename of the storage container used by UI component
string$dataScopePrefix
array$fields
Returns
array

Definition at line 114 of file AttributeMerger.php.

115  {
116  foreach ($elements as $attributeCode => $attributeConfig) {
117  $additionalConfig = isset($fields[$attributeCode]) ? $fields[$attributeCode] : [];
118  if (!$this->isFieldVisible($attributeCode, $attributeConfig, $additionalConfig)) {
119  continue;
120  }
123  $attributeConfig,
124  $additionalConfig,
125  $providerName,
126  $dataScopePrefix
127  );
128  }
129  return $fields;
130  }
$fields
Definition: details.phtml:14
$attributeCode
Definition: extend.phtml:12
getFieldConfig( $attributeCode, array $attributeConfig, array $additionalConfig, $providerName, $dataScopePrefix)
isFieldVisible($attributeCode, array $attributeConfig, array $additionalConfig=[])

◆ mergeConfigurationNode()

mergeConfigurationNode (   $nodeName,
array  $mainSource,
array  $additionalSource 
)
protected

Merge two configuration nodes recursively

Parameters
string$nodeName
array$mainSource
array$additionalSource
Returns
array

Definition at line 227 of file AttributeMerger.php.

228  {
229  $mainData = isset($mainSource[$nodeName]) ? $mainSource[$nodeName] : [];
230  $additionalData = isset($additionalSource[$nodeName]) ? $additionalSource[$nodeName] : [];
231  return array_replace_recursive($additionalData, $mainData);
232  }

◆ orderCountryOptions()

orderCountryOptions ( array  $countryOptions)
protected

Order country options. Move top countries to the beginning of the list.

Parameters
array$countryOptions
Returns
array
Deprecated:
100.1.7

Definition at line 383 of file AttributeMerger.php.

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  }

Field Documentation

◆ $formElementMap

$formElementMap
protected
Initial value:
= [
'checkbox' => 'Magento_Ui/js/form/element/select',
'select' => 'Magento_Ui/js/form/element/select',
'textarea' => 'Magento_Ui/js/form/element/textarea',
'multiline' => 'Magento_Ui/js/form/components/group',
'multiselect' => 'Magento_Ui/js/form/element/multiselect',
'image' => 'Magento_Ui/js/form/element/media',
'file' => 'Magento_Ui/js/form/element/media',
]

Definition at line 20 of file AttributeMerger.php.

◆ $inputValidationMap

$inputValidationMap
protected
Initial value:
= [
'alpha' => 'validate-alpha',
'numeric' => 'validate-number',
'alphanumeric' => 'validate-alphanum',
'url' => 'validate-url',
'email' => 'email2',
'length' => 'validate-length',
]

Definition at line 45 of file AttributeMerger.php.

◆ $templateMap

$templateMap
protected
Initial value:
= [
'image' => 'media',
'file' => 'media',
]

Definition at line 35 of file AttributeMerger.php.


The documentation for this class was generated from the following file: