diff --git a/Controller/ExportController.php b/Controller/ExportController.php index 26ae3d187..4c777db08 100644 --- a/Controller/ExportController.php +++ b/Controller/ExportController.php @@ -222,7 +222,7 @@ class ExportController extends Controller 'csrf_protection' => $isGenerate ? false : true, )); - if ($step === 'centers') { + if ($step === 'centers' or $step === 'generate_centers') { $builder->add('centers', PickCenterType::class, array( 'export_alias' => $alias )); @@ -393,7 +393,11 @@ class ExportController extends Controller { $exportManager = $this->get('chill.main.export_manager'); - $formExport = $this->createCreateFormExport($alias, 'generate_export'); + $formCenters = $this->createCreateFormExport($alias, 'generate_centers'); + $formCenters->handleRequest($request); + $dataCenters = $formCenters->getData(); + + $formExport = $this->createCreateFormExport($alias, 'generate_export', $dataCenters); $formExport->handleRequest($request); $dataExport = $formExport->getData(); @@ -402,6 +406,7 @@ class ExportController extends Controller $formFormatter->handleRequest($request); $dataFormatter = $formFormatter->getData(); - return $exportManager->generate($alias, $dataExport['export'], $dataFormatter['formatter']); + return $exportManager->generate($alias, $dataCenters['centers'], + $dataExport['export'], $dataFormatter['formatter']); } } diff --git a/Export/ExportInterface.php b/Export/ExportInterface.php index 14cb21424..fd0126c8b 100644 --- a/Export/ExportInterface.php +++ b/Export/ExportInterface.php @@ -39,9 +39,10 @@ interface ExportInterface extends ExportElementInterface * * @param QueryBuilder $qb * @param array $requiredModifiers + * @param array $acl an array where each row as a `center` key containing the Chill\MainBundle\Entity\Center, and `circles` containing the reachable circles * TODO : we should add ability to receive data from a form */ - public function initiateQuery(QueryBuilder $qb, array $requiredModifiers); + public function initiateQuery(QueryBuilder $qb, array $requiredModifiers, $acl); public function buildForm(FormBuilderInterface $builder); diff --git a/Export/ExportManager.php b/Export/ExportManager.php index fc7409977..0ef3e1272 100644 --- a/Export/ExportManager.php +++ b/Export/ExportManager.php @@ -30,6 +30,7 @@ use Doctrine\ORM\QueryBuilder; use Chill\MainBundle\Security\Authorization\AuthorizationHelper; use Symfony\Component\Security\Core\Authorization\AuthorizationChecker; use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; +use Chill\MainBundle\Form\Type\Export\PickCenterType; /** * Collects all agregators, filters and export from @@ -338,12 +339,14 @@ class ExportManager * @param mixed[] $data * @return Response */ - public function generate($exportAlias, array $data, array $formatterData) + public function generate($exportAlias, array $pickedCentersData, array $data, array $formatterData) { $export = $this->getExport($exportAlias); $qb = $this->em->createQueryBuilder(); + $centers = $this->getPickedCenters($pickedCentersData); - $qb = $export->initiateQuery($qb, $this->retrieveUsedModifiers($data)); + $qb = $export->initiateQuery($qb, $this->retrieveUsedModifiers($data), + $this->buildCenterReachableScopes($centers, $export)); //handle filters $this->handleFilters($export, $qb, $data['filters']); @@ -371,6 +374,26 @@ class ExportManager $filters, $aggregatorsData); } + /** + * build the array required for defining centers and circles in the initiate + * queries of ExportElementsInterfaces + * + * @param \Chill\MainBundle\Entity\Center[] $centers + */ + private function buildCenterReachableScopes(array $centers, ExportElementInterface $element) { + $r = array(); + + foreach($centers as $center) { + $r[] = array( + 'center' => $center, + 'circles' => $this->authorizationHelper->getReachableScopes($this->user, + $element->requiredRole(), $center) + ); + } + + return $r; + } + /** * get the aggregators typse used in the form export data * @@ -397,7 +420,7 @@ class ExportManager public function getPickedCenters(array $data) { - return $data['c']; + return $data[PickCenterType::CENTERS_IDENTIFIERS]; } /** diff --git a/Form/Type/Export/PickCenterType.php b/Form/Type/Export/PickCenterType.php index 102290ada..4f375bc5b 100644 --- a/Form/Type/Export/PickCenterType.php +++ b/Form/Type/Export/PickCenterType.php @@ -49,6 +49,8 @@ class PickCenterType extends AbstractType */ protected $exportManager; + const CENTERS_IDENTIFIERS = 'c'; + /** * * @var AuthorizationHelper @@ -76,7 +78,7 @@ class PickCenterType extends AbstractType $centers = $this->authorizationHelper->getReachableCenters($this->user, $export->requiredRole()); - $builder->add('c', EntityType::class, array( + $builder->add(self::CENTERS_IDENTIFIERS, EntityType::class, array( 'class' => 'ChillMainBundle:Center', 'query_builder' => function(EntityRepository $er) use ($centers) { $qb = $er->createQueryBuilder('c');