/** * Add children data * * @param array $topNode * @param UiComponentInterface $component * @param string $componentType * @return void * @throws \Magento\Framework\Exception\LocalizedException */ protected function addChildren(array &$topNode, UiComponentInterface $component, $componentType) { $childrenAreas = []; $collectedComponents = []; foreach ($component->getContext()->getDataProvider()->getMeta() as $name => $meta) { $childComponent = $component->getComponent($name); if (null === $childComponent) { continue; } $collectedComponents[$childComponent->getName()] = true; if (isset($meta['is_collection']) && $meta['is_collection'] === true) { $label = $childComponent->getData('config/label'); $this->component->getContext()->addComponentDefinition('collection', ['component' => 'Magento_Ui/js/form/components/collection', 'extends' => $this->namespace]); /** * @var UiComponentInterface $childComponent * @var array $structure */ list($childComponent, $structure) = $this->prepareChildComponents($childComponent, $name); $childrenStructure = $structure[$name]['children']; $structure[$name]['children'] = [$name . '_collection' => ['type' => 'collection', 'config' => ['active' => 1, 'removeLabel' => __('Remove ' . $label), 'addLabel' => __('Add New ' . $label), 'removeMessage' => $childComponent->getData('config/removeMessage'), 'itemTemplate' => 'item_template'], 'children' => ['item_template' => ['type' => $this->namespace, 'isTemplate' => true, 'component' => 'Magento_Ui/js/form/components/collection/item', 'childType' => 'group', 'config' => ['label' => __('New ' . $label)], 'children' => $childrenStructure]]]]; } else { /** * @var UiComponentInterface $childComponent * @var array $structure */ list($childComponent, $structure) = $this->prepareChildComponents($childComponent, $name); } $tabComponent = $this->createTabComponent($childComponent, $name); $childrenAreas[$name] = ['type' => $tabComponent->getComponentName(), 'dataScope' => 'data.' . $name, 'config' => isset($meta['config']) ? $meta['config'] : [], 'insertTo' => [$this->namespace . '.sections' => ['position' => $this->getNextSortIncrement()]], 'children' => $structure]; } $this->addWrappedBlock($childrenAreas, $component, $collectedComponents); $this->structure[static::AREAS_KEY]['children'] = $childrenAreas; $topNode = $this->structure; }