Skip to content

Commit d9c30ca

Browse files
committed
Merge remote-tracking branch 'mainline/develop' into MC-230
2 parents 1086be4 + d4da457 commit d9c30ca

File tree

221 files changed

+4099
-1560
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

221 files changed

+4099
-1560
lines changed

app/code/Magento/PageBuilder/Model/Config/ContentType/Converter.php

Lines changed: 160 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ public function convert($source): array
5050
private function convertTypes(\DOMDocument $source): array
5151
{
5252
$typesData = [];
53+
$parentChildData = [];
5354
/** @var \DOMNodeList $contentTypes */
5455
$contentTypes = $source->getElementsByTagName('type');
5556
/** @var \DOMNode $contentType */
@@ -66,12 +67,16 @@ private function convertTypes(\DOMDocument $source): array
6667
$typesData[$name][$childNode->nodeName] = $this->convertAppearancesData($childNode);
6768
} elseif ('additional_data' === $childNode->nodeName) {
6869
$typesData[$name][$childNode->nodeName] = $this->convertAdditionalData($childNode);
69-
} elseif ('allowed_parents' === $childNode->nodeName) {
70-
$parents = [];
71-
foreach ($childNode->getElementsByTagName('parent') as $parentNode) {
72-
$parents[] = $parentNode->attributes->getNamedItem('name')->nodeValue;
73-
}
74-
$typesData[$name][$childNode->nodeName] = $parents;
70+
} elseif ('parents' === $childNode->nodeName) {
71+
$parentChildData[$name][$childNode->nodeName] = [
72+
'defaultPolicy' => $this->getAttributeValue($childNode, 'default_policy'),
73+
'types' => $this->convertParentChildData($childNode, 'parent')
74+
];
75+
} elseif ('children' === $childNode->nodeName) {
76+
$parentChildData[$name][$childNode->nodeName] = [
77+
'defaultPolicy' => $this->getAttributeValue($childNode, 'default_policy'),
78+
'types' => $this->convertParentChildData($childNode, 'child')
79+
];
7580
} else {
7681
$typesData[$name][$childNode->nodeName] = $childNode->nodeValue;
7782
}
@@ -83,7 +88,9 @@ private function convertTypes(\DOMDocument $source): array
8388
return (int)$firstElement['sortOrder'] <=> (int)$secondElement['sortOrder'];
8489
});
8590

86-
return $typesData;
91+
$allowedParents = $this->convertParentChildDataToAllowedParents(array_keys($typesData), $parentChildData);
92+
93+
return array_merge_recursive($typesData, $allowedParents);
8794
}
8895

