Skip to content

Commit e5a65fb

Browse files
committed
Merge branch 'MC-1438' of github.com:magento-trigger/magento2-page-builder into MC-1438
2 parents cc9df4f + 3bc6390 commit e5a65fb

File tree

74 files changed

+1306
-463
lines changed

Some content is hidden

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

74 files changed

+1306
-463
lines changed

app/code/Magento/PageBuilder/Block/WidgetInitializer.php

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,26 @@ class WidgetInitializer extends Template
2222
*/
2323
private $jsonSerializer;
2424

25+
/**
26+
* @var \Magento\PageBuilder\Model\WidgetInitializerConfig
27+
*/
28+
private $config;
29+
2530
/**
2631
* WidgetInitializer constructor.
2732
* @param Template\Context $context
2833
* @param \Magento\Framework\Serialize\Serializer\Json $jsonEncoder
34+
* @param \Magento\PageBuilder\Model\WidgetInitializerConfig $config
2935
* @param array $data
3036
*/
3137
public function __construct(
3238
\Magento\Framework\View\Element\Template\Context $context,
3339
\Magento\Framework\Serialize\Serializer\Json $jsonEncoder,
40+
\Magento\PageBuilder\Model\WidgetInitializerConfig $config,
3441
array $data = []
3542
) {
3643
$this->jsonSerializer = $jsonEncoder;
44+
$this->config = $config;
3745
parent::__construct($context, $data);
3846
}
3947

@@ -44,21 +52,6 @@ public function __construct(
4452
*/
4553
public function getConfig() : string
4654
{
47-
$widgetsConfig = $this->getData('config');
48-
$resultConfig = [];
49-
foreach ($widgetsConfig as $contentTypeName => $config) {
50-
$selector = sprintf('div[data-role="%s"]', $contentTypeName);
51-
foreach ($config as $item) {
52-
if (!isset($item['component'])) {
53-
continue;
54-
}
55-
if (isset($item['appearance'])) {
56-
$selector .= sprintf('[data-appearance="%s"]', $item['appearance']);
57-
}
58-
$componentConfig = isset($item['config']) ? $item['config'] : '{}';
59-
$resultConfig[$selector] = [$item['component'] => $componentConfig];
60-
}
61-
}
62-
return $this->jsonSerializer->serialize($resultConfig);
55+
return $this->jsonSerializer->serialize($this->config->getConfig());
6356
}
6457
}

app/code/Magento/PageBuilder/Model/Stage/Config.php

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,11 @@ class Config
6868
*/
6969
private $inlineEditingChecker;
7070

71+
/**
72+
* @var \Magento\PageBuilder\Model\WidgetInitializerConfig
73+
*/
74+
private $widgetInitializerConfig;
75+
7176
/**
7277
* Config constructor.
7378
* @param \Magento\PageBuilder\Model\ConfigInterface $config
@@ -78,6 +83,7 @@ class Config
7883
* @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
7984
* @param \Magento\Ui\Block\Wysiwyg\ActiveEditor $activeEditor
8085
* @param \Magento\PageBuilder\Model\Wysiwyg\InlineEditingSupportedAdapterList $inlineEditingChecker
86+
* @param \Magento\PageBuilder\Model\WidgetInitializerConfig $widgetInitializerConfig
8187
* @param array $data
8288
*/
8389
public function __construct(
@@ -89,6 +95,7 @@ public function __construct(
8995
\Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
9096
\Magento\Ui\Block\Wysiwyg\ActiveEditor $activeEditor,
9197
\Magento\PageBuilder\Model\Wysiwyg\InlineEditingSupportedAdapterList $inlineEditingChecker,
98+
\Magento\PageBuilder\Model\WidgetInitializerConfig $widgetInitializerConfig,
9299
array $data = []
93100
) {
94101
$this->config = $config;
@@ -99,6 +106,7 @@ public function __construct(
99106
$this->scopeConfig = $scopeConfig;
100107
$this->activeEditor = $activeEditor;
101108
$this->inlineEditingChecker = $inlineEditingChecker;
109+
$this->widgetInitializerConfig = $widgetInitializerConfig;
102110
$this->data = $data;
103111
}
104112

@@ -117,7 +125,8 @@ public function getConfig()
117125
'preview_url' => $this->frontendUrlBuilder->getUrl('pagebuilder/contenttype/preview'),
118126
'column_grid_default' => $this->scopeConfig->getValue(self::XML_PATH_COLUMN_GRID_DEFAULT),
119127
'column_grid_max' => $this->scopeConfig->getValue(self::XML_PATH_COLUMN_GRID_MAX),
120-
'can_use_inline_editing_on_stage' => $this->isWysiwygProvisionedForEditingOnStage()
128+
'can_use_inline_editing_on_stage' => $this->isWysiwygProvisionedForEditingOnStage(),
129+
'widgets' => $this->widgetInitializerConfig->getConfig(),
121130
];
122131
}
123132

