Skip to content

Commit a025660

Browse files
committed
Merge branch '2.1-develop' of https://github.com/magento/magento2ce into MAGETWO-60246
2 parents b500a76 + bc7f7be commit a025660

File tree

6 files changed

+140
-30
lines changed

6 files changed

+140
-30
lines changed

app/code/Magento/Catalog/Block/Product/ListProduct.php

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -318,13 +318,21 @@ public function prepareSortableFieldsByCategory($category)
318318
public function getIdentities()
319319
{
320320
$identities = [];
321-
foreach ($this->_getProductCollection() as $item) {
322-
$identities = array_merge($identities, $item->getIdentities());
323-
}
321+
324322
$category = $this->getLayer()->getCurrentCategory();
325323
if ($category) {
326324
$identities[] = Product::CACHE_PRODUCT_CATEGORY_TAG . '_' . $category->getId();
327325
}
326+
327+
//Check if category page shows only static block (No products)
328+
if ($category->getData('display_mode') == Category::DM_PAGE) {
329+
return $identities;
330+
}
331+
332+
foreach ($this->_getProductCollection() as $item) {
333+
$identities = array_merge($identities, $item->getIdentities());
334+
}
335+
328336
return $identities;
329337
}
330338

app/code/Magento/Catalog/Test/Unit/Block/Product/ListProductTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ public function testGetIdentities()
179179
->will($this->returnValue($currentCategory));
180180

181181
$this->assertEquals(
182-
[$productTag, $categoryTag ],
182+
[$categoryTag, $productTag],
183183
$this->block->getIdentities()
184184
);
185185
}

app/code/Magento/Cms/Controller/Adminhtml/Page/PostDataProcessor.php

Lines changed: 61 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,14 @@
66
*/
77
namespace Magento\Cms\Controller\Adminhtml\Page;
88