8996
/**
@@ -203,10 +210,7 @@ private function convertDataMapping(\DOMElement $childNode): array
203210
$elementData = [];
204211
foreach ($childNode->getElementsByTagName('element') as $elementNode) {
205212
$elementName = $elementNode->attributes->getNamedItem('name')->nodeValue;
206-
$elementPath = ($elementNode->attributes->getNamedItem('path')
207-
? $elementNode->attributes->getNamedItem('path')->nodeValue : '');
208213
$elementData[$elementName] = [
209-
'path' => $elementPath,
210214
'style' => $this->convertProperties($elementNode),
211215
'attributes' => $this->convertAttributes($elementNode),
212216
'html' => $this->convertHtml($elementNode),
@@ -267,7 +271,7 @@ private function convertProperties(\DOMElement $elementNode): array
267271
if ($propertiesNode) {
268272
foreach ($propertiesNode->getElementsByTagName('property') as $propertyNode) {
269273
$propertiesData[] = [
270-
'var' => $this->getAttributeValue($propertyNode, 'name'),
274+
'var' => $this->extractVariableName($propertyNode),
271275
'name' => $this->getAttributeValue($propertyNode, 'source'),
272276
'converter' => $this->getAttributeValue($propertyNode, 'converter'),
273277
'preview_converter' => $this->getAttributeValue($propertyNode, 'preview_converter'),
@@ -277,7 +281,7 @@ private function convertProperties(\DOMElement $elementNode): array
277281
}
278282
foreach ($propertiesNode->getElementsByTagName('complex_property') as $propertyNode) {
279283
$propertiesData[] = [
280-
'var' => $this->getAttributeValue($propertyNode, 'name'),
284+
'var' => $this->extractVariableName($propertyNode),
281285
'reader' => $this->getAttributeValue($propertyNode, 'reader'),
282286
'converter' => $this->getAttributeValue($propertyNode, 'converter'),
283287
'preview_converter' => $this->getAttributeValue($propertyNode, 'preview_converter'),
@@ -309,7 +313,7 @@ private function convertAttributes(\DOMElement $elementNode): array
309313
if ($attributesNode) {
310314
foreach ($attributesNode->getElementsByTagName('attribute') as $attributeNode) {
311315
$attributesData[] = [
312-
'var' => $this->getAttributeValue($attributeNode, 'name'),
316+
'var' => $this->extractVariableName($attributeNode),
313317
'name' => $this->getAttributeValue($attributeNode, 'source'),
314318
'converter' => $this->getAttributeValue($attributeNode, 'converter'),
315319
'preview_converter' => $this->getAttributeValue($attributeNode, 'preview_converter'),
@@ -326,7 +330,7 @@ private function convertAttributes(\DOMElement $elementNode): array
326330
}
327331
foreach ($attributesNode->getElementsByTagName('complex_attribute') as $attributeNode) {
328332
$attributesData[] = [
329-
'var' => $this->getAttributeValue($attributeNode, 'name'),
333+
'var' => $this->extractVariableName($attributeNode),
330334
'reader' => $this->getAttributeValue($attributeNode, 'reader'),
331335
'converter' => $this->getAttributeValue($attributeNode, 'converter'),
332336
'preview_converter' => $this->getAttributeValue($attributeNode, 'preview_converter'),
@@ -431,6 +435,120 @@ private function convertConvertersData(\DOMElement $childNode): array
431435
return $converters;
432436
}
433437

438+
/**
439+
* Convert parent and child data to correct format
440+
*
441+
* @param \DOMElement $elementNode
442+
* @param string $tagName
443+
* @return array
444+
*/
445+
private function convertParentChildData(\DOMElement $elementNode, string $tagName): array
446+
{
447+
$data = [];
448+
foreach ($elementNode->getElementsByTagName($tagName) as $node) {
449+
$name = $node->attributes->getNamedItem('name')->nodeValue;
450+
$data[$node->attributes->getNamedItem('policy')->nodeValue][] = $name;
451+
}
452+
return $data;
453+
}
454+
455+
/**
456+
* Convert parent and child data to allowed parents
457+
*
458+
* @param array $types
459+
* @param array $parentChildData
460+
* @return array
461+
*/
462+
private function convertParentChildDataToAllowedParents(array $types, array $parentChildData): array
463+
{
464+
$allowedParentsData = [];
465+
466+
// convert children
467+
$allowedParents = $this->convertChildrenToAllowedParents($parentChildData, $types);
468+
foreach ($types as $type) {
469+
$allowedParentsData[$type]['allowed_parents'] = $allowedParents[$type];
470+
}
471+
472+
// convert parents
473+
$allowedParentsData = $this->convertParentsToAllowedParents($parentChildData, $types, $allowedParentsData);
474+
475+
return $allowedParentsData;
476+
}
477+
478+
/**
479+
* Convert children data to allow parents
480+
*
481+
* @param array $parentChildData
482+
* @param array $types
483+
* @return array
484+
*/
485+
private function convertChildrenToAllowedParents(array $parentChildData, array $types): array
486+
{
487+
$allowedParents = [];
488+
489+
// setup allowed parents array
490+
foreach ($types as $type) {
491+
$allowedParents[$type] = [];
492+
}
493+
494+
foreach ($parentChildData as $key => $value) {
495+
$children = $value['children'] ?? [];
496+
497+
if (empty($children)) {
498+
continue;
499+
}
500+
501+
foreach ($allowedParents as $type => $parents) {
502+
$typeAllowed = in_array($type, $children['types']['allow'] ?? []);
503+
$typeDenied = in_array($type, $children['types']['deny'] ?? []);
504+
if (($children['defaultPolicy'] === 'deny' && !$typeAllowed) || $typeDenied) {
505+
$allowedParents[$type] = $this->removeDataInArray($key, $parents);
506+
} else {
507+
$allowedParents[$type][] = $key;
508+
}
509+
}
510+
}
511+
512+
return $allowedParents;
513+
}
514+
515+
/**
516+
* Convert parents data to allowed parents
517+
*
518+
* @param array $parentChildData
519+
* @param array $types
520+
* @param array $allowedParentsData
521+
* @return array
522+
*/
523+
private function convertParentsToAllowedParents(
524+
array $parentChildData,
525+
array $types,
526+
array $allowedParentsData
527+
): array {
528+
foreach ($parentChildData as $key => $value) {
529+
$parent = $value['parents'] ?? [];
530+
531+
if (empty($parent)) {
532+
continue;
533+
}
534+
535+
$allowedTypes = $parent['types']['allow'] ?? [];
536+
$deniedTypes = $parent['types']['deny'] ?? [];
537+
538+
if ($parent['defaultPolicy'] === 'deny') {
539+
$allowedParents = $allowedTypes;
540+
} else {
541+
$allowedParents = array_merge($types, $allowedTypes);
542+
foreach ($deniedTypes as $type) {
543+
$allowedParents = $this->removeDataInArray($type, $allowedParents);
544+
}
545+
}
546+
$allowedParentsData[$key]['allowed_parents'] = $allowedParents;
547+
}
548+
549+
return $allowedParentsData;
550+
}
551+
434552
/**
435553
* Check if node is configuration node
436554
*
@@ -458,4 +576,32 @@ private function getAttributeValue(\DOMElement $attributeNode, $attributeName)
458576
? $attributeNode->attributes->getNamedItem($attributeName)->nodeValue
459577
: null;
460578
}
579+
580+
/**
581+
* Extract variable name from property and attribute nodes
582+
*
583+
* @param \DOMElement $node
584+
* @return string
585+
*/
586+
private function extractVariableName(\DOMElement $node): string
587+
{
588+
return $this->getAttributeValue($node, 'storage_key')
589+
?: $this->getAttributeValue($node, 'name');
590+
}
591+
592+
/**
593+
* Remove data from array
594+
*
595+
* @param $searchValue
596+
* @param $data
597+
* @return array
598+
*/
599+
private function removeDataInArray(string $searchValue, array $data): array
600+
{
601+
$removeKey = array_search($searchValue, $data);
602+
if ($removeKey !== false) {
603+
unset($data[$removeKey]);
604+
}
605+
return array_values($data);
606+
}
461607
}