app/code/Magento/PageBuilder/Model/Stage/Renderer/CmsStaticBlock.php

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
namespace Magento\PageBuilder\Model\Stage\Renderer;
1010

11+
use Psr\Log\LoggerInterface;
12+
1113
/**
1214
* Renders a CMS Block for the stage
1315
*
@@ -26,18 +28,25 @@ class CmsStaticBlock implements \Magento\PageBuilder\Model\Stage\RendererInterfa
2628
private $widgetDirectiveRenderer;
2729

2830
/**
29-
* Constructor
31+
* @var LoggerInterface
32+
*/
33+
private $loggerInterface;
34+
35+
/**
36+
* CmsStaticBlock constructor.
3037
*
31-
* @param WidgetDirective $widgetDirectiveRenderer
3238
* @param \Magento\Cms\Model\ResourceModel\Block\CollectionFactory $blockCollectionFactory
39+
* @param WidgetDirective $widgetDirectiveRenderer
40+
* @param LoggerInterface $loggerInterface
3341
*/
3442
public function __construct(
43+
\Magento\Cms\Model\ResourceModel\Block\CollectionFactory $blockCollectionFactory,
3544
WidgetDirective $widgetDirectiveRenderer,
36-
\Magento\Cms\Model\ResourceModel\Block\CollectionFactory $blockCollectionFactory
45+
LoggerInterface $loggerInterface
3746
) {
38-
3947
$this->blockCollectionFactory = $blockCollectionFactory;
4048
$this->widgetDirectiveRenderer = $widgetDirectiveRenderer;
49+
$this->loggerInterface = $loggerInterface;
4150
}
4251

4352
/**
@@ -55,7 +64,7 @@ public function render(array $params): array
5564
];
5665

5766
// Short-circuit if needed fields aren't present
58-
if (empty($params['directive']) || empty($params['block_id'])) {
67+
if (empty($params['directive']) && empty($params['block_id'])) {
5968
return $result;
6069
}
6170

@@ -79,12 +88,34 @@ public function render(array $params): array
7988

8089
if ($block->isActive()) {
8190
$directiveResult = $this->widgetDirectiveRenderer->render($params);
82-
$result['content'] = $directiveResult['content'];
83-
$result['error'] = $directiveResult['error'];
91+
$result['content'] = $this->removeScriptTags($directiveResult['content']);
8492
} else {
8593
$result['error'] = __('Block disabled');
8694
}
8795

8896
return $result;
8997
}
98+
99+
/**
100+
* Remove script tag from html
101+
*
102+
* @param string $content
103+
* @return string
104+
*/
105+
private function removeScriptTags(string $content): string
106+
{
107+
$dom = new \DOMDocument();
108+
try {
109+
//this code is required because of https://bugs.php.net/bug.php?id=60021
110+
$previous = libxml_use_internal_errors(true);
111+
$dom->loadHTML($content);
112+
} catch (\Exception $e) {
113+
$this->loggerInterface->critical($e->getMessage());
114+
}
115+
libxml_use_internal_errors($previous);
116+
foreach (iterator_to_array($dom->getElementsByTagName('script')) as $item) {
117+
$item->parentNode->removeChild($item);
118+
}
119+
return $dom->saveHTML();
120+
}
90121
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
declare(strict_types=1);
8+
9+
namespace Magento\PageBuilder\Model;
10+
11+
/**
12+
* Container for the configuration related to the widget initializer mechanism
13+
*/
14+
class WidgetInitializerConfig
15+
{
16+
/**
17+
* @var array The provided configuration
18+
*/
19+
private $config;
20+
21+
/**
22+
* @param array $config
23+
*/
24+
public function __construct(array $config)
25+
{
26+
$this->config = $config;
27+
}
28+
29+
/**
30+
* Retrieves the component-ready configuration for the widget initializer
31+
* @return array
32+
*/
33+
public function getConfig(): array
34+
{
35+
$resultConfig = [];
36+
foreach ($this->config as $contentTypeName => $config) {
37+
$selector = sprintf('div[data-role="%s"]', $contentTypeName);
38+
foreach ($config as $item) {
39+
if (!isset($item['component'])) {
40+
continue;
41+
}
42+
if (isset($item['appearance'])) {
43+
$selector .= sprintf('[data-appearance="%s"]', $item['appearance']);
44+
}
45+
$componentConfig = isset($item['config']) ? $item['config'] : '{}';
46+
$resultConfig[$selector] = [$item['component'] => $componentConfig];
47+
}
48+
}
49+
return $resultConfig;
50+
}
51+
}

