Skip to content

Commit cc6286a

Browse files
authored
Merge pull request #6008 from magento-tsg/2.4-develop-pr75
[TSG] Fixes for 2.4 (pr75) (2.4-develop)
2 parents 9833953 + abdb9e6 commit cc6286a

File tree

7 files changed

+183
-31
lines changed

7 files changed

+183
-31
lines changed

app/code/Magento/Catalog/Test/Mftf/Test/AdminProductGridUrlFilterApplierTest.xml

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,24 @@
1818
<testCaseId value="https://studio.cucumber.io/projects/131313/test-plan/folders/1320712/scenarios/4931106"/>
1919
<group value="product"/>
2020
</annotations>
21+
2122
<before>
2223
<actionGroup ref="AdminLoginActionGroup" stepKey="loginAsAdmin"/>
23-
<createData entity="simpleProductWithShortNameAndSku" stepKey="createSimpleProduct"/>
24+
<createData entity="SimpleProduct2" stepKey="createSimpleProduct"/>
2425
</before>
26+
2527
<after>
26-
<actionGroup ref="ClearFiltersAdminDataGridActionGroup" stepKey="clearGridFilter"/>
2728
<deleteData createDataKey="createSimpleProduct" stepKey="deleteProduct"/>
29+
<actionGroup ref="AdminOpenProductIndexPageActionGroup" stepKey="navigateToProductIndex"/>
30+
<actionGroup ref="ClearFiltersAdminDataGridActionGroup" stepKey="clearGridFilter"/>
2831
<actionGroup ref="AdminLogoutActionGroup" stepKey="logoutOfAdmin"/>
2932
</after>
30-
<amOnPage url="{{AdminProductIndexPage.url}}?filters[name]=$$createSimpleProduct.name$$" stepKey="navigateToProductGridWithFilters"/>
33+
34+
<amOnPage url="{{AdminProductIndexPage.url}}?filters[name]=$createSimpleProduct.name$" stepKey="navigateToProductGridWithFilters"/>
3135
<waitForPageLoad stepKey="waitForProductGrid"/>
32-
<see selector="{{AdminProductGridSection.productGridNameProduct($$createSimpleProduct.name$$)}}" userInput="$$createSimpleProduct.name$$" stepKey="seeProduct"/>
36+
<see selector="{{AdminProductGridSection.productGridNameProduct($createSimpleProduct.name$)}}" userInput="$createSimpleProduct.name$" stepKey="seeProduct"/>
37+
<waitForElementVisible selector="{{AdminProductGridFilterSection.enabledFilters}}" stepKey="waitForEnabledFilters"/>
3338
<seeElement selector="{{AdminProductGridFilterSection.enabledFilters}}" stepKey="seeEnabledFilters"/>
34-
<see selector="{{AdminProductGridFilterSection.enabledFilters}}" userInput="Name: $$createSimpleProduct.name$$" stepKey="seeProductNameFilter"/>
39+
<see selector="{{AdminProductGridFilterSection.enabledFilters}}" userInput="Name: $createSimpleProduct.name$" stepKey="seeProductNameFilter"/>
3540
</test>
3641
</tests>

app/code/Magento/Config/Block/System/Config/Form/Fieldset.php

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,8 @@ protected function _getChildrenElementsHtml(AbstractElement $element)
9696
. '<td colspan="4">' . $field->toHtml() . '</td></tr>';
9797
} else {
9898
$elements .= $field->toHtml();
99+
$styleTag = $this->addVisibilityTag($field);
100+
$elements .= $styleTag;
99101
}
100102
}
101103

