From 8468dc39d09b526cf05ac1903e05f2edf235e378 Mon Sep 17 00:00:00 2001 From: Oleksandr Shmyheliuk Date: Wed, 2 Nov 2016 14:47:30 +0200 Subject: [PATCH 1/4] MAGETWO-60381: Disable fields functionality doesn't work for theme configuration --- .../Model/Design/Config/DataProvider.php | 119 +++++++++++++ .../Model/Design/Config/DataProviderTest.php | 157 ++++++++++++++++++ 2 files changed, 276 insertions(+) diff --git a/app/code/Magento/Theme/Model/Design/Config/DataProvider.php b/app/code/Magento/Theme/Model/Design/Config/DataProvider.php index c433b02fab240..ce91a3a85a484 100644 --- a/app/code/Magento/Theme/Model/Design/Config/DataProvider.php +++ b/app/code/Magento/Theme/Model/Design/Config/DataProvider.php @@ -5,9 +5,13 @@ */ namespace Magento\Theme\Model\Design\Config; +use Magento\Framework\App\ObjectManager; +use Magento\Store\Model\StoreManagerInterface; use Magento\Theme\Model\ResourceModel\Design\Config\Collection; use Magento\Theme\Model\ResourceModel\Design\Config\CollectionFactory; use Magento\Ui\DataProvider\AbstractDataProvider; +use Magento\Config\Model\Config\Reader\Source\Deployed\SettingChecker; +use Magento\Framework\App\RequestInterface; class DataProvider extends AbstractDataProvider { @@ -31,6 +35,21 @@ class DataProvider extends AbstractDataProvider */ private $metadataLoader; + /** + * @var SettingChecker + */ + private $settingChecker; + + /** + * @var RequestInterface + */ + private $request; + + /** + * @var StoreManagerInterface + */ + private $storeManager; + /** * @param string $name * @param string $primaryFieldName @@ -78,4 +97,104 @@ public function getData() $this->loadedData = $this->dataLoader->getData(); return $this->loadedData; } + + /** + * {@inheritdoc} + */ + public function getMeta() + { + $meta = parent::getMeta(); + if (!isset($meta['other_settings']['children'])) { + return $meta; + } + + $request = $this->getRequest()->getParams(); + if (!isset($request['scope'])) { + return $meta; + } + + $scope = $request['scope']; + $scopeCode = $this->getStringScopeCode( + $scope, + isset($request['scope_id']) ? $request['scope_id'] : null + ); + + foreach ($meta['other_settings']['children'] as $settingGroupName => &$settingGroup) { + foreach ($settingGroup['children'] as $fieldName => &$field) { + $path = sprintf( + 'design/%s/%s', + $settingGroupName, + preg_replace('/^' . $settingGroupName . '_/', '', $fieldName) + ); + $isReadOnly = $this->getSettingChecker()->isReadOnly( + $path, + $scope, + $scopeCode + ); + + if ($isReadOnly) { + $field['arguments']['data']['config']['disabled'] = true; + $field['arguments']['data']['config']['is_disable_inheritance'] = true; + } + } + } + + return $meta; + } + + /** + * Retrieve Scope string code + * + * @param string $scope + * @param integer $scopeId + * @return string + */ + private function getStringScopeCode($scope, $scopeId = null) + { + $scopeCode = ''; + + if ($scope == 'stores') { + $scopeCode = $this->getStoreManager()->getStore($scopeId)->getCode(); + } elseif ($scope == 'websites') { + $scopeCode = $this->getStoreManager()->getWebsite($scopeId)->getCode(); + } + + return $scopeCode; + } + + /** + * @deprecated + * @return SettingChecker + */ + private function getSettingChecker() + { + if ($this->settingChecker === null) { + $this->settingChecker = ObjectManager::getInstance()->get(SettingChecker::class); + } + return $this->settingChecker; + } + + /** + * @deprecated + * @return RequestInterface + */ + private function getRequest() + { + if ($this->request === null) { + $this->request = ObjectManager::getInstance()->get(RequestInterface::class); + } + return $this->request; + } + + /** + * @deprecated + * @return StoreManagerInterface + */ + private function getStoreManager() + { + if ($this->storeManager === null) { + $this->storeManager = ObjectManager::getInstance()->get(StoreManagerInterface::class); + } + return $this->storeManager; + } } diff --git a/app/code/Magento/Theme/Test/Unit/Model/Design/Config/DataProviderTest.php b/app/code/Magento/Theme/Test/Unit/Model/Design/Config/DataProviderTest.php index 2d90748b59576..d75df7d0f188b 100644 --- a/app/code/Magento/Theme/Test/Unit/Model/Design/Config/DataProviderTest.php +++ b/app/code/Magento/Theme/Test/Unit/Model/Design/Config/DataProviderTest.php @@ -5,6 +5,11 @@ */ namespace Magento\Theme\Test\Unit\Model\Design\Config; +use Magento\Config\Model\Config\Reader\Source\Deployed\SettingChecker; +use Magento\Framework\App\RequestInterface; +use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; +use Magento\Store\Api\Data\StoreInterface; +use Magento\Store\Model\StoreManagerInterface; use Magento\Theme\Model\Design\Config\DataLoader; use Magento\Theme\Model\Design\Config\DataProvider; use Magento\Theme\Model\Design\Config\MetadataLoader; @@ -32,8 +37,29 @@ class DataProviderTest extends \PHPUnit_Framework_TestCase */ protected $collection; + /** + * @var ObjectManager + */ + private $objectManager; + + /** + * @var RequestInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $requestMock; + + /** + * @var StoreManagerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $storeManagerMock; + + /** + * @var SettingChecker|\PHPUnit_Framework_MockObject_MockObject + */ + private $settingCheckerMock; + protected function setUp() { + $this->objectManager = new ObjectManager($this); $this->dataLoader = $this->getMockBuilder('Magento\Theme\Model\Design\Config\DataProvider\DataLoader') ->disableOriginalConstructor() ->getMock(); @@ -57,6 +83,16 @@ protected function setUp() ->method('create') ->willReturn($this->collection); + $this->requestMock = $this->getMockBuilder(RequestInterface::class) + ->disableOriginalConstructor() + ->getMock(); + $this->storeManagerMock = $this->getMockBuilder(StoreManagerInterface::class) + ->disableOriginalConstructor() + ->getMock(); + $this->settingCheckerMock = $this->getMockBuilder(SettingChecker::class) + ->disableOriginalConstructor() + ->getMock(); + $this->model = new DataProvider( 'scope', 'scope', @@ -65,6 +101,21 @@ protected function setUp() $this->metadataLoader, $collectionFactory ); + $this->objectManager->setBackwardCompatibleProperty( + $this->model, + 'request', + $this->requestMock + ); + $this->objectManager->setBackwardCompatibleProperty( + $this->model, + 'storeManager', + $this->storeManagerMock + ); + $this->objectManager->setBackwardCompatibleProperty( + $this->model, + 'settingChecker', + $this->settingCheckerMock + ); } public function testGetData() @@ -79,4 +130,110 @@ public function testGetData() $this->assertEquals($data, $this->model->getData()); } + + /** + * @param array $inputMeta + * @param array $expectedMeta + * @param array $request + * @dataProvider getMetaDataProvider + */ + public function testGetMeta(array $inputMeta, array $expectedMeta, array $request) + { + $store = $this->getMockBuilder(StoreInterface::class) + ->disableOriginalConstructor() + ->getMock(); + $store->expects($this->any()) + ->method('getCode') + ->willReturn('store1'); + $this->requestMock->expects($this->any()) + ->method('getParams') + ->willReturn($request); + $this->storeManagerMock->expects($this->any()) + ->method('getStore') + ->with(1) + ->willReturn($store); + $this->settingCheckerMock->expects($this->any()) + ->method('isReadOnly') + ->withConsecutive( + ['design/head/welcome', 'stores', 'store1'], + ['design/head/logo', 'stores', 'store1'] + ) + ->willReturnOnConsecutiveCalls( + true, + false + ); + + $this->objectManager->setBackwardCompatibleProperty( + $this->model, + 'meta', + $inputMeta + ); + + $this->assertSame($expectedMeta, $this->model->getMeta()); + } + + /** + * @return array + */ + public function getMetaDataProvider() + { + return [ + [ + [ + 'option1' + ], + [ + 'option1' + ], + [ + 'scope' => 'default' + ] + ], + [ + [ + 'other_settings' => [ + 'children' => [ + 'head' => [ + 'children' => [ + 'head_welcome' => [ + + ], + 'head_logo' => [ + + ] + ] + ] + ] + ] + ], + [ + 'other_settings' => [ + 'children' => [ + 'head' => [ + 'children' => [ + 'head_welcome' => [ + 'arguments' => [ + 'data' => [ + 'config' => [ + 'disabled' => true, + 'is_disable_inheritance' => true, + ] + ] + ] + ], + 'head_logo' => [ + + ] + ] + ] + ] + ] + ], + [ + 'scope' => 'stores', + 'scope_id' => 1 + ] + ] + ]; + } } From fcb1512ee0270d3a0e18a492c10eb112c0e6a420 Mon Sep 17 00:00:00 2001 From: Oleksandr Shmyheliuk Date: Wed, 2 Nov 2016 16:04:55 +0200 Subject: [PATCH 2/4] MAGETWO-60381: Disable fields functionality doesn't work for theme configuration --- .../Model/Design/Config/DataProvider.php | 40 +++++-------------- .../Model/Design/Config/DataProviderTest.php | 31 ++++++-------- 2 files changed, 22 insertions(+), 49 deletions(-) diff --git a/app/code/Magento/Theme/Model/Design/Config/DataProvider.php b/app/code/Magento/Theme/Model/Design/Config/DataProvider.php index ce91a3a85a484..977295c1f80c4 100644 --- a/app/code/Magento/Theme/Model/Design/Config/DataProvider.php +++ b/app/code/Magento/Theme/Model/Design/Config/DataProvider.php @@ -5,8 +5,8 @@ */ namespace Magento\Theme\Model\Design\Config; +use Magento\Framework\App\Config\ScopeCodeResolver; use Magento\Framework\App\ObjectManager; -use Magento\Store\Model\StoreManagerInterface; use Magento\Theme\Model\ResourceModel\Design\Config\Collection; use Magento\Theme\Model\ResourceModel\Design\Config\CollectionFactory; use Magento\Ui\DataProvider\AbstractDataProvider; @@ -46,9 +46,9 @@ class DataProvider extends AbstractDataProvider private $request; /** - * @var StoreManagerInterface + * @var ScopeCodeResolver */ - private $storeManager; + private $scopeCodeResolver; /** * @param string $name @@ -114,7 +114,7 @@ public function getMeta() } $scope = $request['scope']; - $scopeCode = $this->getStringScopeCode( + $scopeCode = $this->getScopeCodeResolver()->resolve( $scope, isset($request['scope_id']) ? $request['scope_id'] : null ); @@ -143,23 +143,15 @@ public function getMeta() } /** - * Retrieve Scope string code - * - * @param string $scope - * @param integer $scopeId - * @return string + * @deprecated + * @return ScopeCodeResolver */ - private function getStringScopeCode($scope, $scopeId = null) + private function getScopeCodeResolver() { - $scopeCode = ''; - - if ($scope == 'stores') { - $scopeCode = $this->getStoreManager()->getStore($scopeId)->getCode(); - } elseif ($scope == 'websites') { - $scopeCode = $this->getStoreManager()->getWebsite($scopeId)->getCode(); + if ($this->scopeCodeResolver === null) { + $this->scopeCodeResolver = ObjectManager::getInstance()->get(ScopeCodeResolver::class); } - - return $scopeCode; + return $this->scopeCodeResolver; } /** @@ -185,16 +177,4 @@ private function getRequest() } return $this->request; } - - /** - * @deprecated - * @return StoreManagerInterface - */ - private function getStoreManager() - { - if ($this->storeManager === null) { - $this->storeManager = ObjectManager::getInstance()->get(StoreManagerInterface::class); - } - return $this->storeManager; - } } diff --git a/app/code/Magento/Theme/Test/Unit/Model/Design/Config/DataProviderTest.php b/app/code/Magento/Theme/Test/Unit/Model/Design/Config/DataProviderTest.php index d75df7d0f188b..f14cd139b9d43 100644 --- a/app/code/Magento/Theme/Test/Unit/Model/Design/Config/DataProviderTest.php +++ b/app/code/Magento/Theme/Test/Unit/Model/Design/Config/DataProviderTest.php @@ -6,10 +6,9 @@ namespace Magento\Theme\Test\Unit\Model\Design\Config; use Magento\Config\Model\Config\Reader\Source\Deployed\SettingChecker; +use Magento\Framework\App\Config\ScopeCodeResolver; use Magento\Framework\App\RequestInterface; use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; -use Magento\Store\Api\Data\StoreInterface; -use Magento\Store\Model\StoreManagerInterface; use Magento\Theme\Model\Design\Config\DataLoader; use Magento\Theme\Model\Design\Config\DataProvider; use Magento\Theme\Model\Design\Config\MetadataLoader; @@ -48,9 +47,9 @@ class DataProviderTest extends \PHPUnit_Framework_TestCase private $requestMock; /** - * @var StoreManagerInterface|\PHPUnit_Framework_MockObject_MockObject + * @var ScopeCodeResolver|\PHPUnit_Framework_MockObject_MockObject */ - private $storeManagerMock; + private $scopeCodeResolverMock; /** * @var SettingChecker|\PHPUnit_Framework_MockObject_MockObject @@ -86,7 +85,7 @@ protected function setUp() $this->requestMock = $this->getMockBuilder(RequestInterface::class) ->disableOriginalConstructor() ->getMock(); - $this->storeManagerMock = $this->getMockBuilder(StoreManagerInterface::class) + $this->scopeCodeResolverMock = $this->getMockBuilder(ScopeCodeResolver::class) ->disableOriginalConstructor() ->getMock(); $this->settingCheckerMock = $this->getMockBuilder(SettingChecker::class) @@ -108,8 +107,8 @@ protected function setUp() ); $this->objectManager->setBackwardCompatibleProperty( $this->model, - 'storeManager', - $this->storeManagerMock + 'scopeCodeResolver', + $this->scopeCodeResolverMock ); $this->objectManager->setBackwardCompatibleProperty( $this->model, @@ -139,24 +138,18 @@ public function testGetData() */ public function testGetMeta(array $inputMeta, array $expectedMeta, array $request) { - $store = $this->getMockBuilder(StoreInterface::class) - ->disableOriginalConstructor() - ->getMock(); - $store->expects($this->any()) - ->method('getCode') - ->willReturn('store1'); $this->requestMock->expects($this->any()) ->method('getParams') ->willReturn($request); - $this->storeManagerMock->expects($this->any()) - ->method('getStore') - ->with(1) - ->willReturn($store); + $this->scopeCodeResolverMock->expects($this->any()) + ->method('resolve') + ->with('stores', 1) + ->willReturn('default'); $this->settingCheckerMock->expects($this->any()) ->method('isReadOnly') ->withConsecutive( - ['design/head/welcome', 'stores', 'store1'], - ['design/head/logo', 'stores', 'store1'] + ['design/head/welcome', 'stores', 'default'], + ['design/head/logo', 'stores', 'default'] ) ->willReturnOnConsecutiveCalls( true, From 24d38d30e2f52cadd636759d89aef45516c60a90 Mon Sep 17 00:00:00 2001 From: Oleksandr Shmyheliuk Date: Wed, 2 Nov 2016 16:48:35 +0200 Subject: [PATCH 3/4] MAGETWO-60381: Disable fields functionality doesn't work for theme configuration --- .../Model/Design/Config/DataProviderTest.php | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/app/code/Magento/Theme/Test/Unit/Model/Design/Config/DataProviderTest.php b/app/code/Magento/Theme/Test/Unit/Model/Design/Config/DataProviderTest.php index f14cd139b9d43..fd397a8ad4933 100644 --- a/app/code/Magento/Theme/Test/Unit/Model/Design/Config/DataProviderTest.php +++ b/app/code/Magento/Theme/Test/Unit/Model/Design/Config/DataProviderTest.php @@ -149,11 +149,13 @@ public function testGetMeta(array $inputMeta, array $expectedMeta, array $reques ->method('isReadOnly') ->withConsecutive( ['design/head/welcome', 'stores', 'default'], - ['design/head/logo', 'stores', 'default'] + ['design/head/logo', 'stores', 'default'], + ['design/head/head', 'stores', 'default'] ) ->willReturnOnConsecutiveCalls( true, - false + false, + true ); $this->objectManager->setBackwardCompatibleProperty( @@ -193,6 +195,9 @@ public function getMetaDataProvider() ], 'head_logo' => [ + ], + 'head_head' => [ + ] ] ] @@ -216,6 +221,16 @@ public function getMetaDataProvider() ], 'head_logo' => [ + ], + 'head_head' => [ + 'arguments' => [ + 'data' => [ + 'config' => [ + 'disabled' => true, + 'is_disable_inheritance' => true, + ] + ] + ] ] ] ] From c893f1690261d9a46076d6ff29a88bad1839408c Mon Sep 17 00:00:00 2001 From: Bohdan Korablov Date: Wed, 2 Nov 2016 17:36:59 +0200 Subject: [PATCH 4/4] MAGETWO-60355: [Backport] - Production mode cannot be enabled - for 2.1 --- .../ObjectManager/Config/Compiled.php | 12 +-- .../Test/Unit/Config/CompiledTest.php | 91 ------------------- 2 files changed, 3 insertions(+), 100 deletions(-) delete mode 100644 lib/internal/Magento/Framework/ObjectManager/Test/Unit/Config/CompiledTest.php diff --git a/lib/internal/Magento/Framework/ObjectManager/Config/Compiled.php b/lib/internal/Magento/Framework/ObjectManager/Config/Compiled.php index d155432894daf..227b9444b6061 100644 --- a/lib/internal/Magento/Framework/ObjectManager/Config/Compiled.php +++ b/lib/internal/Magento/Framework/ObjectManager/Config/Compiled.php @@ -129,15 +129,9 @@ public function getPreference($type) */ public function extend(array $configuration) { - $this->arguments = isset($configuration['arguments']) - ? array_replace($this->arguments, $configuration['arguments']) - : $this->arguments; - $this->virtualTypes = isset($configuration['instanceTypes']) - ? array_replace($this->virtualTypes, $configuration['instanceTypes']) - : $this->virtualTypes; - $this->preferences = isset($configuration['preferences']) - ? array_replace($this->preferences, $configuration['preferences']) - : $this->preferences; + $this->arguments = $configuration['arguments']; + $this->virtualTypes = $configuration['instanceTypes']; + $this->preferences = $configuration['preferences']; } /** diff --git a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Config/CompiledTest.php b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Config/CompiledTest.php deleted file mode 100644 index 1fcf3176540db..0000000000000 --- a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Config/CompiledTest.php +++ /dev/null @@ -1,91 +0,0 @@ -objectManagerHelper = new ObjectManagerHelper($this); - } - - /** - * @param array $initialData - * @param array $configuration - * @param array $expectedArguments - * @param array $expectedVirtualTypes - * @param array $expectedPreferences - * - * @dataProvider extendDataProvider - */ - public function testExtend( - array $initialData, - array $configuration, - array $expectedArguments, - array $expectedVirtualTypes, - array $expectedPreferences - ) { - /** @var CompiledConfig $compiledConfig */ - $compiledConfig = $this->objectManagerHelper->getObject(CompiledConfig::class, ['data' => $initialData]); - $compiledConfig->extend($configuration); - - foreach ($expectedArguments as $type => $arguments) { - $this->assertEquals($arguments, $compiledConfig->getArguments($type)); - } - - $this->assertEquals($expectedVirtualTypes, $compiledConfig->getVirtualTypes()); - $this->assertEquals($expectedPreferences, $compiledConfig->getPreferences()); - } - - /** - * @return array - */ - public function extendDataProvider() - { - return [ - [ - 'initialData' => [ - 'arguments' => [ - 'type1' => serialize(['argument1_1' => 'argumentValue1_1', 'argument1_2' => 'argumentValue1_2']) - ], - 'instanceTypes' => [ - 'instanceType1' => 'instanceTypeValue1', 'instanceType2' => 'instanceTypeValue2' - ], - 'preferences' => ['preference1' => 'preferenceValue1', 'preference2' => 'preferenceValue2'] - ], - 'configuration' => [ - 'arguments' => [ - 'type1' => serialize(['argument1_1' => 'newArgumentValue1_1']), - 'type2' => serialize(['argument2_1' => 'newArgumentValue2_1']) - ], - 'instanceTypes' => [ - 'instanceType2' => 'newInstanceTypeValue2', 'instanceType3' => 'newInstanceTypeValue3' - ], - 'preferences' => ['preference1' => 'newPreferenceValue1'] - ], - 'expectedArguments' => [ - 'type1' => ['argument1_1' => 'newArgumentValue1_1'], - 'type2' => ['argument2_1' => 'newArgumentValue2_1'] - ], - 'expectedVirtualTypes' => [ - 'instanceType1' => 'instanceTypeValue1', 'instanceType2' => 'newInstanceTypeValue2', - 'instanceType3' => 'newInstanceTypeValue3' - ], - 'expectedPreferences' => [ - 'preference1' => 'newPreferenceValue1', 'preference2' => 'preferenceValue2' - ] - ] - ]; - } -}