/** * @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; }
/** * @param string $code * * @return string */ public function filterLabel($code) { $configuration = $this->manager->getDatagrid('product-grid')->getAcceptor()->getConfig(); $this->configurator->configure($configuration); $label = $configuration->offsetGetByPath(sprintf('[filters][columns][%s][label]', $code)); if (null === $label) { throw new \LogicException(sprintf('Attribute "%s" does not exists', $code)); } return $label; }
/** * Get datagrid column choices for the provided datagrid alias * * @param string $alias * @param boolean $displayedColumns * * @return array */ public function getColumnChoices($alias, $displayedColumns = false) { $choices = array(); $path = true === $displayedColumns ? sprintf('[%s]', FormatterConfiguration::COLUMNS_KEY) : sprintf(ContextConfigurator::SOURCE_PATH, ContextConfigurator::AVAILABLE_COLUMNS_KEY); $columnsConfig = $this->datagridManager->getDatagrid($alias)->getAcceptor()->getConfig()->offsetGetByPath($path); if ($columnsConfig) { foreach ($columnsConfig as $code => $meta) { $choices[$code] = $meta['label']; } } return $choices; }
/** * @dataProvider datagridProvider */ public function testGetDataGrid($name, $expectedExceptionMessage) { if ($expectedExceptionMessage) { $this->setExpectedException('\\RuntimeException', $expectedExceptionMessage); } else { $this->resolver->expects($this->once())->method('resolve')->will($this->returnArgument(1)); $configurationClass = 'Oro\\Bundle\\DataGridBundle\\Datagrid\\Common\\DatagridConfiguration'; $this->builder->expects($this->once())->method('build')->with($this->isInstanceOf($configurationClass)); $this->requestParams->expects($this->once())->method('setRootParameter')->with($this->equalTo($name)); } $this->manager->getDatagrid($name); }
/** * Get datagrid column choices for the provided datagrid alias * * @param string $alias * @param bool $displayedColumns * * @return array */ public function getColumnChoices($alias, $displayedColumns = false) { $choices = array(); $path = true === $displayedColumns ? sprintf('[%s]', FormatterConfiguration::COLUMNS_KEY) : sprintf(ContextConfigurator::SOURCE_PATH, ContextConfigurator::AVAILABLE_COLUMNS_KEY); $columnsConfig = $this->datagridManager->getDatagrid($alias)->getAcceptor()->getConfig()->offsetGetByPath($path); if ($columnsConfig) { $properties = ['label', 'sortOrder', 'group', 'groupOrder']; foreach ($columnsConfig as $code => $meta) { $choice = ['code' => $code]; foreach ($properties as $property) { if (isset($meta[$property])) { $choice[$property] = $meta[$property]; } } $choices[$code] = $choice; } } return $choices; }
/** * {@inheritdoc} */ public function configureOptions(OptionsResolver $resolver) { $configuration = $this->manager->getDatagrid($this->datagrid)->getAcceptor()->getConfig(); $this->configurator->configure($configuration); $attributes = $configuration->offsetGetByPath('[filters][columns]'); $configs = $configuration->offsetGetByPath(sprintf(ConfiguratorInterface::SOURCE_PATH, ConfiguratorInterface::USEABLE_ATTRIBUTES_KEY)); $choices = []; foreach ($attributes as $code => $filter) { if (in_array($code, $this->disallowed)) { continue; } $group = 'System'; if (isset($configs[$code])) { $group = $configs[$code]['group']; } $choices[$group][$code] = $filter['label']; } $resolver->setDefaults(['choices' => $choices]); }
/** * 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; }
/** * @param Segment $segment * @param null|string $mixin * @return DatagridInterface */ protected function getSegmentDataGrid(Segment $segment, $mixin = null) { $dataGridName = $segment->getGridPrefix() . $segment->getId(); $resultKey = $dataGridName . $mixin; if (empty($this->dataGrid[$resultKey])) { $gridParameters = array(PagerInterface::PAGER_ROOT_PARAM => array(PagerInterface::DISABLED_PARAM => true)); if ($mixin) { $gridParameters['grid-mixin'] = $mixin; } $this->dataGrid[$resultKey] = $this->dataGridManager->getDatagrid($dataGridName, $gridParameters); } return $this->dataGrid[$resultKey]; }
/** * @param MarketingList $marketingList * @param null|string $mixin * * @return DatagridInterface */ protected function getMarketingListDataGrid(MarketingList $marketingList, $mixin = null) { $dataGridName = ConfigurationProvider::GRID_PREFIX . $marketingList->getId(); $resultKey = $dataGridName . $mixin; if (empty($this->dataGrid[$resultKey])) { $gridParameters = [PagerInterface::PAGER_ROOT_PARAM => [PagerInterface::DISABLED_PARAM => true], TagsExtension::TAGS_ROOT_PARAM => [TagsExtension::DISABLED_PARAM => true]]; if ($mixin) { $gridParameters['grid-mixin'] = $mixin; } $this->dataGrid[$resultKey] = $this->dataGridManager->getDatagrid($dataGridName, $gridParameters); } return $this->dataGrid[$resultKey]; }
/** * Get the context (locale and scope) from the datagrid * * @throws \LogicException If datasource is not a ProductDatasource * * @return string[] Returns [] || ['locale' => 'en_US', 'scope' => 'mobile'] */ protected function getContextParameters() { $datagridName = $this->request->get('gridName'); $datagrid = $this->datagridManager->getDatagrid($datagridName); $dataSource = $datagrid->getDatasource(); if (!$dataSource instanceof ProductDatasource) { throw new \LogicException('getContextParameters is only implemented for ProductDatasource'); } $dataSourceParams = $dataSource->getParameters(); $contextParams = []; if (is_array($dataSourceParams)) { $contextParams = ['locale' => $dataSourceParams['dataLocale'], 'scope' => $dataSourceParams['scopeCode']]; } return $contextParams; }
/** * Returns grid metadata array * * @param string $name * @param array $params * * @return \stdClass */ public function getGridMetadata($name, $params = []) { $metaData = $this->manager->getDatagrid($name)->getMetadata(); $metaData->offsetAddToArray('options', ['url' => $this->generateUrl($name, $params)]); return $metaData->toArray(); }
/** * @expectedException \InvalidArgumentException * @expectedExceptionMessage $parameters must be an array or instance of ParameterBag. */ public function testGetDatagridThrowsException() { $datagridName = 'test_grid'; $parameters = new \stdClass(); $this->manager->getDatagrid($datagridName, $parameters); }