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