@@ -168,11 +170,13 @@ protected function _getFrontendClass($element)
168170
*/
169171
protected function _getHeaderTitleHtml($element)
170172
{
173+
$styleTag = $this->addVisibilityTag($element);
171174
return '<a id="' .
172175
$element->getHtmlId() .
173176
'-head" href="#' .
174177
$element->getHtmlId() .
175178
'-link">' . $element->getLegend() . '</a>' .
179+
$styleTag .
176180
/* @noEscape */ $this->secureRenderer->renderEventListenerAsTag(
177181
'onclick',
178182
'event.preventDefault();' .
@@ -270,10 +274,70 @@ protected function _isCollapseState($element)
270274
return true;
271275
}
272276

277+
if ($this->isCollapseStateByDependentField($element)) {
278+
return false;
279+
}
280+
273281
$extra = $this->_authSession->getUser()->getExtra();
282+
274283
if (isset($extra['configState'][$element->getId()])) {
275284
return $extra['configState'][$element->getId()];
276285
}
277286
return $this->isCollapsedDefault;
278287
}
288+
289+
/**
290+
* Check if element should be collapsed by dependent field value.
291+
*
292+
* @param AbstractElement $element
293+
* @return bool
294+
*/
295+
private function isCollapseStateByDependentField(AbstractElement $element): bool
296+
{
297+
if (!empty($element->getGroup()['depends']['fields'])) {
298+
foreach ($element->getGroup()['depends']['fields'] as $dependFieldData) {
299+
if (is_array($dependFieldData) && isset($dependFieldData['value'], $dependFieldData['id'])) {
300+
$fieldSetForm = $this->getForm();
301+
$dependentFieldConfigValue = $this->_scopeConfig->getValue(
302+
$dependFieldData['id'],
303+
$fieldSetForm->getScope(),
304+
$fieldSetForm->getScopeCode()
305+
);
306+
307+
if ($dependFieldData['value'] !== $dependentFieldConfigValue) {
308+
return true;
309+
}
310+
}
311+
}
312+
}
313+
314+
return false;
315+
}
316+
317+
/**
318+
* If element or it's parent depends on other element we hide it during page load.
319+
*
320+
* @param AbstractElement $field
321+
* @return string
322+
*/
323+
private function addVisibilityTag(AbstractElement $field): string
324+
{
325+
$elementId = '';
326+
$styleTag = '';
327+
328+
if (!empty($field->getFieldConfig()['depends']['fields'])) {
329+
$elementId = '#row_' . $field->getHtmlId();
330+
} elseif (!empty($field->getGroup()['depends']['fields'])) {
331+
$elementId = '#' . $field->getHtmlId() . '-head';
332+
}
333+
334+
if (!empty($elementId)) {
335+
$styleTag .= $this->secureRenderer->renderStyleAsTag(
336+
'display: none;',
337+
$elementId
338+
);
339+
}
340+
341+
return $styleTag;
342+
}
279343
}

dev/tests/integration/testsuite/Magento/Cms/Controller/PageTest.php

Lines changed: 50 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,36 @@
44
* See COPYING.txt for license details.
55
*/
66

7-
/**
8-
* Test class for \Magento\Cms\Controller\Page.
9-
*/
107
namespace Magento\Cms\Controller;
118

129
use Magento\Cms\Api\GetPageByIdentifierInterface;
10+
use Magento\Cms\Model\Page\CustomLayoutManagerInterface;
1311
use Magento\Framework\View\LayoutInterface;
14-
use Magento\TestFramework\Helper\Bootstrap;
12+
use Magento\TestFramework\Cms\Model\CustomLayoutManager;
13+
use Magento\TestFramework\TestCase\AbstractController;
1514