9+
use Magento\Cms\Model\Page\DomValidationState;
10+
use Magento\Framework\App\ObjectManager;
11+
use Magento\Framework\Config\Dom\ValidationException;
12+
13+
/**
14+
* Class PostDataProcessor
15+
* @package Magento\Cms\Controller\Adminhtml\Page
16+
*/
917
class PostDataProcessor
1018
{
1119
/**
@@ -23,19 +31,28 @@ class PostDataProcessor
2331
*/
2432
protected $messageManager;
2533

34+
/**
35+
* @var DomValidationState
36+
*/
37+
private $validationState;
38+
2639
/**
2740
* @param \Magento\Framework\Stdlib\DateTime\Filter\Date $dateFilter
2841
* @param \Magento\Framework\Message\ManagerInterface $messageManager
2942
* @param \Magento\Framework\View\Model\Layout\Update\ValidatorFactory $validatorFactory
43+
* @param DomValidationState $validationState
3044
*/
3145
public function __construct(
3246
\Magento\Framework\Stdlib\DateTime\Filter\Date $dateFilter,
3347
\Magento\Framework\Message\ManagerInterface $messageManager,
34-
\Magento\Framework\View\Model\Layout\Update\ValidatorFactory $validatorFactory
48+
\Magento\Framework\View\Model\Layout\Update\ValidatorFactory $validatorFactory,
49+
DomValidationState $validationState = null
3550
) {
3651
$this->dateFilter = $dateFilter;
3752
$this->messageManager = $messageManager;
3853
$this->validatorFactory = $validatorFactory;
54+
$this->validationState = $validationState
55+
?: ObjectManager::getInstance()->get(DomValidationState::class);
3956
}
4057

4158
/**
@@ -61,27 +78,27 @@ public function filter($data)
6178
* Validate post data
6279
*
6380
* @param array $data
64-
* @return bool Return FALSE if someone item is invalid
81+
* @return bool Return FALSE if some item is invalid
6582
*/
6683
public function validate($data)
6784
{
68-
$errorNo = true;
6985
if (!empty($data['layout_update_xml']) || !empty($data['custom_layout_update_xml'])) {
70-
/** @var $validatorCustomLayout \Magento\Framework\View\Model\Layout\Update\Validator */
71-
$validatorCustomLayout = $this->validatorFactory->create();
72-
if (!empty($data['layout_update_xml']) && !$validatorCustomLayout->isValid($data['layout_update_xml'])) {
73-
$errorNo = false;
74-
}
75-
if (!empty($data['custom_layout_update_xml'])
76-
&& !$validatorCustomLayout->isValid($data['custom_layout_update_xml'])
77-
) {
78-
$errorNo = false;
79-
}
80-
foreach ($validatorCustomLayout->getMessages() as $message) {
81-
$this->messageManager->addError($message);
86+
/** @var $layoutXmlValidator \Magento\Framework\View\Model\Layout\Update\Validator */
87+
$layoutXmlValidator = $this->validatorFactory->create(
88+
[
89+
'validationState' => $this->validationState,
90+
]
91+
);
92+
93+
if (!$this->validateData($data, $layoutXmlValidator)) {
94+
$validatorMessages = $layoutXmlValidator->getMessages();
95+
foreach ($validatorMessages as $message) {
96+
$this->messageManager->addErrorMessage($message);
97+
}
98+
return false;
8299
}
83100
}
84-
return $errorNo;
101+
return true;
85102
}
86103

87104
/**
@@ -108,4 +125,32 @@ public function validateRequireEntry(array $data)
108125
}
109126
return $errorNo;
110127
}
128+
129+
/**
130+
* Validate data, avoid cyclomatic complexity
131+
*
132+
* @param array $data
133+
* @param \Magento\Framework\View\Model\Layout\Update\Validator $layoutXmlValidator
134+
* @return bool
135+
*/
136+
private function validateData($data, $layoutXmlValidator)
137+
{
138+
try {
139+
if (!empty($data['layout_update_xml']) && !$layoutXmlValidator->isValid($data['layout_update_xml'])) {
140+
return false;
141+
}
142+
if (!empty($data['custom_layout_update_xml']) &&
143+
!$layoutXmlValidator->isValid($data['custom_layout_update_xml'])
144+
) {
145+
return false;
146+
}
147+
} catch (ValidationException $e) {
148+
return false;
149+
} catch (\Exception $e) {
150+
$this->messageManager->addExceptionMessage($e, $e->getMessage());
151+
return false;
152+
}
153+
154+
return true;
155+
}
111156
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
/**
3+
* Application config file resolver
4+
*
5+
* Copyright © 2013-2017 Magento, Inc. All rights reserved.
6+
* See COPYING.txt for license details.
7+
*/
8+
namespace Magento\Cms\Model\Page;
9+
10+
/**
11+
* Class DomValidationState
12+
* @package Magento\Cms\Model\Page
13+
*/
14+
class DomValidationState implements \Magento\Framework\Config\ValidationStateInterface
15+
{
16+
/**
17+
* Retrieve validation state
18+
* Used in cms page post processor to force validate layout update xml
19+
*
20+
* @return boolean
21+
*/
22+
public function isValidationRequired()
23+
{
24+
return true;
25+
}
26+
}

lib/internal/Magento/Framework/View/Model/Layout/Update/Validator.php

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@
55
*/
66
namespace Magento\Framework\View\Model\Layout\Update;
77

8+
use Magento\Framework\App\ObjectManager;
89
use Magento\Framework\Config\Dom\UrnResolver;
10+
use Magento\Framework\Config\DomFactory;
11+
use Magento\Framework\Config\ValidationStateInterface;
912

1013
/**
1114
* Validator for custom layout update
@@ -51,17 +54,24 @@ class Validator extends \Zend_Validate_Abstract
5154
protected $_xsdSchemas;
5255

5356
/**
54-
* @var \Magento\Framework\Config\DomFactory
57+
* @var DomFactory
5558
*/
5659
protected $_domConfigFactory;
5760

5861
/**
59-
* @param \Magento\Framework\Config\DomFactory $domConfigFactory
62+
* @var ValidationStateInterface
63+
*/
64+
private $validationState;
65+
66+
/**
67+
* @param DomFactory $domConfigFactory
6068
* @param \Magento\Framework\Config\Dom\UrnResolver $urnResolver
69+
* @param ValidationStateInterface $validationState
6170
*/
6271
public function __construct(
63-
\Magento\Framework\Config\DomFactory $domConfigFactory,
64-
UrnResolver $urnResolver
72+
DomFactory $domConfigFactory,
73+
UrnResolver $urnResolver,
74+
ValidationStateInterface $validationState = null
6575
) {
6676
$this->_domConfigFactory = $domConfigFactory;
6777
$this->_initMessageTemplates();
@@ -73,6 +83,8 @@ public function __construct(
7383
'urn:magento:framework:View/Layout/etc/layout_merged.xsd'
7484
),
7585
];
86+
$this->validationState = $validationState
87+
?: ObjectManager::getInstance()->get(ValidationStateInterface::class);
7688
}
7789

7890
/**
@@ -115,7 +127,13 @@ public function isValid($value, $schema = self::LAYOUT_SCHEMA_PAGE_HANDLE, $isSe
115127
try {
116128
//wrap XML value in the "layout" and "handle" tags to make it validatable
117129
$value = '<layout xmlns:xsi="' . self::XML_NAMESPACE_XSI . '">' . $value . '</layout>';
118-
$this->_domConfigFactory->createDom(['xml' => $value, 'schemaFile' => $this->_xsdSchemas[$schema]]);
130+
$this->_domConfigFactory->createDom(
131+
[
132+
'xml' => $value,
133+
'schemaFile' => $this->_xsdSchemas[$schema],
134+
'validationState' => $this->validationState,
135+
]
136+
);
119137

120138
if ($isSecurityCheck) {
121139
$value = new \Magento\Framework\Simplexml\Element($value);

lib/internal/Magento/Framework/View/Test/Unit/Model/Layout/Update/ValidatorTest.php

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
*/
66
namespace Magento\Framework\View\Test\Unit\Model\Layout\Update;
77

8-
use \Magento\Framework\View\Model\Layout\Update\Validator;
8+
use Magento\Framework\View\Model\Layout\Update\Validator;
99

1010
class ValidatorTest extends \PHPUnit_Framework_TestCase
1111
{
@@ -14,6 +14,11 @@ class ValidatorTest extends \PHPUnit_Framework_TestCase
1414
*/
1515
protected $_objectHelper;
1616

17+
/**
18+
* @var \Magento\Framework\Config\ValidationStateInterface|\PHPUnit_Framework_MockObject_MockObject
19+
*/
20+
private $validationState;
21+
1722
protected function setUp()
1823
{
1924
$this->_objectHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
@@ -27,14 +32,18 @@ protected function setUp()
2732
protected function _createValidator($layoutUpdate, $isSchemaValid = true)
2833
{
2934
$domConfigFactory = $this->getMockBuilder(
30-
'Magento\Framework\Config\DomFactory'
35+
\Magento\Framework\Config\DomFactory::class
36+
)->disableOriginalConstructor()->getMock();
37+
$this->validationState = $this->getMockBuilder(
38+
\Magento\Framework\Config\ValidationStateInterface::class
3139
)->disableOriginalConstructor()->getMock();
3240

3341
$urnResolver = new \Magento\Framework\Config\Dom\UrnResolver();
3442
$params = [
3543
'xml' => '<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">' .
3644
trim($layoutUpdate) . '</layout>',
3745
'schemaFile' => $urnResolver->getRealPath('urn:magento:framework:View/Layout/etc/page_layout.xsd'),
46+
'validationState' => $this->validationState,
3847
];
3948

4049
$exceptionMessage = 'validation exception';
@@ -49,10 +58,14 @@ protected function _createValidator($layoutUpdate, $isSchemaValid = true)
4958
new \Magento\Framework\Config\Dom\ValidationException($exceptionMessage)
5059
)
5160
);
52-
$urnResolver = $this->_objectHelper->getObject('Magento\Framework\Config\Dom\UrnResolver');
61+
$urnResolver = $this->_objectHelper->getObject(\Magento\Framework\Config\Dom\UrnResolver::class);
5362
$model = $this->_objectHelper->getObject(
54-
'Magento\Framework\View\Model\Layout\Update\Validator',
55-
['domConfigFactory' => $domConfigFactory, 'urnResolver' => $urnResolver]
63+
\Magento\Framework\View\Model\Layout\Update\Validator::class,
64+
[
65+
'domConfigFactory' => $domConfigFactory,
66+
'urnResolver' => $urnResolver,
67+
'validationState' => $this->validationState,
68+
]
5669
);
5770

5871
return $model;

0 commit comments

Comments
 (0)