/** * @param DatagridInterface $dataGrid * @return bool */ public function isDatagridApplicable(DatagridInterface $dataGrid) { if (!$dataGrid->getDatasource() instanceof OrmDatasource) { return false; } return $dataGrid->getConfig()->offsetGetByPath(EntityPaginationExtension::ENTITY_PAGINATION_PATH) === true; }
/** * Prepare query builder, apply mass action parameters and call handler * * @param DatagridInterface $datagrid * @param MassActionInterface $massAction * @param boolean $inset * @param string $values * * @return MassActionResponseInterface */ protected function performMassAction(DatagridInterface $datagrid, MassActionInterface $massAction, $inset, $values) { $qb = $datagrid->getAcceptedDatasource()->getQueryBuilder(); $repository = $datagrid->getDatasource()->getMassActionRepository(); $repository->applyMassActionParameters($qb, $inset, $values); $handler = $this->getMassActionHandler($massAction); return $handler->handle($datagrid, $massAction); }
/** * @param DatagridInterface $dataGrid * @return string */ protected function getEntityName(DatagridInterface $dataGrid) { /** @var OrmDatasource $dataSource */ $dataSource = $dataGrid->getDatasource(); $queryBuilder = $dataSource->getQueryBuilder(); $entityName = $queryBuilder->getRootEntities()[0]; return $this->doctrineHelper->getEntityMetadata($entityName)->getName(); }
function let(MassActionHandlerRegistry $handlerRegistry, ManagerInterface $manager, RequestParameters $requestParams, MassActionParametersParser $parametersParser, DatagridInterface $grid, Acceptor $acceptor, DatasourceInterface $acceptedDatasource, DatasourceInterface $datasource, QueryBuilder $queryBuilder) { $this->beConstructedWith($handlerRegistry, $manager, $requestParams, $parametersParser); $acceptedDatasource->getQueryBuilder()->willReturn($queryBuilder); $grid->getAcceptor()->willReturn($acceptor); $grid->getAcceptedDatasource()->willReturn($acceptedDatasource); $grid->getDatasource()->willReturn($datasource); $manager->getDatagrid('grid')->willReturn($grid); }
function it_handles_export_mass_action($eventDispatcher, $hydrator, DatagridInterface $datagrid, DatasourceInterface $datasource, EditMassAction $massAction) { $objectIds = array('foo', 'bar', 'baz'); $eventDispatcher->dispatch(MassActionEvents::MASS_EXPORT_PRE_HANDLER, Argument::type('Pim\\Bundle\\DataGridBundle\\Extension\\MassAction\\Event\\MassActionEvent'))->shouldBeCalled(); $eventDispatcher->dispatch(MassActionEvents::MASS_EXPORT_POST_HANDLER, Argument::type('Pim\\Bundle\\DataGridBundle\\Extension\\MassAction\\Event\\MassActionEvent'))->shouldBeCalled(); $datagrid->getDatasource()->willReturn($datasource); $datasource->setHydrator($hydrator)->shouldBeCalled(); $datasource->getResults()->willReturn($objectIds); $this->handle($datagrid, $massAction)->shouldReturn($objectIds); }
/** * @return ResultsObject */ protected function getGridData() { if (null !== $this->gridDataSource) { $this->grid->setDatasource(clone $this->gridDataSource); } else { $this->gridDataSource = clone $this->grid->getDatasource(); } $this->grid->getParameters()->set(PagerInterface::PAGER_ROOT_PARAM, [PagerInterface::PAGE_PARAM => $this->page, PagerInterface::PER_PAGE_PARAM => $this->pageSize]); return $this->grid->getData(); }
function let(HydratorInterface $hydrator, TranslatorInterface $translator, EventDispatcherInterface $eventDispatcher, ProductManager $productManager, DatagridInterface $datagrid, DatasourceInterface $datasource, DeleteMassAction $massAction, ActionConfiguration $options, ProductMassActionRepository $massActionRepo) { $this->beConstructedWith($hydrator, $translator, $eventDispatcher, $productManager); $translator->trans('qux')->willReturn('qux'); $datagrid->getDatasource()->willReturn($datasource); $datasource->setHydrator($hydrator)->shouldBeCalled(); $datasource->getMassActionRepository()->willReturn($massActionRepo); // prepare mass action response $massAction->getOptions()->willReturn($options); $options->offsetGetByPath(Argument::cetera())->willReturn('qux'); }
/** * @param DatagridInterface $datagrid * * @return string|null */ public function getEntityName(DatagridInterface $datagrid) { /** @var OrmDatasource $dataSource */ $dataSource = $datagrid->getDatasource(); if (!$dataSource) { return null; } /** @var QueryBuilder $queryBuilder */ $queryBuilder = $dataSource->getQueryBuilder(); $rootEntities = $queryBuilder->getRootEntities(); return reset($rootEntities); }
/** * {@inheritdoc} */ public function handle(DatagridInterface $datagrid, MassActionInterface $massAction) { // dispatch pre handler event $massActionEvent = new MassActionEvent($datagrid, $massAction, []); $this->eventDispatcher->dispatch(MassActionEvents::MASS_EXPORT_PRE_HANDLER, $massActionEvent); $datasource = $datagrid->getDatasource(); $datasource->setHydrator($this->hydrator); $results = $datasource->getResults(); // dispatch post handler event $massActionEvent = new MassActionEvent($datagrid, $massAction, $results); $this->eventDispatcher->dispatch(MassActionEvents::MASS_EXPORT_POST_HANDLER, $massActionEvent); return $results; }
/** * {@inheritdoc} */ public function handle(DatagridInterface $datagrid, MassActionInterface $massAction) { // dispatch pre handler event $massActionEvent = new MassActionEvent($datagrid, $massAction, array()); $this->eventDispatcher->dispatch(MassActionEvents::MASS_EDIT_PRE_HANDLER, $massActionEvent); $datasource = $datagrid->getDatasource(); $datasource->setHydrator($this->hydrator); // hydrator uses index by id $objectIds = $datasource->getResults(); // dispatch post handler event $massActionEvent = new MassActionEvent($datagrid, $massAction, array()); $this->eventDispatcher->dispatch(MassActionEvents::MASS_EDIT_POST_HANDLER, $massActionEvent); return $objectIds; }
/** * {@inheritdoc} */ public function handle(DatagridInterface $datagrid, MassActionInterface $massAction) { // dispatch pre handler event $massActionEvent = new MassActionEvent($datagrid, $massAction, []); $this->eventDispatcher->dispatch(MassActionEvents::MASS_DELETE_PRE_HANDLER, $massActionEvent); $datasource = $datagrid->getDatasource(); $datasource->setHydrator($this->hydrator); // hydrator uses index by id $objectIds = $datasource->getResults(); try { $countRemoved = $datasource->getMassActionRepository()->deleteFromIds($objectIds); } catch (\Exception $e) { $errorMessage = $e->getMessage(); return new MassActionResponse(false, $this->translator->trans($errorMessage)); } // dispatch post handler event $massActionEvent = new MassActionEvent($datagrid, $massAction, $objectIds); $this->eventDispatcher->dispatch(MassActionEvents::MASS_DELETE_POST_HANDLER, $massActionEvent); return $this->getResponse($massAction, $countRemoved); }
/** * Binds datagrid parameters to datasource query. * * Example of usage: * <code> * // get parameter "name" from datagrid parameter bag and add it to datasource query * $queryParameterBinder->bindParameters($datagrid, ['name']); * * // get parameter "id" from datagrid parameter bag and add it to datasource query as parameter "client_id" * $queryParameterBinder->bindParameters($datagrid, ['client_id' => 'id']); * * // get parameter "email" from datagrid parameter bag and add it to datasource query, all other existing query * // parameters will be cleared * $queryParameterBinder->bindParameters($datagrid, ['email'], false); * * // get parameter with path "_parameters.data_in" from datagrid parameter * // and add it to datasource query as parameter "data_in" * $queryParameterBinder->bindParameters($datagrid, ['data_in' => '_parameters.data_in']); * * // get parameter with path "_parameters.data_in" from datagrid parameter * // and add it to datasource query as parameter "data_in", * // if parameter is not exist, set default value - empty array, * // and do the same for data_not_in * $queryParameterBinder->bindParameters( * $datagrid, * [ * 'data_in' => [ * 'path' => '_parameters.data_in', * 'default' => [], * ], * [ * 'name' => 'data_not_in' * 'path' => '_parameters.data_not_in', * 'default' => [], * ] * ] * ); * </code> * * @param DatagridInterface $datagrid * @param array $datasourceToDatagridParameters * @param bool $append * @throws InvalidArgumentException When datasource of grid is not ORM * @throws NoSuchPropertyException When datagrid has no parameter with specified name or path */ public function bindParameters(DatagridInterface $datagrid, array $datasourceToDatagridParameters, $append = true) { if (!$datasourceToDatagridParameters) { return; } $datasource = $datagrid->getDatasource(); if (!$datasource instanceof OrmDatasource) { throw new InvalidArgumentException(sprintf('Datagrid datasource has unexpected type "%s", "%s" is expected.', get_class($datasource), 'Oro\\Bundle\\DataGridBundle\\Datasource\\Orm\\OrmDatasource')); } /** @var QueryBuilder $queryBuilder */ $queryBuilder = $datasource->getQueryBuilder(); $queryParameters = $queryBuilder->getParameters(); if (!$append) { $queryParameters->clear(); } $datagridParameters = $datagrid->getParameters()->all(); foreach ($datasourceToDatagridParameters as $index => $value) { $config = $this->parseArrayParameterConfig($index, $value); $value = $this->getParameterValue($datagridParameters, $config); $type = isset($config['type']) ? $config['type'] : null; $this->addOrReplaceParameter($queryParameters, new Parameter($config['name'], $value, $type)); } }
/** * @param DatagridInterface $datagrid * @param string $identifierField * @param bool $inset * @param array $values * * @return QueryBuilder * @throws LogicException */ protected function getDatagridQuery(DatagridInterface $datagrid, $identifierField = 'id', $inset = true, $values = []) { $datasource = $datagrid->getDatasource(); if (!$datasource instanceof OrmDatasource) { throw new LogicException("Mass actions applicable only for datagrids with ORM datasource."); } /** @var QueryBuilder $qb */ $qb = $datagrid->getAcceptedDatasource()->getQueryBuilder(); if ($values) { $valueWhereCondition = $inset ? $qb->expr()->in($identifierField, $values) : $qb->expr()->notIn($identifierField, $values); $qb->andWhere($valueWhereCondition); } return $qb; }