<?php 
/** 
 * * 
 *  * please don't remove this comment block 
 *  * 
 *  * @author phptricks Team - Mohammad Anzawi 
 *  * @author_uri https://phptricks.org 
 *  * @uri https://github.com/anzawi/php-database-class 
 *  * @version 5.0.0 
 *  * @licence MIT -> https://opensource.org/licenses/MIT 
 *  * @package PHPtricks\Orm 
 * 
 */ 
 
namespace PHPtricks\Orm\DML; 
 
trait Paginate 
{ 
 
    /** 
     * @sense v.2.1.0 
     * pagination functionality 
     * 
     * @param  int  $recordsCount  count records per page 
     * 
     * @return array 
     */ 
  
    public function paginate($recordsCount = 0, $last = false) 
    { 
        if ($recordsCount === true) { 
            $last         = true; 
            $recordsCount = 0; 
        } 
 
        if ($recordsCount === 0) { 
            $recordsCount = config("pagination.records_per_page"); 
        } 
 
        // this method accept one argument must be an integer number . 
        if ( ! is_integer($recordsCount)) { 
            trigger_error("Oops, the records count must be an integer number" 
                          ."<br> <p><strong>paginate method</strong> accept one argument must be" 
                          ." an <strong>Integer Number</strong> , " 
                          .gettype($recordsCount)." given!</p>" 
                          ."<br><pre>any question? contact me on [email protected]</pre>", 
                E_USER_ERROR); 
        } 
 
        $uriQueryKey = config("pagination.link_query_key"); 
        // check current page 
        $startFrom = isset($_GET[$uriQueryKey]) ? 
            ($_GET[$uriQueryKey] - 1) * $recordsCount 
            : 0; 
 
        // get pages count rounded up to the next highest integer 
        $this->_colsCount = ceil(count($this->select()->results()) 
                                 / $recordsCount); 
 
        // return query results 
        return $this->limit($startFrom, $recordsCount)->select(['*'], $last); 
    } 
 
    /** 
     * @return int pages count when use paginate() method 
     */ 
    public function pagesCount() 
    { 
        if ($this->_colsCount <= 0) { 
            return null; 
        } 
 
        return $this->_colsCount; 
    } 
 
   
    public function link() 
    { 
        // get current url 
        $link = $_SERVER['PHP_SELF']; 
        $uriQueryKey = config("pagination.link_query_key"); 
 
        // current page 
        $currentPage 
            = (isset($_GET[$uriQueryKey]) ? 
            $_GET[$uriQueryKey] 
            : 1); 
        /** 
         * $html var to store <ul> tag 
         */ 
        $html = ''; 
        if ($this->_colsCount > 0) // check if columns count is not 0 or less 
        { 
            $operator = $this->checkAndGetUriQuery($uriQueryKey); 
 
            $html = "<ul class=\"pagination\">"; 
            // loop to get all pages 
            for ($i = 1; $i <= $this->_colsCount; $i++) { 
                // we need other pages link only .. 
                if ($i == $currentPage) { 
                    $html .= "<li>{$i}</li>"; 
                } else { 
                    $html .= "<li><a href=\"{$link}{$operator}". 
                                $uriQueryKey. 
                             "={$i}\">{$i}</a></li>"; 
                } 
            } 
 
            $html .= "</ul>"; 
        } 
 
        return $html; 
    } 
 
    /** 
     * create pagination list to navigate between pages 
     * 
     * @return string (html) 
     */ 
 
    /** 
     * check if we have a string query in current uri other (pagination key) 
     * if not so return (?) otherwise we want to reorder a string query to keep 
     * other keys 
     * 
     * @return string 
     */ 
    private function checkAndGetUriQuery($uriQueryKey) 
    { 
        $get = $_GET; 
        // remove pagination key from query string 
        unset($get[$uriQueryKey]); 
        // init query string and set init value (?) 
        $queryString = "?"; 
        // check if we have other pagination key in query string 
        if (count($get)) { 
            // reorder query string to keep other keys 
            foreach ($get as $key => $value) { 
                $queryString .= "{$key}". 
                                (! empty($value) ? "=" : "").$value."&"; 
            } 
 
            return $queryString; 
        } 
 
 
        return "?"; 
    } 
 
}
 
 |