/** * Generates the paginated resultset * * @param ItemsEvent $event */ public function items(ItemsEvent $event) { $query = $event->getQuery(); $distinct = $event->isDistinct(); $result = null; if ($distinct) { $limitSubQuery = QueryHelper::cloneQuery($query); $limitSubQuery->setParameters($query->getParameters()); QueryHelper::addCustomTreeWalker($limitSubQuery, self::TREE_WALKER_LIMIT_SUBQUERY); $limitSubQuery->setFirstResult($event->getOffset())->setMaxResults($event->getRowCountPerPage()); $ids = array_map('current', $limitSubQuery->getScalarResult()); // create where-in query $whereInQuery = QueryHelper::cloneQuery($query); QueryHelper::addCustomTreeWalker($whereInQuery, self::TREE_WALKER_WHERE_IN); $whereInQuery->setHint(WhereInWalker::HINT_PAGINATOR_ID_COUNT, count($ids))->setFirstResult(null)->setMaxResults(null); foreach ($ids as $i => $id) { $whereInQuery->setParameter(WhereInWalker::PAGINATOR_ID_ALIAS . '_' . ++$i, $id); } $result = $whereInQuery->getResult(); } else { $query->setFirstResult($event->getOffset())->setMaxResults($event->getRowCountPerPage()); $result = $query->getResult(); } $event->stopPropagation(); $event->setItems($result); }
/** * Adds a sorting to the query if request * parameters were set for sorting * * @param ItemsEvent $event */ public function items(ItemsEvent $event) { $params = $this->request->query->all(); $sortKey = $event->getAlias() . 'sort'; $directionKey = $event->getAlias() . 'direction'; if (isset($params[$sortKey])) { $query = $event->getQuery(); $whitelist = $query->getHint(OrderByWalker::HINT_PAGINATOR_SORT_FIELDS_WHITELIST); if (isset($whitelist[$params[$sortKey]])) { $sortField = $whitelist[$params[$sortKey]]; } elseif ($whitelist === false) { $sortField = $params[$sortKey]; } else { //passed field name do not match to whitelist, skip sorting return; } $parts = explode('.', $sortField); if (count($parts) != 2) { throw new UnexpectedValueException('Invalid sort key came by request, should be example: "article.title"'); } $query->setHint(OrderByWalker::HINT_PAGINATOR_SORT_ALIAS, current($parts))->setHint(OrderByWalker::HINT_PAGINATOR_SORT_DIRECTION, stripos($params[$directionKey], 'desc') === false ? 'ASC' : 'DESC')->setHint(OrderByWalker::HINT_PAGINATOR_SORT_FIELD, end($parts)); QueryHelper::addCustomTreeWalker($query, self::TREE_WALKER_ORDER_BY); } }