Example #1
0
 /**
  * Handle the user request and return an array of all elements.
  *
  * @param Table   $table
  * @param Request $request
  * @param bool    $paginate   : limit selections with pagination mecanism
  * @param bool    $getObjects : get objects (else, only scalar results)
  *
  * @return Response
  *
  * table attributes are modified (if paginate=true)
  */
 public function getRows(Table $table, Request $request, $paginate = true, $getObjects = true)
 {
     $table->setRowsPerPage($request->get('rowsPerPage', 10));
     $table->setPage($request->get('page', 1));
     foreach ($request->get('hiddenColumns', []) as $hiddenColumnName => $notUsed) {
         $column = $table->getColumnByName($hiddenColumnName);
         if (!is_null($column)) {
             $column->setHidden(true);
         }
     }
     $qb = $table->getQueryBuilder();
     if ($paginate) {
         // @todo: had possibility to define custom count queries
         $this->setTotalRows($table);
         $this->setFilteredRows($table, $request);
         // compute last page and floor curent page
         $table->setLastPage(ceil($table->getFilteredRows() / $table->getRowsPerPage()));
         if ($table->getPage() > $table->getLastPage()) {
             $table->setPage($table->getLastPage());
         }
         $qb->setMaxResults($table->getRowsPerPage());
         $qb->setFirstResult(($table->getPage() - 1) * $table->getRowsPerPage());
     }
     // add filters
     $this->addSearch($table, $request, $qb);
     // handle ordering
     $queryParams = $request->get($table->getFormId());
     if (isset($queryParams['sortColumn']) && $queryParams['sortColumn'] != '') {
         $column = $table->getColumnByName($queryParams['sortColumn']);
         // if column exists
         if (!is_null($column)) {
             if (!is_null($column->getSort())) {
                 $qb->resetDQLPart('orderBy');
                 if (isset($queryParams['sortReverse'])) {
                     $sortReverse = $queryParams['sortReverse'];
                 } else {
                     $sortReverse = false;
                 }
                 foreach ($column->getAutoSort($sortReverse) as $sortField => $sortOrder) {
                     $qb->addOrderBy($sortField, $sortOrder);
                 }
             }
         }
     }
     // force a final ordering by id
     $qb->addOrderBy($table->getAlias() . '.id', 'asc');
     $query = $qb->getQuery();
     // if we need to get objects
     if ($getObjects) {
         // @todo: change the method to get objects from SCALAR selection, in place of a second query....
         if (!is_null($qb->getDQLPart('groupBy'))) {
             // results as objects
             $objects = [];
             foreach ($query->getResult(Query::HYDRATE_OBJECT) as $object) {
                 if (is_object($object)) {
                     $objects[$object->getId()] = $object;
                 } elseif (isset($object[0]) && is_object($object[0])) {
                     $objects[$object[0]->getId()] = $object[0];
                 }
             }
         }
     }
     $rows = $query->getResult(Query::HYDRATE_SCALAR);
     // if we need to get objects
     if ($getObjects) {
         // results as scalar
         foreach ($rows as &$row) {
             if (isset($objects[$row[$table->getAlias() . '_id']])) {
                 $row['object'] = $objects[$row[$table->getAlias() . '_id']];
             }
         }
     }
     return $rows;
 }