16-
class PageTest extends \Magento\TestFramework\TestCase\AbstractController
15+
/**
16+
* Test for \Magento\Cms\Controller\Page\View class.
17+
*/
18+
class PageTest extends AbstractController
1719
{
20+
/**
21+
* @var GetPageByIdentifierInterface
22+
*/
23+
private $pageRetriever;
24+
1825
/**
1926
* @inheritDoc
2027
*/
2128
protected function setUp(): void
2229
{
23-
Bootstrap::getObjectManager()->configure([
30+
parent::setUp();
31+
$this->_objectManager->configure([
2432
'preferences' => [
25-
\Magento\Cms\Model\Page\CustomLayoutManagerInterface::class =>
26-
\Magento\TestFramework\Cms\Model\CustomLayoutManager::class
33+
CustomLayoutManagerInterface::class => CustomLayoutManager::class,
2734
]
2835
]);
29-
parent::setUp();
36+
$this->pageRetriever = $this->_objectManager->get(GetPageByIdentifierInterface::class);
3037
}
3138

3239
public function testViewAction()
@@ -51,9 +58,7 @@ public function testViewRedirectWithTrailingSlash()
5158
public function testAddBreadcrumbs()
5259
{
5360
$this->dispatch('/enable-cookies');
54-
$layout = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
55-
\Magento\Framework\View\LayoutInterface::class
56-
);
61+
$layout = $this->_objectManager->get(LayoutInterface::class);
5762
$breadcrumbsBlock = $layout->getBlock('breadcrumbs');
5863
$this->assertStringContainsString($breadcrumbsBlock->toHtml(), $this->getResponse()->getBody());
5964
}
@@ -90,12 +95,10 @@ public static function cmsPageWithSystemRouteFixture()
9095
*/
9196
public function testCustomHandles(): void
9297
{
93-
/** @var GetPageByIdentifierInterface $pageFinder */
94-
$pageFinder = Bootstrap::getObjectManager()->get(GetPageByIdentifierInterface::class);
95-
$page = $pageFinder->execute('test_custom_layout_page_3', 0);
96-
$this->dispatch('/cms/page/view/page_id/' .$page->getId());
98+
$page = $this->pageRetriever->execute('test_custom_layout_page_3', 0);
99+
$this->dispatch('/cms/page/view/page_id/' . $page->getId());
97100
/** @var LayoutInterface $layout */
98-
$layout = Bootstrap::getObjectManager()->get(LayoutInterface::class);
101+
$layout = $this->_objectManager->get(LayoutInterface::class);
99102
$handles = $layout->getUpdate()->getHandles();
100103
$this->assertContains('cms_page_view_selectable_test_custom_layout_page_3_test_selected', $handles);
101104
}
@@ -111,8 +114,37 @@ public function testHomePageCustomHandles(): void
111114
{
112115
$this->dispatch('/');
113116
/** @var LayoutInterface $layout */
114-
$layout = Bootstrap::getObjectManager()->get(LayoutInterface::class);
117+
$layout = $this->_objectManager->get(LayoutInterface::class);
115118
$handles = $layout->getUpdate()->getHandles();
116119
$this->assertContains('cms_page_view_selectable_home_page_custom_layout', $handles);
117120
}
121+
122+
/**
123+
* Tests page renders even with unavailable custom page layout.
124+
*
125+
* @magentoDataFixture Magento/Cms/Fixtures/page_list.php
126+
* @dataProvider pageLayoutDataProvider
127+
* @param string $pageIdentifier
128+
* @return void
129+
*/
130+
public function testPageWithCustomLayout(string $pageIdentifier): void
131+
{
132+
$page = $this->pageRetriever->execute($pageIdentifier, 0);
133+
$this->dispatch('/cms/page/view/page_id/' . $page->getId());
134+
$this->assertStringContainsString(
135+
'<main id="maincontent" class="page-main">',
136+
$this->getResponse()->getBody()
137+
);
138+
}
139+
140+
/**
141+
* @return array
142+
*/
143+
public function pageLayoutDataProvider(): array
144+
{
145+
return [
146+
'Page with 1column layout' => ['page-with-1column-layout'],
147+
'Page with unavailable layout' => ['page-with-unavailable-layout']
148+
];
149+
}
118150
}

dev/tests/integration/testsuite/Magento/Cms/Fixtures/page_list.php

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,27 @@
1414
$data = [
1515
[
1616
'title' => 'simplePage',
17-
'is_active' => 1
17+
'is_active' => 1,
1818
],
1919
[
2020
'title' => 'simplePage01',
21-
'is_active' => 1
21+
'is_active' => 1,
2222
],
2323
[
2424
'title' => '01simplePage',
25-
'is_active' => 1
25+
'is_active' => 1,
26+
],
27+
[
28+
'title' => 'Page with 1column layout',
29+
'is_active' => 1,
30+
'content' => '<h1>Test Page Content</h1>',
31+
'page_layout' => '1column',
32+
],
33+
[
34+
'title' => 'Page with unavailable layout',
35+
'content' => '<h1>Test Page Content</h1>',
36+
'is_active' => 1,
37+
'page_layout' => 'unavailable-layout',
2638
],
2739
];
2840

dev/tests/integration/testsuite/Magento/Cms/Fixtures/page_list_rollback.php

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,18 @@
1616

1717
/** @var SearchCriteriaBuilder $searchCriteriaBuilder */
1818
$searchCriteriaBuilder = $objectManager->get(SearchCriteriaBuilder::class);
19-
$searchCriteria = $searchCriteriaBuilder->addFilter('title', ['simplePage', 'simplePage01', '01simplePage'], 'in')
19+
$searchCriteria = $searchCriteriaBuilder
20+
->addFilter(
21+
'title',
22+
[
23+
'simplePage',
24+
'simplePage01',
25+
'01simplePage',
26+
'Page with 1column layout',
27+
'Page with unavailable layout',
28+
],
29+
'in'
30+
)
2031
->create();
2132
$result = $pageRepository->getList($searchCriteria);
2233

lib/internal/Magento/Framework/View/Page/Builder.php

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,13 @@
66
namespace Magento\Framework\View\Page;
77

88
use Magento\Framework\App;
9+
use Magento\Framework\App\ObjectManager;
910
use Magento\Framework\Event;
1011
use Magento\Framework\View;
12+
use Magento\Framework\View\Model\PageLayout\Config\BuilderInterface;
1113

1214
/**
13-
* Class Builder
15+
* Page Layout Builder
1416
*/
1517
class Builder extends View\Layout\Builder
1618
{
@@ -24,23 +26,31 @@ class Builder extends View\Layout\Builder
2426
*/
2527
protected $pageLayoutReader;
2628

29+
/**
30+
* @var BuilderInterface|mixed
31+
*/
32+
private $pageLayoutBuilder;
33+
2734
/**
2835
* @param View\LayoutInterface $layout
2936
* @param App\Request\Http $request
3037
* @param Event\ManagerInterface $eventManager
3138
* @param Config $pageConfig
3239
* @param Layout\Reader $pageLayoutReader
40+
* @param BuilderInterface|null $pageLayoutBuilder
3341
*/
3442
public function __construct(
3543
View\LayoutInterface $layout,
3644
App\Request\Http $request,
3745
Event\ManagerInterface $eventManager,
3846
Config $pageConfig,
39-
Layout\Reader $pageLayoutReader
47+
Layout\Reader $pageLayoutReader,
48+
?BuilderInterface $pageLayoutBuilder = null
4049
) {
4150
parent::__construct($layout, $request, $eventManager);
4251
$this->pageConfig = $pageConfig;
4352
$this->pageLayoutReader = $pageLayoutReader;
53+
$this->pageLayoutBuilder = $pageLayoutBuilder ?? ObjectManager::getInstance()->get(BuilderInterface::class);
4454
$this->pageConfig->setBuilder($this);
4555
}
4656

@@ -57,6 +67,7 @@ protected function generateLayoutBlocks()
5767

5868
/**
5969
* Read page layout and write structure to ReadContext
70+
*
6071
* @return void
6172
*/
6273
protected function readPageLayout()
@@ -69,10 +80,16 @@ protected function readPageLayout()
6980
}
7081

7182
/**
83+
* Get current page layout or fallback to default
84+
*
7285
* @return string
7386
*/
7487
protected function getPageLayout()
7588
{
76-
return $this->pageConfig->getPageLayout() ?: $this->layout->getUpdate()->getPageLayout();
89+
$pageLayout = $this->pageConfig->getPageLayout();
90+
91+
return ($pageLayout && $this->pageLayoutBuilder->getPageLayoutsConfig()->hasPageLayout($pageLayout))
92+
? $pageLayout
93+
: $this->layout->getUpdate()->getPageLayout();
7794
}
7895
}

