/** * 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; }
/** * get Paginator object * * @param \Kitpages\DataGridBundle\Paginator\PaginatorConfig $paginatorConfig * @param \Symfony\Component\HttpFoundation\Request $request * @return \Kitpages\DataGridBundle\Paginator\Paginator */ public function getPaginator(PaginatorConfig $paginatorConfig, Request $request) { $queryBuilder = $paginatorConfig->getQueryBuilder(); // insert default values in paginator config $paginatorConfig = clone $paginatorConfig; if (is_null($paginatorConfig->getItemCountInPage())) { $paginatorConfig->setItemCountInPage($this->paginatorParameterList["item_count_in_page"]); } if (is_null($paginatorConfig->getVisiblePageCountInPaginator())) { $paginatorConfig->setVisiblePageCountInPaginator($this->paginatorParameterList["visible_page_count_in_paginator"]); } // create paginator object $paginator = new Paginator(); $paginator->setPaginatorConfig($paginatorConfig); $paginator->setUrlTool(new UrlTool()); $paginator->setRequestUri($request->getRequestUri()); // get currentPage $paginator->setCurrentPage($request->query->get($paginatorConfig->getRequestQueryName("currentPage"), 1)); // calculate total object count $countQueryBuilder = clone $queryBuilder; $countQueryBuilder->select("count(DISTINCT " . $paginatorConfig->getCountFieldName() . ")"); $countQueryBuilder->setMaxResults(null); $countQueryBuilder->setFirstResult(null); $countQueryBuilder->resetDQLPart('groupBy'); $countQueryBuilder->resetDQLPart('orderBy'); // event to change paginator query builder $event = new DataGridEvent(); $event->set("paginator", $paginator); $event->set("paginatorQueryBuilder", $countQueryBuilder); $event->set("request", $request); $this->dispatcher->dispatch(KitpagesDataGridEvents::ON_GET_PAGINATOR_QUERY, $event); if (!$event->isDefaultPrevented()) { $query = $countQueryBuilder->getQuery(); $event->set("query", $query); } $this->dispatcher->dispatch(KitpagesDataGridEvents::AFTER_GET_PAGINATOR_QUERY, $event); // hack : recover query from the event so the developper can build a new query // from the paginatorQueryBuilder in the listener and reinject it in the event. $query = $event->get("query"); try { $totalCount = $query->getSingleScalarResult(); $paginator->setTotalItemCount($totalCount); } catch (\Doctrine\ORM\NoResultException $e) { $paginator->setTotalItemCount(0); } // calculate total page count if ($paginator->getTotalItemCount() == 0) { $paginator->setTotalPageCount(0); } else { $paginator->setTotalPageCount((int) (($paginator->getTotalItemCount() - 1) / $paginatorConfig->getItemCountInPage() + 1)); } // change current page if needed if ($paginator->getCurrentPage() > $paginator->getTotalPageCount()) { $paginator->setCurrentPage(1); } // calculate nbPageLeft and nbPageRight $nbPageLeft = (int) ($paginatorConfig->getVisiblePageCountInPaginator() / 2); $nbPageRight = $paginatorConfig->getVisiblePageCountInPaginator() - 1 - $nbPageLeft; // calculate lastPage to display $maxPage = min($paginator->getTotalPageCount(), $paginator->getCurrentPage() + $nbPageRight); // adapt minPage and maxPage $minPage = max(1, $maxPage - ($paginatorConfig->getVisiblePageCountInPaginator() - 1)); $maxPage = min($paginator->getTotalPageCount(), $minPage + ($paginatorConfig->getVisiblePageCountInPaginator() - 1)); $paginator->setMinPage($minPage); $paginator->setMaxPage($maxPage); // calculate previousButton if ($paginator->getCurrentPage() == 1) { $paginator->setPreviousButtonPage(null); } else { $paginator->setPreviousButtonPage($paginator->getCurrentPage() - 1); } // calculate nextButton if ($paginator->getCurrentPage() == $paginator->getTotalPageCount()) { $paginator->setNextButtonPage(null); } else { $paginator->setNextButtonPage($paginator->getCurrentPage() + 1); } return $paginator; }