app/code/Magento/PageBuilder/Model/Config/ContentType/Reader.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ class Reader extends \Magento\Framework\Config\Reader\Filesystem
1919
*/
2020
protected $_idAttributes = [
2121
self::TYPE_PATH => 'name',
22-
self::TYPE_PATH . '/allowed_parents/parent' => 'name',
22+
self::TYPE_PATH . '/parents/parent' => 'name',
23+
self::TYPE_PATH . '/children/child' => 'name',
2324
self::TYPE_PATH . '/appearances/appearance' => 'name',
2425
self::TYPE_PATH . '/appearances/appearance/data' => 'name',
2526
self::TYPE_PATH . '/appearances/appearance/data_mapping/elements/element' => 'name',

app/code/Magento/PageBuilder/Setup/DataConverter/Renderer/Accordion.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ public function render(array $itemData, array $additionalData = []) : string
6060
$eavData = $this->eavAttributeLoader->load($itemData['entityId']);
6161

6262
$rootElementAttributes = [
63+
'data-element' => 'main',
6364
'data-role' => 'accordion',
6465
'data-appearance' => 'default',
6566
'data-mage-init' => $this->getMageInitValue($itemData),

app/code/Magento/PageBuilder/Setup/DataConverter/Renderer/AdvancedSlider.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ public function render(array $itemData, array $additionalData = []) : string
5151
$cssClasses .= isset($eavData['css_classes']) ? ' pagebuilder-slider' : 'pagebuilder-slider';
5252

5353
$rootElementAttributes = [
54+
'data-element' => 'main',
5455
'data-role' => 'slider',
5556
'data-appearance' => 'default',
5657
'data-autoplay' => isset($eavData['autoplay']) ? $eavData['autoplay'] : '',

app/code/Magento/PageBuilder/Setup/DataConverter/Renderer/AdvancedSliderItem.php

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ public function render(array $itemData, array $additionalData = []) : string
4848
$eavData = $this->eavAttributeLoader->load($itemData['entityId']);
4949

5050
$rootElementAttributes = [
51+
'data-element' => 'main',
5152
'data-role' => 'slide',
5253
'data-appearance' => 'poster',
5354
'class' => $eavData['css_classes'] ?? ''
@@ -67,16 +68,17 @@ public function render(array $itemData, array $additionalData = []) : string
6768
}
6869

6970
$wrapperDivElementAttributes = [
71+
'data-element' => 'mobile_image',
7072
'class' => 'pagebuilder-slide-wrapper pagebuilder-mobile-only'
7173
];
7274
$style = $this->styleExtractor->extractStyle($formData);
7375
if ($style) {
7476
$wrapperDivElementAttributes['style'] = $style;
7577
}
7678

79+
$overlayDivElementAttributes['data-element'] = 'overlay';
7780
$overlayDivElementAttributes['class'] = 'pagebuilder-overlay pagebuilder-poster-overlay';
7881
$style = $this->styleExtractor->extractStyle($formData, ['padding']);
79-
8082
$overlayColor = 'transparent';
8183
if (isset($eavData['has_overlay']) && $eavData['has_overlay'] == 1) {
8284
$overlayColor = 'rgba(0,0,0,0.5)';
@@ -93,40 +95,42 @@ public function render(array $itemData, array $additionalData = []) : string
9395
$buttonElementHtml = '';
9496
// Advanced slider item only requires link text, slider item requires both
9597
if (isset($eavData['link_text']) || (isset($eavData['link_url']) && isset($eavData['title_tag']))) {
96-
$buttonElementHtml = '<button type="button" class="pagebuilder-slide-button pagebuilder-button-primary" ';
98+
$buttonElementHtml = '<button data-element="button" ';
99+
$buttonElementHtml .= 'type="button" class="pagebuilder-slide-button pagebuilder-button-primary" ';
97100
$buttonElementHtml .= 'style="opacity: 1; visibility: visible;">';
98101
$buttonElementHtml .= ($eavData['link_text'] ?? $eavData['title_tag'] ?? '');
99102
$buttonElementHtml .= '</button>';
100103
}
101104

102105
// mobile wrapper div
103-
$rootElementHtml = '<div' . $this->printAttributes($rootElementAttributes);
104-
$rootElementHtml .= '><a';
106+
$rootElementHtml = '<div' . $this->printAttributes($rootElementAttributes) . '><a data-element="link"';
105107
$rootElementHtml .= isset($eavData['link_url']) ? ' href="' . $eavData['link_url'] . '">' : '>';
106108
$rootElementHtml .= '<div'
107109
. $this->printAttributes($wrapperDivElementAttributes)
108110
. '><div'
109111
. $this->printAttributes($overlayDivElementAttributes)
110112
. '><div class="pagebuilder-poster-content">'
113+
. '<div data-element="content">'
111114
. '<h3>'
112115
. ($eavData['title'] ?? $eavData['title_tag'] ?? '')
113116
. '</h3>'
114-
. '<div>' . ($eavData['textarea'] ?? '') . '</div>'
117+
. '<div>' . ($eavData['textarea'] ?? '') . '</div></div>'
115118
. $buttonElementHtml
116119
. '</div></div></div>';
117120

118121
// non-mobile wrapper div
122+
$wrapperDivElementAttributes['data-element'] = 'desktop_image';
119123
$wrapperDivElementAttributes['class'] = 'pagebuilder-slide-wrapper ' .
120124
'pagebuilder-mobile-hidden';
121125
$rootElementHtml .= '<div'
122126
. $this->printAttributes($wrapperDivElementAttributes)
123127
. '><div'
124128
. $this->printAttributes($overlayDivElementAttributes)
125129
. '><div class="pagebuilder-poster-content">'
126-
. '<h3>'
130+
. '<div data-element="content"><h3>'
127131
. ($eavData['title'] ?? $eavData['title_tag'] ?? '')
128132
. '</h3>'
129-
. '<div>' . ($eavData['textarea'] ?? '') . '</div>'
133+
. '<div>' . ($eavData['textarea'] ?? '') . '</div></div>'
130134
. $buttonElementHtml
131135
. '</div></div></div>';
132136

app/code/Magento/PageBuilder/Setup/DataConverter/Renderer/Anchor.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ public function render(array $itemData, array $additionalData = []) : string
4545
$eavData = $this->eavAttributeLoader->load($itemData['entityId']);
4646

4747
$rootElementAttributes = [
48+
'data-element' => 'main',
4849
'data-role' => 'anchor',
4950
'data-appearance' => 'default',
5051
'class' => $eavData['css_classes'] ?? '',

app/code/Magento/PageBuilder/Setup/DataConverter/Renderer/Block.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ public function render(array $itemData, array $additionalData = []) : string
7676
}
7777

7878
$rootElementAttributes = [
79+
'data-element' => 'main',
7980
'data-role' => 'block',
8081
'data-appearance' => 'default',
8182
'class' => $itemData['formData']['css_classes'] ?? ''

app/code/Magento/PageBuilder/Setup/DataConverter/Renderer/ButtonItem.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ public function render(array $itemData, array $additionalData = []) : string
4747
$cssClasses = $eavData['css_classes'] ?? '';
4848

4949
$rootElementAttributes = [
50+
'data-element' => 'main',
5051
'data-role' => 'button-item',
5152
'data-appearance' => 'default',
5253
'style' => 'display: inline-block;',
@@ -66,10 +67,10 @@ public function render(array $itemData, array $additionalData = []) : string
6667
$rootElementHtml .= $attributeValue ? " $attributeName=\"$attributeValue\"" : '';
6768
}
6869

69-
$rootElementHtml .= '><a href="'
70+
$rootElementHtml .= '><a data-element="link" href="'
7071
. ($eavData['link_url'] ?? '') . '"'
7172
. $buttonStyleAttribute
72-
. ' class="pagebuilder-button-primary"><span>'
73+
. ' class="pagebuilder-button-primary"><span data-element="link_text">'
7374
. ($eavData['link_text'] ?? '')
7475
. '</span></a></div>';
7576

app/code/Magento/PageBuilder/Setup/DataConverter/Renderer/Buttons.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ public function render(array $itemData, array $additionalData = []) : string
4545
$eavData = $this->eavAttributeLoader->load($itemData['entityId']);
4646

4747
$rootElementAttributes = [
48+
'data-element' => 'main',
4849
'data-role' => 'buttons',
4950
'data-appearance' => 'inline',
5051
'class' => $eavData['css_classes'] ?? '',

app/code/Magento/PageBuilder/Setup/DataConverter/Renderer/Code.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public function render(array $itemData, array $additionalData = []) : string
5454
}
5555
}
5656

57-
$rootElementHtml = '<div data-role="html" data-appearance="default"><pre';
57+
$rootElementHtml = '<div data-element="main" data-role="html" data-appearance="default"><pre';
5858
foreach ($preElementAttributes as $attributeName => $attributeValue) {
5959
$rootElementHtml .= $attributeValue ? " $attributeName=\"$attributeValue\"" : '';
6060
}

0 commit comments

Comments
 (0)