Esempio n. 1
0
 /**
  * @throws \Exception
  */
 public function execute()
 {
     $qb = $this->getData();
     /*
      * Step 1) Apply needed columns
      */
     $selectColumns = [];
     foreach ($this->getColumns() as $col) {
         if (!$col instanceof Column\Select) {
             continue;
         }
         $colString = $col->getSelectPart1();
         if ($col->getSelectPart2() != '') {
             $colString .= '.' . $col->getSelectPart2();
         }
         $colString .= ' ' . $col->getUniqueId();
         $selectColumns[] = $colString;
     }
     $qb->resetDQLPart('select');
     $qb->select($selectColumns);
     /*
      * Step 2) Apply sorting
      */
     if (!empty($this->getSortConditions())) {
         // Minimum one sort condition given -> so reset the default orderBy
         $qb->resetDQLPart('orderBy');
         foreach ($this->getSortConditions() as $key => $sortCondition) {
             /* @var $col \ZfcDatagrid\Column\AbstractColumn */
             $col = $sortCondition['column'];
             if (!$col instanceof Column\Select) {
                 throw new \Exception('This column cannot be sorted: ' . $col->getUniqueId());
             }
             /* @var $col \ZfcDatagrid\Column\Select */
             $colString = $col->getSelectPart1();
             if ($col->getSelectPart2() != '') {
                 $colString .= '.' . $col->getSelectPart2();
             }
             if ($col->getType() instanceof Type\Number) {
                 $qb->addSelect('ABS(' . $colString . ') sortColumn' . $key);
                 $qb->add('orderBy', new Expr\OrderBy('sortColumn' . $key, $sortCondition['sortDirection']), true);
             } else {
                 $qb->add('orderBy', new Expr\OrderBy($col->getUniqueId(), $sortCondition['sortDirection']), true);
             }
         }
     }
     /*
      * Step 3) Apply filters
      */
     $filterColumn = new Doctrine2\Filter($qb);
     foreach ($this->getFilters() as $filter) {
         /* @var $filter \ZfcDatagrid\Filter */
         if ($filter->isColumnFilter() === true) {
             $filterColumn->applyFilter($filter);
         }
     }
     /*
      * Step 4) Pagination
      */
     $this->setPaginatorAdapter(new PaginatorAdapter($qb));
 }