/**
  * @param string $datagridName
  * @param string $actionName
  * @param array  $parameters
  * @param array  $data
  *
  * @throws \LogicException
  *
  * @return MassActionResponseInterface
  */
 public function dispatch($datagridName, $actionName, array $parameters, array $data = [])
 {
     $inset = true;
     if (isset($parameters['inset'])) {
         $inset = $parameters['inset'];
     }
     $values = [];
     if (isset($parameters['values'])) {
         $values = $parameters['values'];
     }
     $filters = [];
     if (isset($parameters['filters'])) {
         $filters = $parameters['filters'];
     }
     if ($inset && empty($values)) {
         throw new \LogicException(sprintf('There is nothing to do in mass action "%s"', $actionName));
     }
     // create datagrid
     $datagrid = $this->manager->getDatagrid($datagridName);
     // set filter data
     $this->requestParams->set(OrmFilterExtension::FILTER_ROOT_PARAM, $filters);
     // create mediator
     $massAction = $this->getMassActionByName($actionName, $datagrid);
     $identifier = $this->getIdentifierField($massAction);
     $qb = $this->getDatagridQuery($datagrid, $identifier, $inset, $values);
     $resultIterator = $this->getResultIterator($qb);
     $mediator = new MassActionMediator($massAction, $datagrid, $resultIterator, $data);
     // perform mass action
     $handle = $this->getMassActionHandler($massAction);
     $result = $handle->handle($mediator);
     return $result;
 }
 /**
  * Dispatch datagrid mass action
  *
  * @param Request $request
  *
  * @throws \LogicException
  *
  * @return array
  */
 protected function prepareMassActionParameters(Request $request)
 {
     $parameters = $this->parametersParser->parse($request);
     $inset = $this->prepareInsetParameter($parameters);
     $values = $this->prepareValuesParameter($parameters);
     $filters = $this->prepareFiltersParameter($parameters);
     $actionName = $request->get('actionName');
     if ($inset && empty($values)) {
         throw new \LogicException(sprintf('There is nothing to do in mass action "%s"', $actionName));
     }
     $datagridName = $request->get('gridName');
     $datagrid = $this->manager->getDatagrid($datagridName);
     $massAction = $this->getMassActionByName($actionName, $datagrid);
     $this->requestParams->set(FilterExtension::FILTER_ROOT_PARAM, $filters);
     $qb = $datagrid->getAcceptedDatasource()->getQueryBuilder();
     if (self::FAMILY_GRID_NAME === $datagridName) {
         $qbLocaleParameter = $qb->getParameter('localeCode');
         if (null !== $qbLocaleParameter && null === $qbLocaleParameter->getValue()) {
             $qb->setParameter('localeCode', $request->query->get('dataLocale'));
         }
     }
     $repository = $datagrid->getDatasource()->getMassActionRepository();
     $repository->applyMassActionParameters($qb, $inset, $values);
     return ['datagrid' => $datagrid, 'massAction' => $massAction, 'inset' => $inset, 'values' => $values];
 }
 /**
  * Dispatch datagrid mass action
  *
  * @param Request $request
  *
  * @throws \LogicException
  *
  * @return MassActionResponseInterface
  */
 public function dispatch(Request $request)
 {
     $parameters = $this->parametersParser->parse($request);
     $datagridName = $request->get('gridName');
     $actionName = $request->get('actionName');
     $inset = isset($parameters['inset']) ? $parameters['inset'] : true;
     $values = isset($parameters['values']) ? $parameters['values'] : [];
     $filters = isset($parameters['filters']) ? $parameters['filters'] : [];
     if ($inset && empty($values)) {
         throw new \LogicException(sprintf('There is nothing to do in mass action "%s"', $actionName));
     }
     $datagrid = $this->manager->getDatagrid($datagridName);
     $massAction = $this->getMassActionByName($actionName, $datagrid);
     $this->requestParams->set(FilterExtension::FILTER_ROOT_PARAM, $filters);
     return $this->performMassAction($datagrid, $massAction, $inset, $values);
 }
 /**
  * Creates a query builder based on the grid
  *
  * @param Request $request
  * @param string  $datagridName
  *
  * @return QueryBuilder
  *
  * @throws \LogicException
  */
 public function createQueryBuilder(Request $request, $datagridName)
 {
     $parameters = $this->parametersParser->parse($request);
     if ($parameters['inset'] && empty($parameters['values'])) {
         throw new \LogicException(sprintf('This request is empty'));
     }
     $datagrid = $this->manager->getDatagrid($datagridName);
     $this->requestParams->set(OrmFilterExtension::FILTER_ROOT_PARAM, $parameters['filters']);
     $datasource = $datagrid->getDatasource();
     if (!$datasource instanceof Datasource) {
         throw new \LogicException("Mass actions applicable only for datagrids with ORM datasource.");
     }
     $qb = $datagrid->getAcceptedDatasource()->getQueryBuilder();
     if (count($parameters['values'])) {
         $valueWhereCondition = $parameters['inset'] ? $qb->expr()->in('o.id', $parameters['values']) : $qb->expr()->notIn('o.id', $parameters['values']);
         $qb->andWhere($valueWhereCondition);
     }
     $qb->setMaxResults(null);
     $qb->setFirstResult(null);
     return $qb;
 }