SHARE
TWEET

PaginationCollection for Yii

a guest Jun 27th, 2014 251 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <?php
  2. use yii\data\Pagination;
  3.  
  4. /**
  5.  * In base model class need to add method paginate
  6.  *
  7.  * public function paginate($perPage = 15, $page = null)
  8.  * {
  9.  *     return new PaginationCollection($this, $perPage, $page);
  10.  * }
  11.  */
  12.  
  13. class PaginationCollection implements \Iterator, \ArrayAccess
  14. {
  15.         /**
  16.          * result rows
  17.          *
  18.          * @access protected
  19.          * @var array
  20.          */
  21.         protected $result = [];
  22.  
  23.         /**
  24.          * Per page results
  25.          *
  26.          * @access protected
  27.          * @var int
  28.          */
  29.         protected $perPage = 15;
  30.  
  31.         /**
  32.          * Current page
  33.          *
  34.          * @access protected
  35.          * @var int
  36.          */
  37.         protected $page = 1;
  38.  
  39.         /**
  40.          * Count results
  41.          *
  42.          * @access protected
  43.          * @var int
  44.          */
  45.         protected $count = 0;
  46.  
  47.         /**
  48.          * Pagination object
  49.          *
  50.          * @access protected
  51.          * @var object
  52.          */
  53.         protected $pagination;
  54.  
  55.         /**
  56.          * Constructor
  57.          *
  58.          * @access public
  59.          * @param object $query
  60.          * @param int $perPage
  61.          * @param int $page
  62.          */
  63.         public function __construct($query, $perPage, $page)
  64.         {
  65.                 $this->page = $this->getRequestPage($page);
  66.                 $this->perPage = (int) $perPage;
  67.                 $this->count = $query->count();
  68.                 $this->pagination = $this->createPagination();
  69.                 $this->result = $query
  70.                          ->offset($this->pagination->offset)
  71.                          ->limit($this->pagination->limit)
  72.                          ->all();
  73.         }
  74.  
  75.         /**
  76.          * Getter
  77.          *
  78.          * @access public
  79.          * @param mixed $key
  80.          * @return mixed
  81.          */
  82.         public function __get($key)
  83.         {
  84.                 return isset($this->result[$key]) ? $this->result[$key] : null;
  85.         }
  86.  
  87.         /**
  88.          * Setter
  89.          *
  90.          * @access public
  91.          * @param string $key
  92.          * @param mixed $value
  93.          */
  94.         public function __set($key, $value)
  95.         {
  96.                 $this->result[$key] = $value;
  97.         }
  98.  
  99.         /**
  100.          * Magic isset
  101.          *
  102.          * @access public
  103.          * @param string $key
  104.          * @return bool
  105.          */
  106.         public function __isset($key)
  107.         {
  108.                 return isset($this->result[$key]);
  109.         }
  110.  
  111.         /**
  112.          * Magic unset
  113.          *
  114.          * @access public
  115.          * @param string $key
  116.          */
  117.         public function __unset($key)
  118.         {
  119.                 if ($this->__isset($key)) {
  120.                         unset($this->result[$key]);
  121.                 }
  122.         }
  123.  
  124.         /**
  125.          * Invoke method, get pagination
  126.          *
  127.          * @access public
  128.          * @return object
  129.          */
  130.         public function __invoke()
  131.         {
  132.                 return $this->getPagination();
  133.         }
  134.  
  135.         /**
  136.          * Get pagination object
  137.          *
  138.          * @access public
  139.          * @return object
  140.          */
  141.         public function getPagination()
  142.         {
  143.                 if (! $this->pagination) {
  144.                         $this->pagination = $this->createPagination();
  145.                 }
  146.                 return $this->pagination;
  147.         }
  148.  
  149.         /**
  150.          * Iterator rewind
  151.          *
  152.          * @access public
  153.          * @return void
  154.          */
  155.         public function rewind()
  156.     {
  157.         reset($this->result);
  158.     }
  159.  
  160.     /**
  161.      * Iterator current element
  162.      *
  163.      * @access public
  164.      * @return mixed
  165.      */
  166.         public function current()
  167.         {
  168.                 return current($this->result);
  169.         }
  170.  
  171.         /**
  172.          * Iterator key
  173.          *
  174.          * @access public
  175.          * @return string
  176.          */
  177.         public function key()
  178.     {
  179.         return key($this->result);
  180.     }
  181.  
  182.     /**
  183.      * Iterator next element
  184.      *
  185.      * @access public
  186.      * @return mixed
  187.      */
  188.     public function next()
  189.     {
  190.         return next($this->result);
  191.     }
  192.  
  193.     /**
  194.      * Iterator valid
  195.      *
  196.      * @return bool
  197.      */
  198.     public function valid()
  199.     {
  200.         $key = key($this->result);
  201.         return ($key !== NULL && $key !== FALSE);
  202.     }
  203.  
  204.     /**
  205.      * ArrayAccess exists
  206.      *
  207.      * @access public
  208.      * @param string $key
  209.      * @return bool
  210.      */
  211.     public function offsetExists($key)
  212.     {
  213.         return $this->__isset($key);
  214.     }
  215.  
  216.     /**
  217.      * ArrayAccess get element
  218.      *
  219.      * @access public
  220.      * @param string $key
  221.      * @return mixed
  222.      */
  223.     public function offsetGet($key)
  224.     {
  225.         return $this->__get($key);
  226.     }
  227.  
  228.     /**
  229.      * ArrayAccess set
  230.      *
  231.      * @access public
  232.      * @param string $key
  233.      * @param mixed $value
  234.      */
  235.     public function offsetSet($key, $value)
  236.     {
  237.         return $this->__set($key, $value);
  238.     }
  239.  
  240.     /**
  241.      * ArrayAcess unset
  242.      *
  243.      * @access public
  244.      * @param string $key
  245.      * @return void
  246.      */
  247.     public function offsetUnset($key)
  248.     {
  249.         return $this->__unset($key);
  250.     }
  251.  
  252.     /**
  253.          * Create pagination
  254.          *
  255.          * @access protected
  256.          * @return object
  257.          */
  258.         protected function createPagination()
  259.         {
  260.                 return new Pagination(['pageSize' => $this->perPage, 'page' => $this->page, 'totalCount' => $this->count]);
  261.         }
  262.  
  263.         /**
  264.          * Get request page
  265.          *
  266.          * @access protected
  267.          * @param int $page
  268.          * @return int
  269.          */
  270.         protected function getRequestPage($page)
  271.         {
  272.                 if (! $page) {
  273.                  $page = (isset($_REQUEST['page'])) ? $_REQUEST['page'] : 1;
  274.             }
  275.             return (int) $page * 1;
  276.         }
  277. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top