| @ -0,0 +1,179 @@ | |||
| <?php | |||
| namespace SuperGear\Directus\Repositories; | |||
| /** | |||
| * class for paginate request | |||
| * | |||
| * @author Björn Hase | |||
| * @license http://opensource.org/licenses/MIT The MIT License | |||
| * @link https://gitlab.tentakelfabrik.de/super-gear/directus GitHub Repository | |||
| * | |||
| */ | |||
| abstract class PaginationRepositoryAbstract extends RepositoryAbstract | |||
| { | |||
| /** current page */ | |||
| protected $page; | |||
| /** limit for request */ | |||
| protected $limit; | |||
| /** max pages */ | |||
| protected $maxPages; | |||
| /** pages that are visible */ | |||
| protected $showPages = 7; | |||
| /** | |||
| * setting max pages | |||
| * | |||
| * @param integer | |||
| * @param array | |||
| * | |||
| */ | |||
| protected function setMaxPages($limit, $results) | |||
| { | |||
| $this->maxPages = intval(round($results['meta']['filter_count'] / $limit)); | |||
| } | |||
| /** | |||
| * getting offset for request | |||
| * | |||
| * @param integer | |||
| * @return integer | |||
| * | |||
| */ | |||
| protected function getOffset($page, $limit) | |||
| { | |||
| return (($page - 1) * $limit); | |||
| } | |||
| /** | |||
| * get pages that are showing | |||
| * | |||
| * @param integer | |||
| * @return array | |||
| * | |||
| */ | |||
| protected function getPages($page) | |||
| { | |||
| // results | |||
| $pages = []; | |||
| // count of pages that can be shown | |||
| $showPages = $this->showPages; | |||
| // get avarage value to show pages | |||
| $averagePages = $this->showPages / 2; | |||
| // run throw all pages | |||
| for ($i = 1; $i <= $this->maxPages; $i++) { | |||
| // check if $page has to show | |||
| $show = false; | |||
| // show always first and last page | |||
| if ($i === 1 || $i === $this->maxPages) { | |||
| $show = true; | |||
| } | |||
| // if showing pages are aviable check if page can be shown | |||
| if ($show === false && $showPages > 0) { | |||
| // if page from 1 to avarage | |||
| if (($i <= $averagePages && $page <= $averagePages) || | |||
| // if page is less than maxPages | |||
| (($i >= ($maxPages - $averagePages)) && $page >= ($maxPages - $averagePages)) || | |||
| // put current pages as avarage value | |||
| ($i >= ($page - $averagePages) && $i <= ($page + $averagePages))) { | |||
| $showPages--; | |||
| $show = true; | |||
| } | |||
| } | |||
| if ($show) { | |||
| $pages[] = $i; | |||
| } | |||
| } | |||
| return $pages; | |||
| } | |||
| /** | |||
| * if previous is possible | |||
| * | |||
| * @param integer $page | |||
| * | |||
| */ | |||
| protected function getPrevious($page) | |||
| { | |||
| $result = NULL; | |||
| if ($page > 1) { | |||
| $result = $page - 1; | |||
| } | |||
| return $result; | |||
| } | |||
| /** | |||
| * if next is possible | |||
| * | |||
| * @param integer $page | |||
| * | |||
| */ | |||
| protected function getNext($page) | |||
| { | |||
| $result = NULL; | |||
| if ($page < $this->maxPages) { | |||
| $result = $page + 1; | |||
| } | |||
| return $result; | |||
| } | |||
| /** | |||
| * prepare query to get limited items | |||
| * | |||
| * @param integer $page | |||
| * @param integer $limit | |||
| * @param array $query | |||
| * | |||
| */ | |||
| protected function prepare($page, $limit, $query) | |||
| { | |||
| // setting page and limit | |||
| $this->page = $page; | |||
| $this->limit = $limit; | |||
| return array_merge($query, [ | |||
| 'offset' => $this->getOffset($this->page, $this->limit), | |||
| 'limit' => $this->limit, | |||
| 'meta' => 'result_count,filter_count,total_count' | |||
| ]); | |||
| } | |||
| /** | |||
| * paginate results | |||
| * | |||
| * @param integer $page | |||
| * @param integer $limit | |||
| * @param array $results | |||
| * | |||
| */ | |||
| protected function paginate($results) | |||
| { | |||
| $this->setMaxPages($this->limit, $results); | |||
| $results['meta']['current'] = $this->page; | |||
| $results['meta']['previous'] = $this->getPrevious($this->page); | |||
| $results['meta']['next'] = $this->getNext($this->page); | |||
| $results['meta']['pages'] = $this->getPages($this->page); | |||
| $results['meta']['max_pages'] = $this->maxPages; | |||
| return $results; | |||
| } | |||
| } | |||