| 
<?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 "?";
 }
 
 }
 |