/**
  * 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;
 }
Beispiel #3
-1
 /**
  * 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;
     }
 }