lib/internal/Magento/Framework/View/Test/Unit/Page/BuilderTest.php

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@
88
namespace Magento\Framework\View\Test\Unit\Page;
99

1010
use Magento\Framework\View\Layout\Reader\Context;
11+
use Magento\Framework\View\Model\PageLayout\Config\BuilderInterface;
1112
use Magento\Framework\View\Page\Builder;
1213
use Magento\Framework\View\Page\Config;
1314
use Magento\Framework\View\Page\Layout\Reader;
15+
use Magento\Framework\View\PageLayout\Config as PageLayoutConfig;
1416
use PHPUnit\Framework\MockObject\MockObject;
1517

1618
/**
@@ -22,7 +24,7 @@ class BuilderTest extends \Magento\Framework\View\Test\Unit\Layout\BuilderTest
2224

2325
/**
2426
* @param array $arguments
25-
* @return \Magento\Framework\View\Page\Builder
27+
* @return \Magento\Framework\View\Layout\Builder
2628
*/
2729
protected function getBuilder($arguments)
2830
{
@@ -39,6 +41,15 @@ protected function getBuilder($arguments)
3941

4042
$arguments['pageLayoutReader'] = $this->createMock(Reader::class);
4143
$arguments['pageLayoutReader']->expects($this->once())->method('read')->with($readerContext, 'test_layout');
44+
$pageLayoutConfig = $this->createMock(PageLayoutConfig::class);
45+
$arguments['pageLayoutBuilder'] = $this->getMockForAbstractClass(BuilderInterface::class);
46+
$arguments['pageLayoutBuilder']->expects($this->once())
47+
->method('getPageLayoutsConfig')
48+
->willReturn($pageLayoutConfig);
49+
$pageLayoutConfig->expects($this->once())
50+
->method('hasPageLayout')
51+
->with('test_layout')
52+
->willReturn(true);
4253

4354
return parent::getBuilder($arguments);
4455
}

0 commit comments

Comments
 (0)