diff --git a/app/code/Magento/Catalog/Model/Category/DataProvider.php b/app/code/Magento/Catalog/Model/Category/DataProvider.php index aefd31e21ad62f8469837a801581170581555c6a..5646eec60700e67a5c5a02ea69e3a53db169a48c 100644 --- a/app/code/Magento/Catalog/Model/Category/DataProvider.php +++ b/app/code/Magento/Catalog/Model/Category/DataProvider.php @@ -5,12 +5,16 @@ */ namespace Magento\Catalog\Model\Category; +use Magento\Catalog\Api\Data\CategoryInterface; +use Magento\Catalog\Api\Data\EavAttributeInterface; +use Magento\Catalog\Model\Attribute\ScopeOverriddenValue; use Magento\Catalog\Model\Category; use Magento\Catalog\Model\ResourceModel\Eav\Attribute as EavAttribute; use Magento\Eav\Api\Data\AttributeInterface; use Magento\Eav\Model\Config; use Magento\Eav\Model\Entity\Type; use Magento\Catalog\Model\ResourceModel\Category\CollectionFactory as CategoryCollectionFactory; +use Magento\Framework\Stdlib\ArrayManager; use Magento\Store\Model\Store; use Magento\Store\Model\StoreManagerInterface; use Magento\Ui\Component\Form\Field; @@ -112,6 +116,16 @@ class DataProvider extends \Magento\Ui\DataProvider\AbstractDataProvider */ private $categoryFactory; + /** + * @var ScopeOverriddenValue + */ + private $scopeOverriddenValue; + + /** + * @var ArrayManager + */ + private $arrayManager; + /** * DataProvider constructor * @@ -151,8 +165,87 @@ class DataProvider extends \Magento\Ui\DataProvider\AbstractDataProvider $this->storeManager = $storeManager; $this->request = $request; $this->categoryFactory = $categoryFactory; + parent::__construct($name, $primaryFieldName, $requestFieldName, $meta, $data); - $this->meta = $this->prepareMeta($this->meta); + } + + /** + * @inheritdoc + */ + public function getMeta() + { + $meta = parent::getMeta(); + $meta = $this->prepareMeta($meta); + $meta = $this->addUseDefaultValueCheckbox($this->getCurrentCategory(), $meta); + $meta = $this->resolveParentInheritance($this->getCurrentCategory(), $meta); + + return $meta; + } + + /** + * @param Category $category + * @param array $meta + * @return array + */ + private function addUseDefaultValueCheckbox(Category $category, array $meta) + { + /** @var EavAttributeInterface $attribute */ + foreach ($category->getAttributes() as $attribute) { + $attributeCode = $attribute->getAttributeCode(); + $canDisplayUseDefault = $attribute->getScope() != EavAttributeInterface::SCOPE_GLOBAL_TEXT + && $category->getId() + && $category->getStoreId(); + $attributePath = $this->getArrayManager()->findPath($attributeCode, $meta); + + if ( + !$attributePath + || !$canDisplayUseDefault + || in_array($attributeCode, $this->elementsWithUseConfigSetting + ) + ) { + continue; + } + + $meta = $this->getArrayManager()->merge( + [$attributePath, 'arguments/data/config'], + $meta, + [ + 'service' => [ + 'template' => 'ui/form/element/helper/service', + ], + 'disabled' => !$this->getScopeOverriddenValue()->containsValue( + CategoryInterface::class, + $category, + $attributeCode, + $this->request->getParam($this->requestScopeFieldName, Store::DEFAULT_STORE_ID) + ) + ] + ); + } + + return $meta; + } + + /** + * Removes not necessary inheritance fields + * + * @param Category $category + * @param array $meta + * @return array + */ + private function resolveParentInheritance(Category $category, array $meta) + { + if (!$category->getParentId() || !$this->getArrayManager()->findPath('custom_use_parent_settings', $meta)) { + return $meta; + } + + $meta = $this->getArrayManager()->merge( + [$this->getArrayManager()->findPath('custom_use_parent_settings', $meta), 'arguments/data/config'], + $meta, + ['visible' => false] + ); + + return $meta; } /** @@ -204,7 +297,6 @@ class DataProvider extends \Magento\Ui\DataProvider\AbstractDataProvider $category = $this->getCurrentCategory(); if ($category) { $categoryData = $category->getData(); - $categoryData = $this->addUseDefaultSettings($category, $categoryData); $categoryData = $this->addUseConfigSettings($categoryData); $categoryData = $this->filterFields($categoryData); $categoryData = $this->convertValues($category, $categoryData); @@ -292,6 +384,7 @@ class DataProvider extends \Magento\Ui\DataProvider\AbstractDataProvider * @param \Magento\Catalog\Model\Category $category * @param array $categoryData * @return array + * @deprecated */ protected function addUseDefaultSettings($category, $categoryData) { @@ -406,15 +499,6 @@ class DataProvider extends \Magento\Ui\DataProvider\AbstractDataProvider $result['use_config.available_sort_by']['default'] = true; $result['use_config.default_sort_by']['default'] = true; $result['use_config.filter_price_range']['default'] = true; - if ($this->request->getParam('store') && $this->request->getParam('id')) { - $result['use_default.url_key']['checked'] = true; - $result['use_default.url_key']['default'] = true; - $result['use_default.url_key']['visible'] = true; - } else { - $result['use_default.url_key']['checked'] = false; - $result['use_default.url_key']['default'] = false; - $result['use_default.url_key']['visible'] = false; - } return $result; } @@ -454,7 +538,6 @@ class DataProvider extends \Magento\Ui\DataProvider\AbstractDataProvider [ 'url_key', 'url_key_create_redirect', - 'use_default.url_key', 'url_key_group', 'meta_title', 'meta_keywords', @@ -484,4 +567,38 @@ class DataProvider extends \Magento\Ui\DataProvider\AbstractDataProvider ], ]; } + + /** + * Retrieve scope overridden value + * + * @return ScopeOverriddenValue + * @deprecated + */ + private function getScopeOverriddenValue() + { + if (null === $this->scopeOverriddenValue) { + $this->scopeOverriddenValue = \Magento\Framework\App\ObjectManager::getInstance()->get( + ScopeOverriddenValue::class + ); + } + + return $this->scopeOverriddenValue; + } + + /** + * Retrieve array manager + * + * @return ArrayManager + * @deprecated + */ + private function getArrayManager() + { + if (null === $this->arrayManager) { + $this->arrayManager = \Magento\Framework\App\ObjectManager::getInstance()->get( + ArrayManager::class + ); + } + + return $this->arrayManager; + } } diff --git a/app/code/Magento/Catalog/view/adminhtml/ui_component/category_form.xml b/app/code/Magento/Catalog/view/adminhtml/ui_component/category_form.xml index 85793a2073d76224a467e97621766b079ffe63b3..4b99707b85f5cbdadc3e3b506aceab73a7940362 100644 --- a/app/code/Magento/Catalog/view/adminhtml/ui_component/category_form.xml +++ b/app/code/Magento/Catalog/view/adminhtml/ui_component/category_form.xml @@ -375,19 +375,6 @@ <item name="source" xsi:type="string">category</item> <item name="label" xsi:type="string" translate="true">URL Key</item> <item name="sortOrder" xsi:type="number">10</item> - <item name="imports" xsi:type="array"> - <item name="disabled" xsi:type="string">${ $.provider }:data.use_default.url_key</item> - </item> - </item> - </argument> - </field> - <field name="use_default.url_key"> - <argument name="data" xsi:type="array"> - <item name="config" xsi:type="array"> - <item name="description" xsi:type="string" translate="true">Use Default</item> - <item name="dataType" xsi:type="string">boolean</item> - <item name="formElement" xsi:type="string">checkbox</item> - <item name="sortOrder" xsi:type="number">20</item> </item> </argument> </field> @@ -453,10 +440,9 @@ <field name="custom_use_parent_settings"> <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> - <item name="additionalClasses" xsi:type="string">admin__field-no-label</item> + <item name="additionalClasses" xsi:type="string">admin__field-x-small</item> <item name="sortOrder" xsi:type="number">170</item> - <item name="label" xsi:type="string"/> - <item name="description" xsi:type="string" translate="true">Use Parent Category Settings</item> + <item name="label" xsi:type="string">Use Parent Category Settings</item> <item name="dataType" xsi:type="string">boolean</item> <item name="formElement" xsi:type="string">checkbox</item> <item name="valueMap" xsi:type="array"> @@ -464,6 +450,8 @@ <item name="false" xsi:type="string">0</item> </item> <item name="default" xsi:type="string">0</item> + <item name="component" xsi:type="string">Magento_Ui/js/form/element/single-checkbox</item> + <item name="prefer" xsi:type="string">toggle</item> </item> </argument> </field> @@ -509,20 +497,21 @@ <field name="custom_apply_to_products"> <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> - <item name="additionalClasses" xsi:type="string">admin__field-no-label</item> + <item name="additionalClasses" xsi:type="string">admin__field-x-small</item> <item name="sortOrder" xsi:type="number">210</item> - <item name="label" xsi:type="string"/> - <item name="description" xsi:type="string" translate="true">Apply Design to Products</item> + <item name="label" xsi:type="string" translate="true">Apply Design to Products</item> <item name="dataType" xsi:type="string">boolean</item> <item name="formElement" xsi:type="string">checkbox</item> - <item name="imports" xsi:type="array"> - <item name="disabled" xsi:type="string">ns = ${ $.ns }, index = custom_use_parent_settings :checked</item> - </item> <item name="valueMap" xsi:type="array"> <item name="true" xsi:type="string">1</item> <item name="false" xsi:type="string">0</item> </item> <item name="default" xsi:type="string">0</item> + <item name="component" xsi:type="string">Magento_Ui/js/form/element/single-checkbox</item> + <item name="prefer" xsi:type="string">toggle</item> + <item name="imports" xsi:type="array"> + <item name="disabled" xsi:type="string">ns = ${ $.ns }, index = custom_use_parent_settings:checked</item> + </item> </item> </argument> </field> diff --git a/app/code/Magento/Ui/view/base/web/js/form/element/file-uploader.js b/app/code/Magento/Ui/view/base/web/js/form/element/file-uploader.js index 917dc62f9f49b148d58ad62c671eb6fbeeff8beb..32ebd40f75346afb4d2d06cd6f9c4db16950fd4a 100644 --- a/app/code/Magento/Ui/view/base/web/js/form/element/file-uploader.js +++ b/app/code/Magento/Ui/view/base/web/js/form/element/file-uploader.js @@ -72,6 +72,7 @@ define([ this.value(value); this.on('value', this.onUpdate.bind(this)); + this.isUseDefault(this.disabled()); return this; }, diff --git a/app/code/Magento/Ui/view/base/web/templates/form/element/uploader/uploader.html b/app/code/Magento/Ui/view/base/web/templates/form/element/uploader/uploader.html index 63c34c1a433129ddf427ecd8104743083a81e98b..ab309026c9ffeb3a8e56816c19994b33d34d4116 100644 --- a/app/code/Magento/Ui/view/base/web/templates/form/element/uploader/uploader.html +++ b/app/code/Magento/Ui/view/base/web/templates/form/element/uploader/uploader.html @@ -29,5 +29,6 @@ <each args="data: value, as: '$file'" render="$parent.getPreviewTmpl($file)"/> </div> + <render args="$data.service.template" if="$data.hasService()"/> </div> -</div> \ No newline at end of file +</div> diff --git a/lib/internal/Magento/Framework/Stdlib/ArrayManager.php b/lib/internal/Magento/Framework/Stdlib/ArrayManager.php index f8b758bb9d9dfa480fd3657cee0ea3ed6c0b0f81..edce214cc3091d55ba27ca382fed2fc201a11731 100644 --- a/lib/internal/Magento/Framework/Stdlib/ArrayManager.php +++ b/lib/internal/Magento/Framework/Stdlib/ArrayManager.php @@ -30,7 +30,7 @@ class ArrayManager /** * Check if node exists * - * @param string $path + * @param array|string $path * @param array $data * @param string $delimiter * @return bool @@ -43,7 +43,7 @@ class ArrayManager /** * Retrieve node * - * @param string $path + * @param array|string $path * @param array $data * @param null $defaultValue * @param string $delimiter @@ -57,7 +57,7 @@ class ArrayManager /** * Set value into node and return modified data * - * @param string $path + * @param array|string $path * @param array $data * @param mixed $value * @param string $delimiter @@ -75,7 +75,7 @@ class ArrayManager /** * Set value into existing node and return modified data * - * @param string $path + * @param array|string $path * @param array $data * @param mixed $value * @param string $delimiter @@ -93,7 +93,7 @@ class ArrayManager /** * Move value from one location to another * - * @param string $path + * @param array|string $path * @param string $targetPath * @param array $data * @param bool $overwrite @@ -120,7 +120,7 @@ class ArrayManager /** * Merge value with node and return modified data * - * @param string $path + * @param array|string $path * @param array $data * @param array $value * @param string $delimiter @@ -141,7 +141,7 @@ class ArrayManager /** * Populate nested array if possible and needed * - * @param string $path + * @param array|string $path * @param array $data * @param string $delimiter * @return array @@ -156,7 +156,7 @@ class ArrayManager /** * Remove node and return modified data * - * @param string $path + * @param array|string $path * @param array $data * @param string $delimiter * @return array @@ -173,7 +173,7 @@ class ArrayManager /** * Finds node in nested array and saves its index and parent node reference * - * @param string $path + * @param array|string $path * @param array $data * @param string $delimiter * @param bool $populate @@ -181,6 +181,10 @@ class ArrayManager */ protected function find($path, array &$data, $delimiter, $populate = false) { + if (is_array($path)) { + $path = implode($delimiter, $path); + } + if ($path === null) { return false; } diff --git a/lib/internal/Magento/Framework/Stdlib/Test/Unit/ArrayManagerTest.php b/lib/internal/Magento/Framework/Stdlib/Test/Unit/ArrayManagerTest.php index 4d469236e64bb8d9bd4265103814c37abcdbf047..9ba8dbcf789857863794a1a1ea99b6c47368e477 100644 --- a/lib/internal/Magento/Framework/Stdlib/Test/Unit/ArrayManagerTest.php +++ b/lib/internal/Magento/Framework/Stdlib/Test/Unit/ArrayManagerTest.php @@ -139,6 +139,12 @@ class ArrayManagerTest extends \PHPUnit_Framework_TestCase 'data' => ['existing' => ['path' => 1]], 'value' => 'valuable data', 'result' => ['existing' => ['path' => 1], 'new' => ['path' => [2 => 'valuable data']]] + ], + 3 => [ + 'path' => ['new', 'path/2'], + 'data' => ['existing' => ['path' => 1]], + 'value' => 'valuable data', + 'result' => ['existing' => ['path' => 1], 'new' => ['path' => [2 => 'valuable data']]] ] ]; } @@ -178,6 +184,12 @@ class ArrayManagerTest extends \PHPUnit_Framework_TestCase 'data' => ['existing' => ['path' => 1]], 'value' => 'valuable data', 'result' => ['existing' => ['path' => 1]] + ], + 3 => [ + 'path' => ['new', 'path', '2'], + 'data' => ['existing' => ['path' => 1]], + 'value' => 'valuable data', + 'result' => ['existing' => ['path' => 1]] ] ]; } @@ -228,6 +240,13 @@ class ArrayManagerTest extends \PHPUnit_Framework_TestCase 'data' => ['valid' => ['path' => 'value'], 'target' => ['path' => 'exists']], 'overwrite' => true, 'result' => ['valid' => [], 'target' => ['path' => 'value']] + ], + 4 => [ + 'path' => ['valid', 'path'], + 'targetPath' => 'target/path', + 'data' => ['valid' => ['path' => 'value'], 'target' => ['path' => 'exists']], + 'overwrite' => true, + 'result' => ['valid' => [], 'target' => ['path' => 'value']] ] ]; } @@ -267,7 +286,13 @@ class ArrayManagerTest extends \PHPUnit_Framework_TestCase 'data' => [], 'value' => [true], 'result' => [] - ] + ], + 3 => [ + 'path' => ['0', 'path/1'], + 'data' => [['path' => [false, ['value' => false]]]], + 'value' => ['value' => true, 'new_value' => false], + 'result' => [['path' => [false, ['value' => true, 'new_value' => false]]]] + ], ]; } @@ -337,7 +362,12 @@ class ArrayManagerTest extends \PHPUnit_Framework_TestCase 'path' => 'invalid', 'data' => [true], 'result' => [true] - ] + ], + 3 => [ + 'path' => ['simple'], + 'data' => ['simple' => true, 'complex' => false], + 'result' => ['complex' => false] + ], ]; } @@ -550,7 +580,7 @@ class ArrayManagerTest extends \PHPUnit_Framework_TestCase 'offset' => -6, 'length' => 3, 'result' => 'path/0/goes' - ] + ], ]; }