app/code/Magento/PageBuilder/Test/Mftf/ActionGroup/OptionsMenuActionGroup.xml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,19 @@
4242
<see userInput="Edit {{contentType.name}}" selector="{{EditPanelForm.editFormTitle}}" stepKey="seeContentTypeNameInEditFormTitle"/>
4343
<waitForPageLoad stepKey="waitForAnimation2" time="30"/>
4444
</actionGroup>
45+
<actionGroup name="openOptionsMenu">
46+
<arguments>
47+
<argument name="contentType"/>
48+
<argument name="contentTypeIndex" defaultValue="1" type="string"/>
49+
<argument name="contentTypeXCoordinate" defaultValue="null" type="string"/>
50+
<argument name="contentTypeYCoordinate" defaultValue="null" type="string"/>
51+
</arguments>
52+
<waitForElementVisible time="20" selector="{{PageBuilderStage.contentTypeInStageByIndex(contentType.role, contentTypeIndex)}}" stepKey="waitForContentTypeInStageVisible"/>
53+
<moveMouseOver selector="{{PageBuilderStage.contentTypeInStageByIndex(contentType.role, contentTypeIndex)}}" x="{{contentTypeXCoordinate}}" y="{{contentTypeYCoordinate}}" stepKey="onMouseOverContentTypeStage"/>
54+
<waitForPageLoad stepKey="waitForPageLoad"/>
55+
<waitForElementVisible time="10" selector="{{PageBuilderContentTypeOptionsMenu.contentTypeOptionsMenuByIndex(contentType.role, contentTypeIndex)}}" stepKey="waitForOptions"/>
56+
<waitForElementVisible selector="{{PageBuilderContentTypeOptionsMenu.contentTypeEditByIndex(contentType.role, contentTypeIndex)}}" stepKey="waitForEditButton"/>
57+
</actionGroup>
4558
<actionGroup name="openPageBuilderEditPanelSmallByIndex">
4659
<arguments>
4760
<argument name="section"/>

app/code/Magento/PageBuilder/Test/Mftf/Section/PageBuilderBlockSection.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
<element name="noCssClasses" type="text" selector="(//div[contains(@class,'pagebuilder-block')])[{{arg1}}]//div[not(@class)]" parameterized="true"/>
2929
<element name="margins" type="text" selector="(//div[contains(@class,'pagebuilder-block')])[{{arg1}}]//div[contains(@style,'margin: {{arg2}}px;')]" parameterized="true"/>
3030
<element name="padding" type="text" selector="(//div[contains(@class,'pagebuilder-block')])[{{arg1}}]//div[contains(@style,'padding: {{arg2}}px;')]" parameterized="true"/>
31+
<element name="overlay" type="text" selector=".pagebuilder-content-type-hidden"/>
3132
</section>
3233
<section name="BlockOnGrid">
3334
<element name="searchBox" type="text" selector="//input[contains(@class,'data-grid-search-control')]"/>

