adding #3
parent
e9cfcbca66
commit
1a9a6c8e5c
@ -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;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in new issue