/** * get grid object filled * * @param \Kitpages\DataGridBundle\Grid\GridConfig $gridConfig * @param \Symfony\Component\HttpFoundation\Request $request * @return \Kitpages\DataGridBundle\Grid\Grid */ public function getGrid(GridConfig $gridConfig, Request $request) { $queryBuilder = $gridConfig->getQueryBuilder(); // create grid objet $grid = new Grid(); $grid->setGridConfig($gridConfig); $grid->setUrlTool(new UrlTool()); $grid->setRequestUri($request->getRequestUri()); $grid->setRequestCurrentRoute($request->attributes->get("_route")); $grid->setRequestCurrentRouteParams($request->attributes->get("_route_params")); $grid->setDispatcher($this->dispatcher); // create base request $gridQueryBuilder = clone $queryBuilder; // Apply filters $filter = $request->query->get($grid->getFilterFormName(), ""); $this->applyFilter($gridQueryBuilder, $grid, $filter); // Apply selector $selectorField = $request->query->get($grid->getSelectorFieldFormName(), ""); $selectorValue = $request->query->get($grid->getSelectorValueFormName(), ""); $this->applySelector($gridQueryBuilder, $grid, $selectorField, $selectorValue); // Apply sorting $sortField = $request->query->get($grid->getSortFieldFormName(), ""); $sortOrder = $request->query->get($grid->getSortOrderFormName(), ""); $this->applySort($gridQueryBuilder, $grid, $sortField, $sortOrder); // build paginator $paginatorConfig = $gridConfig->getPaginatorConfig(); if ($paginatorConfig === null) { $paginatorConfig = new PaginatorConfig(); $paginatorConfig->setCountFieldName($gridConfig->getCountFieldName()); $paginatorConfig->setName($gridConfig->getName()); $paginatorConfig->setQueryBuilder($gridQueryBuilder); } if (is_null($paginatorConfig->getQueryBuilder())) { $paginatorConfig->setQueryBuilder($gridQueryBuilder); } $paginator = $this->paginatorManager->getPaginator($paginatorConfig, $request); $grid->setPaginator($paginator); // calculate limits $gridQueryBuilder->setMaxResults($paginator->getPaginatorConfig()->getItemCountInPage()); $gridQueryBuilder->setFirstResult(($paginator->getCurrentPage() - 1) * $paginator->getPaginatorConfig()->getItemCountInPage()); // send event for changing grid query builder $event = new DataGridEvent(); $event->set("grid", $grid); $event->set("gridQueryBuilder", $gridQueryBuilder); $event->set("request", $request); $this->dispatcher->dispatch(KitpagesDataGridEvents::ON_GET_GRID_QUERY, $event); if (!$event->isDefaultPrevented()) { // execute request $query = $gridQueryBuilder->getQuery(); $event->set("query", $query); } $this->dispatcher->dispatch(KitpagesDataGridEvents::AFTER_GET_GRID_QUERY, $event); // hack : recover query from the event so the developper can build a new grid // from the gridQueryBuilder in the listener and reinject it in the event. $normalizedItemList = $this->itemListNormalizer->normalize($event->get("query"), $event->get("gridQueryBuilder"), $this->hydratorClass); // end normalization $grid->setItemList($normalizedItemList); return $grid; }
public function testPaginatorGroupBy() { // create queryBuilder $em = $this->getEntityManager(); $repository = $em->getRepository('Kitpages\\DataGridBundle\\Tests\\TestEntities\\Node'); $queryBuilder = $repository->createQueryBuilder("node"); $queryBuilder->select("node.user, count(node.id) as cnt"); $queryBuilder->groupBy("node.user"); // create EventDispatcher mock $service = $this->getMock('Symfony\\Component\\EventDispatcher\\EventDispatcher'); // create Request mock (ok this is not a mock....) $request = new \Symfony\Component\HttpFoundation\Request(); $_SERVER["REQUEST_URI"] = "/foo"; // create gridManager instance $paginatorManager = $this->getPaginatorManager(); // configure paginator $paginatorConfig = new PaginatorConfig(); $paginatorConfig->setCountFieldName("node.user"); $paginatorConfig->setItemCountInPage(3); // get paginator $paginatorConfig->setQueryBuilder($queryBuilder); $paginator = $paginatorManager->getPaginator($paginatorConfig, $request); // tests $this->assertEquals(6, $paginator->getTotalItemCount()); $this->assertEquals(2, $paginator->getTotalPageCount()); $this->assertEquals(array(1, 2), $paginator->getPageRange()); $this->assertEquals(1, $paginator->getCurrentPage()); $this->assertEquals(2, $paginator->getNextButtonPage()); }