app/code/Magento/PageBuilder/Test/Mftf/Section/PageBuilderTextSection.xml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111
<element name="base" type="text" selector="(//div[contains(@class,'pagebuilder-text')])[{{arg1}}]/div" parameterized="true"/>
1212
<element name="textAreaText" type="text" selector="(//div[contains(@class,'pagebuilder-text')])[{{arg1}}]//div[.='{{arg2}}']" parameterized="true"/>
1313
<element name="textAreaTextContains" type="text" selector="(//div[contains(@class,'pagebuilder-text')])[{{arg1}}]//textarea[contains(@value,'{{arg2}}')]" parameterized="true"/>
14-
<element name="text" type="text" selector="//*[contains(@class, 'pagebuilder-text')][{{arg}}]//*[contains(text(),'{{arg2}}')]" parameterized="true"/>
14+
<element name="text" type="text" selector="(//div[contains(@class,'pagebuilder-text')])[{{arg1}}]/div//*[contains(.,'{{arg2}}')]" parameterized="true"/>
15+
<element name="directive" type="text" selector="(//div[contains(@class,'pagebuilder-text')])[{{arg1}}]/div//span[contains(.,'{{arg2}}')]" parameterized="true"/>
1516
<element name="mcePlaceholder" type="text" selector="(//div[contains(@class,'pagebuilder-text')])[{{arg1}}]/div//*[starts-with(@id, '{{arg2}}')]" parameterized="true"/>
1617
<element name="variablePlaceholder" type="text" selector="(//div[contains(@class,'pagebuilder-text')])[{{arg}}]//*[@data-bind='html: data.main.html']//*[contains(@class, 'magento-variable magento-placeholder')]" parameterized="true"/>
1718
<element name="widgetPlaceholder" type="text" selector="(//div[contains(@class,'pagebuilder-text')])[{{arg}}]//*[@data-bind='html: data.main.html']//*[contains(@class, 'magento-placeholder magento-widget')]" parameterized="true"/>
@@ -61,8 +62,9 @@
6162
<section name="TextOnStorefront">
6263
<element name="base" type="text" selector="(//div[@data-role='text'])[{{arg1}}]" parameterized="true"/>
6364
<element name="baseJs" type="text" selector="document.querySelectorAll('[data-role=\'text\']')[{{arg1}}]" parameterized="true"/>
64-
<element name="textAreaText" type="text" selector="(//div[@data-role='text'])[{{arg1}}][contains(text(),'{{arg2}}')]" parameterized="true"/>
6565
<element name="textAreaWidget" type="text" selector="(//div[@data-role='text'])[{{arg1}}]//a[contains(@href,'{{arg2}}{{arg3}}{{arg4}}')]" parameterized="true"/>
66+
<element name="textWidget" type="text" selector="(//div[@data-role='text'])[{{arg1}}]//a[contains(@href,'{{arg2}}{{arg3}}')]" parameterized="true"/>
67+
<element name="textAreaText" type="text" selector="(//div[@data-role='text'])[{{arg1}}][contains(text(),'{{arg2}}')]" parameterized="true"/>
6668
<element name="textAreaVariable" type="text" selector="(//div[@data-role='text'])[{{arg1}}]//a[contains(@href,'{{arg2}}{{arg3}}')]" parameterized="true"/>
6769
<element name="text" type="text" selector="(//div[@data-role='text'])[{{arg1}}]//*[contains(text(),'{{arg2}}')]" parameterized="true"/>
6870
<element name="empty" type="text" selector="//div[@data-role='text'][{{arg1}}][not(*)]" parameterized="true"/>
@@ -86,6 +88,7 @@
8688
<element name="noMargins" type="text" selector="(//div[@data-role='text'])[{{arg1}}][not(contains(@style,'margin:'))]" parameterized="true"/>
8789
<element name="padding" type="text" selector="(//div[@data-role='text'])[{{arg1}}][contains(@style,'padding: {{arg2}}px;')]" parameterized="true"/>
8890
<element name="noPadding" type="text" selector="(//div[@data-role='text'])[{{arg1}}][not(contains(@style,'padding:'))]" parameterized="true"/>
91+
<element name="emptyText" type="text" selector="//div[@data-role='text']/p[not(text())]"/>
8992
</section>
9093
<section name="TextOnBackend">
9194
<element name="textInstance" type="button" selector='//div[contains(@class, "pagebuilder-text")][1]/div[1]'/>

app/code/Magento/PageBuilder/Test/Mftf/Test/AdminPageBuilderAdvancedConfigurationTest.xml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,7 @@
365365
<group value="pagebuilder"/>
366366
<group value="pagebuilder-advancedConfig"/>
367367
<skip>
368-
<issueId value="MC-3720"/>
368+
<issueId value="MC-3723"/>
369369
</skip>
370370
</annotations>
371371
<before>
@@ -1102,7 +1102,7 @@
11021102
<group value="pagebuilder"/>
11031103
<group value="pagebuilder-advancedConfig"/>
11041104
<skip>
1105-
<issueId value="MC-3720"/>
1105+
<issueId value="MC-3723"/>
11061106
</skip>
11071107
</annotations>
11081108
<before>
@@ -1412,7 +1412,7 @@
14121412
<group value="pagebuilder"/>
14131413
<group value="pagebuilder-advancedConfig"/>
14141414
<skip>
1415-
<issueId value="MC-3720"/>
1415+
<issueId value="MC-3723"/>
14161416
</skip>
14171417
</annotations>
14181418
<before>
@@ -1822,7 +1822,7 @@
18221822
<group value="pagebuilder"/>
18231823
<group value="pagebuilder-advancedConfig"/>
18241824
<skip>
1825-
<issueId value="MC-3720"/>
1825+
<issueId value="MC-3723"/>
18261826
</skip>
18271827
</annotations>
18281828
<before>
@@ -2146,7 +2146,7 @@
21462146
<group value="pagebuilder"/>
21472147
<group value="pagebuilder-advancedConfig"/>
21482148
<skip>
2149-
<issueId value="MC-3720"/>
2149+
<issueId value="MC-3723"/>
21502150
</skip>
21512151
</annotations>
21522152
<before>

0 commit comments

Comments
 (0)