/** * @param string $datagridName * @param array $datagridDefinition * @param bool $recursion * * @return array */ public function resolve($datagridName, $datagridDefinition, $recursion = false) { foreach ($datagridDefinition as $key => $val) { if (is_array($val)) { $this->parentNode = $val; $datagridDefinition[$key] = $this->resolve($datagridName, $val, true); continue; } $val = $this->resolveSystemCall($datagridName, $key, $val); if (!$recursion && self::KEY_EXTENDS === $key) { // get parent grid definition, resolved $definition = $this->container->get('oro_datagrid.datagrid.manager')->getConfigurationForGrid($val); // merge them and remove extend directive $datagridDefinition = ArrayUtils::arrayMergeRecursiveDistinct($definition->toArray(), $datagridDefinition); unset($datagridDefinition['extends']); $datagridDefinition[self::KEY_EXTENDED_FROM] = isset($datagridDefinition[self::KEY_EXTENDED_FROM]) ? $datagridDefinition[self::KEY_EXTENDED_FROM] : []; $datagridDefinition[self::KEY_EXTENDED_FROM][] = $val; // run resolve again on merged grid definition $datagridDefinition = $this->resolve($val, $datagridDefinition); // break current loop cause we've just extended grid definition break; } $datagridDefinition[$key] = $val; } return $datagridDefinition; }
/** * @param DatagridConfiguration $configuration * @param string $gridName * * @return DatagridConfiguration */ public function extendConfiguration(DatagridConfiguration $configuration, $gridName) { $gridConfiguration = $this->configurationProvider->getConfiguration($gridName); $scopes = array_diff(array_keys($gridConfiguration->getIterator()->getArrayCopy()), ['name']); foreach ($scopes as $scope) { $path = sprintf('[%s]', $scope); $additionalParams = $gridConfiguration->offsetGetByPath($path); $baseParams = $configuration->offsetGetByPath($path, []); if (!is_array($additionalParams) || !is_array($baseParams)) { continue; } $configuration->offsetSetByPath($path, ArrayUtils::arrayMergeRecursiveDistinct($baseParams, $additionalParams)); } return $configuration; }
/** * Collect datagrid configurations files and pass them to the configuration provider * * @param ContainerBuilder $container */ protected function registerConfigFiles(ContainerBuilder $container) { if ($container->hasDefinition(self::PROVIDER_SERVICE_ID)) { $config = []; $configLoader = new CumulativeConfigLoader('oro_datagrid', new YamlCumulativeFileLoader('Resources/config/datagrid.yml')); $resources = $configLoader->load($container); foreach ($resources as $resource) { if (isset($resource->data[self::ROOT_PARAMETER]) && is_array($resource->data[self::ROOT_PARAMETER])) { $config = ArrayUtils::arrayMergeRecursiveDistinct($config, $resource->data[self::ROOT_PARAMETER]); } } $configProviderDef = $container->getDefinition(self::PROVIDER_SERVICE_ID); $configProviderDef->replaceArgument(0, $config); } }
/** * @param DatagridConfiguration $configuration * @param string $gridName * * @return DatagridConfiguration */ public function extendConfiguration(DatagridConfiguration $configuration, $gridName) { $gridConfiguration = $this->configurationProvider->getConfiguration($gridName); $basicAlias = $configuration->offsetGetByPath('[source][query][from][0][alias]'); foreach ($this->pathsToFix as $path) { $forFix = $gridConfiguration->offsetGetByPath($path); if ($forFix) { $gridConfiguration->offsetSetByPath($path, $this->fixMixinAlias($basicAlias, $forFix)); } } $scopes = array_diff(array_keys($gridConfiguration->getIterator()->getArrayCopy()), ['name']); foreach ($scopes as $scope) { $path = sprintf('[%s]', $scope); $additionalParams = $gridConfiguration->offsetGetByPath($path); $baseParams = $configuration->offsetGetByPath($path, []); if (!is_array($additionalParams) || !is_array($baseParams)) { continue; } $configuration->offsetSetByPath($path, ArrayUtils::arrayMergeRecursiveDistinct($baseParams, $additionalParams)); } return $configuration; }
/** * Goes across bundles and collects configurations * * @return array */ public function collectConfigs() { if (!$this->collectedConfig) { $config = $this->container->getParameter('oro_require_js'); $bundles = $this->container->getParameter('kernel.bundles'); foreach ($bundles as $bundle) { $reflection = new \ReflectionClass($bundle); if (is_file($file = dirname($reflection->getFilename()) . '/Resources/config/requirejs.yml')) { $requirejs = Yaml::parse(realpath($file)); $config = ArrayUtils::arrayMergeRecursiveDistinct($config, $requirejs); } } $this->collectedConfig = $config; } return $this->collectedConfig; }
/** * Merge configuration into one config * * @param ContainerBuilder $container * @param string $name * @param array $config * * @throws \RuntimeException */ private function mergeConfigIntoOne(ContainerBuilder $container, $name, array $config = []) { if (!$container instanceof ExtendedContainerBuilder) { throw new \RuntimeException(sprintf('%s is expected to be passed into OroPlatformExtension', 'Oro\\Component\\DependencyInjection\\ExtendedContainerBuilder')); } $originalConfig = $container->getExtensionConfig($name); if (!count($originalConfig)) { $originalConfig[] = array(); } $mergedConfig = ArrayUtils::arrayMergeRecursiveDistinct($originalConfig[0], $config); $originalConfig[0] = $mergedConfig; $container->setExtensionConfig($name, $originalConfig); }
/** * @dataProvider mergeDataProvider * * @param array $expected * @param array $first * @param array $second */ public function testArrayMergeRecursiveDistinct(array $expected, array $first, array $second) { $this->assertEquals($expected, ArrayUtils::arrayMergeRecursiveDistinct($first, $second)); }