designConfigFactory = $designConfigFactory; $this->metadataProvider = $metadataProvider; $this->designConfigDataFactory = $designConfigDataFactory; $this->configExtensionFactory = $configExtensionFactory; $this->scopeValidator = $scopeValidator; $this->storeManager = $storeManager; } /** * Create Design Configuration for scope * * @param mixed $scope * @param int $scopeId * @param array $data * @return DesignConfigInterface * @throws LocalizedException */ public function create($scope, $scopeId, array $data = []) { if (!$this->scopeValidator->isValidScope($scope, $scopeId)) { throw new LocalizedException(__('The scope or scope ID is invalid. Verify both and try again.')); } $designConfigData = $this->getDesignConfigData($scope, $scopeId); $configData = []; foreach ($this->metadataProvider->get() as $name => $metadata) { $metadata['field'] = $name; /** @var DesignConfigDataInterface $configDataObject */ $configDataObject = $this->designConfigDataFactory->create(); $configDataObject->setPath($metadata['path']); $configDataObject->setFieldConfig($metadata); if (isset($data[$name])) { $configDataObject->setValue($data[$name]); } $configData[] = $configDataObject; } /** @var DesignConfigExtension $designConfigExtension */ $designConfigExtension = $this->configExtensionFactory->create(); $designConfigExtension->setDesignConfigData($configData); $designConfigData->setExtensionAttributes($designConfigExtension); return $designConfigData; } /** * Retrieve design config data with correct scope * * @param string $scope * @param string $scopeId * @return DesignConfigInterface */ protected function getDesignConfigData($scope, $scopeId) { /** @var DesignConfigInterface $designConfigData */ $designConfigData = $this->designConfigFactory->create(); $scopeInfo = $this->getCorrectScope($scope, $scopeId); $designConfigData->setScope($scopeInfo['scope']); $designConfigData->setScopeId($scopeInfo['scopeId']); return $designConfigData; } /** * Retrieve correct scope corresponding single store mode configuration * * @param string $scope * @param string $scopeId * @return array */ protected function getCorrectScope($scope, $scopeId) { $isSingleStoreMode = $this->storeManager->isSingleStoreMode(); if ($isSingleStoreMode) { $websites = $this->storeManager->getWebsites(); $singleStoreWebsite = array_shift($websites); $scope = ScopeInterface::SCOPE_WEBSITES; $scopeId = $singleStoreWebsite->getId(); } return [ 'scope' => $scope, 'scopeId' => $scopeId ]; } }