diff --git a/DependencyInjection/CompilerPass/ExportsCompilerPass.php b/DependencyInjection/CompilerPass/ExportsCompilerPass.php index dc4d1805d..3b4b2069e 100644 --- a/DependencyInjection/CompilerPass/ExportsCompilerPass.php +++ b/DependencyInjection/CompilerPass/ExportsCompilerPass.php @@ -31,6 +31,7 @@ use Symfony\Component\DependencyInjection\Definition; * - chill.export_formatter * - chill.export_aggregator * - chill.export_filter + * - chill.export_elements_provider * * * @author Julien Fastré @@ -53,6 +54,7 @@ class ExportsCompilerPass implements CompilerPassInterface $this->compileFilters($chillManagerDefinition, $container); $this->compileAggregators($chillManagerDefinition, $container); $this->compileFormatters($chillManagerDefinition, $container); + $this->compileExportElementsProvider($chillManagerDefinition, $container); } private function compileExports(Definition $chillManagerDefinition, @@ -174,5 +176,35 @@ class ExportsCompilerPass implements CompilerPassInterface } } } + + private function compileExportElementsProvider(Definition $chillManagerDefinition, + ContainerBuilder $container) + { + $taggedServices = $container->findTaggedServiceIds( + 'chill.export_elements_provider' + ); + + $knownAliases = array(); + + foreach ($taggedServices as $id => $tagAttributes) { + foreach ($tagAttributes as $attributes) { + if (!isset($attributes["prefix"])) { + throw new \LogicException("the 'prefix' attribute is missing in your ". + "service '$id' definition"); + } + + if (array_search($attributes["prefix"], $knownAliases)) { + throw new \LogicException("There is already a chill.export_elements_provider service with prefix " + .$attributes["prefix"].". Choose another prefix."); + } + $knownAliases[] = $attributes["prefix"]; + + $chillManagerDefinition->addMethodCall( + 'addExportElementsProvider', + array(new Reference($id), $attributes["prefix"]) + ); + } + } + } } diff --git a/Export/ExportElementsProviderInterface.php b/Export/ExportElementsProviderInterface.php new file mode 100644 index 000000000..077272c9b --- /dev/null +++ b/Export/ExportElementsProviderInterface.php @@ -0,0 +1,35 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +namespace Chill\MainBundle\Export; + +/** + * Interface to provide export elements dynamically. + * + * The typical use case is providing exports or aggregators depending on + * dynamic data. Example: providing exports for reports, reports depending + * on data stored in database. + * + * @author Julien Fastré + */ +interface ExportElementsProviderInterface +{ + /** + * @return ExportElementInterface[] + */ + public function getExportElements(); +} diff --git a/Export/ExportManager.php b/Export/ExportManager.php index 3db2d138c..a46054352 100644 --- a/Export/ExportManager.php +++ b/Export/ExportManager.php @@ -169,6 +169,26 @@ class ExportManager $this->formatters[$alias] = $formatter; } + public function addExportElementsProvider(ExportElementsProviderInterface $provider, $prefix) + { + foreach ($provider->getExportElements() as $suffix => $element) { + $alias = $prefix.'_'.$suffix; + + if ($element instanceof ExportInterface) { + $this->addExport($element, $alias); + } elseif ($element instanceof FilterInterface) { + $this->addFilter($element, $alias); + } elseif ($element instanceof AggregatorInterface) { + $this->addAggregator($element, $alias); + } elseif ($element instanceof FormatterInterface) { + $this->addFormatter($element, $alias); + } else { + throw new \LogicException("This element ".\get_class($element)." " + . "is not an instance of export element"); + } + } + } + /** * * @return string[] the existing type for known exports