/** * Merge metadata item to components * * @param array $bundleComponents * @param array $metadata * @param bool $reverseMerge * @return array * @throws LocalizedException */ protected function mergeMetadataItem(array $bundleComponents, array $metadata, $reverseMerge = false) { foreach ($metadata as $name => $data) { $selfData = $data; if (isset($selfData['children'])) { unset($selfData['children']); } list($bundleComponents, $isMerged) = $this->mergeMetadataElement($bundleComponents, $name, $selfData, $reverseMerge); if (!$isMerged) { if (!isset($data['arguments']['data']['config']['componentType'])) { throw new LocalizedException(new Phrase('The configuration parameter "componentType" is a required for "%1" component.', [$name])); } $rawComponentData = $this->componentManager->createRawComponentData($data['arguments']['data']['config']['componentType']); list(, $componentArguments) = $this->argumentsResolver($name, $rawComponentData); $arguments = array_replace_recursive($componentArguments, $data['arguments']); $rawComponentData[ManagerInterface::COMPONENT_ARGUMENTS_KEY] = $arguments; $bundleComponents[$name] = $rawComponentData; $bundleComponents[$name]['children'] = []; } if (isset($data['children']) && is_array($data['children'])) { $bundleComponents[$name]['children'] = $this->mergeMetadataItem($bundleComponents[$name]['children'], $data['children'], $reverseMerge); } } return $bundleComponents; }
/** * Get bundle children * * @param array $children * @return array * @throws LocalizedException */ protected function getBundleChildren(array $children = []) { $bundleChildren = []; foreach ($children as $identifier => $config) { if (!isset($config['componentType'])) { throw new LocalizedException(new Phrase('The configuration parameter "componentType" is a required for "%1" component.', $identifier)); } $rawComponentData = $this->componentManager->createRawComponentData($config['componentType']); list(, $componentArguments) = $this->argumentsResolver($identifier, $rawComponentData); $arguments = array_replace_recursive($componentArguments, ['data' => ['config' => $config]]); $rawComponentData[ManagerInterface::COMPONENT_ARGUMENTS_KEY] = $arguments; $bundleChildren[$identifier] = $rawComponentData; $bundleChildren[$identifier]['children'] = []; if (isset($arguments['data']['config']['children'])) { $bundleChildren[$identifier]['children'] = $this->getBundleChildren($arguments['data']['config']['children']); } } return $bundleChildren; }
/** * Create component object * * @param string $identifier * @param string $name * @param array $arguments * @return UiComponentInterface * @throws \Magento\Framework\Exception\LocalizedException */ public function create($identifier, $name = null, array $arguments = []) { if ($name === null) { $bundleComponents = $this->componentManager->prepareData($identifier)->getData($identifier); if (empty($bundleComponents)) { throw new LocalizedException(new \Magento\Framework\Phrase('You use an empty set.')); } list($className, $componentArguments) = $this->argumentsResolver($identifier, $bundleComponents[$identifier]); $componentArguments = array_merge($componentArguments, $arguments); if (!isset($componentArguments['context'])) { throw new LocalizedException(new \Magento\Framework\Phrase('Context, is required argument.')); } $componentContext = $componentArguments['context']; $components = []; foreach ($bundleComponents[$identifier]['children'] as $childrenIdentifier => $childrenData) { $children = $this->createChildComponent($childrenData, $componentContext, $childrenIdentifier); $components[$childrenIdentifier] = $children; } $components = array_filter($components); $componentArguments['components'] = $components; /** @var \Magento\Framework\View\Element\UiComponentInterface $component */ $component = $this->objectManager->create($className, array_merge($componentArguments, $arguments)); return $component; } else { $defaultData = $this->componentManager->createRawComponentData($name); list($className, $componentArguments) = $this->argumentsResolver($identifier, $defaultData); /** @var \Magento\Framework\View\Element\UiComponentInterface $component */ $component = $this->objectManager->create($className, array_merge($componentArguments, $arguments)); return $component; } }