_conn = $conn; $this->_query = $query; if ($dbType === "mysql") { $rs = $this->_conn->query($this->_query); $this->_total = $rs->rowCount(); } } private function setLimit(int $limit = 10): int { if ($limit < 1) { return 10; } return ($limit > $this->maxLimit) ? $this->maxLimit : $limit; } private function setPage(int $page = 1): int { return ($page < 1) ? 1 : $page; } public function mongoGetData(int $limit = 10, int $page = 1, array $options = []) { $this->_limit = $this->setLimit($limit); // Number of items per page $this->_page = $this->setPage($page); // The current page number $skip = (($this->_page - 1) * $this->_limit); if ($this->_limit === 0) { $db_options = $options; } else { $limits = ['limit' => $this->_limit, 'skip' => $skip]; $db_options = array_merge($limits, $options); } // NOTE _query is the WHERE condition as an array $collection = $this->_conn; $documents = $collection->find($this->_query, $db_options); // Calculate the total number of documents in the collection $this->_total = $collection->countDocuments($this->_query); $result = new \stdClass(); $result->page = $this->_page; $result->limit = $this->_limit; $result->total = $this->_total; $result->data = $documents; return $result; } public function getData(int $limit = 10, int $page = 1) { $this->_limit = $this->setLimit($limit); $this->_page = $this->setPage($page); if ($this->_limit === 0) { $query = $this->_query; } else { $query = $this->_query . " LIMIT " . (($this->_page - 1) * $this->_limit) . ", $this->_limit"; } $rs = $this->_conn->query($query); $result = new \stdClass(); $result->page = $this->_page; $result->limit = $this->_limit; $result->total = $this->_total; $result->rs = $rs; return $result; } public function useHashRoutes(string $url): void { $this->_url = $url; $this->_url_limit = "/"; $this->_url_page = "/"; } public function useGetRoutes(string $url = ""): void { $this->_url = $url; $this->_url_limit = "?limit="; $this->_url_page = "&page="; } private function do_href(int $limit, int $page): string { $queryParmas = $_GET; unset($queryParmas['limit']); unset($queryParmas['page']); $q = http_build_query($queryParmas); $querySeperator = (str_contains($this->_url_limit, "?")) ? "&" : "?"; $querySeperator = (empty($q)) ? "" : $querySeperator; return 'href="' . $this->_url . $this->_url_limit . $limit . $this->_url_page . $page . $querySeperator . $q . '"'; } public function createLinks(int $links = 7, string $list_class = "ui pagination menu", string $item = "item"): string { $last = ceil($this->_total / $this->_limit); if ($this->_limit === 0 || $last < 2) { return ''; } $start = (($this->_page - $links) > 0) ? $this->_page - $links : 1; $end = (($this->_page + $links) < $last) ? $this->_page + $links : $last; $html = '
'; $class = ($this->_page == 1) ? "disabled" : ""; $item = " " . $item; $html .= 'do_href($this->_limit, $this->_page - 1) . '>«'; if ($start > 1) { $html .= 'do_href($this->_limit, 1) . '>1'; $html .= '
...
'; } for ($i = $start; $i <= $end; $i++) { $class = ($this->_page == $i) ? "active" : ""; $html .= 'do_href($this->_limit, $i) . '>' . $i . ''; } if ($end < $last) { $html .= '
...
'; $html .= 'do_href($this->_limit, $last) . '>' . $last . ''; } $class = ($this->_page == $last) ? "disabled" : ""; $html .= 'do_href($this->_limit, $this->_page + 1) . '>»'; $html .= '
'; return $html; } public function createJumpMenuWithLinks(int $links = 7, string $label = "Jump to ", string $end_label = " page.", string $item = "item"): string { if ($this->_limit === 0) { return ''; } $last = ceil($this->_total / $this->_limit); $start = (($this->_page - $links) > 0) ? $this->_page - $links : 1; $end = (($this->_page + $links) < $last) ? $this->_page + $links : $last; // Prev. Page $class = ($this->_page == 1) ? "disabled " : ""; $item = " " . $item; $href = ($this->_page == 1) ? "" : $this->do_href($this->_limit, $this->_page - 1); $html .= '«'; $html .= $this->createJumpMenu(); // Next Page $class = ($this->_page == $last) ? "disabled " : ""; $href = ($this->_page == $last) ? "" : $this->do_href($this->_limit, $this->_page + 1); $html .= '»'; return $html; } public function createJumpMenu(string $label = "Jump to ", string $end_label = " page.", string $item = "item"): string { $last = ceil($this->_total / $this->_limit); $option = ''; for ($i = 1; $i <= $last; $i++) { $option .= ($i == $this->_page) ? "\n" : "\n"; } return "\n"; } public function createItemsPerPage(string $label = "Items ", string $end_label = " per page.", string $item = "item"): string { $items = ''; $ipp_array = array(3, 6, 12, 24, 50, 100); $found = false; foreach ($ipp_array as $ipp_opt) { if ($ipp_opt == $this->_limit) { $found = true; } $items .= ($ipp_opt == $this->_limit) ? "\n" : "\n"; } if ($found === false) { $items = "\n" . $items; } $my_page = str_replace("&", "?", $this->_url_page); $my_limit = str_replace("?", "&", $this->_url_limit); return "\n"; } public function getCSS(): string { return ".pagination a { color: #333; padding: 2px 20px; line-height: 1; font-size: 14px; text-decoration: none; border-radius: 6px; border: 1px solid #ddd; background: #fff; box-shadow: 0 1px 3px rgba(0,0,0,.1); transition: all .2s ease; } .pagination a:hover:not(.active) { transform: translateY(-1px); box-shadow: 0 2px 6px rgba(0,0,0,.15); } .pagination a.active { background: #4CAF50; color: white; border-color: #4CAF50; } .pagination .disabled { display: inline-block; padding: 4px 12px; color: #999; border: 1px solid #ddd; border-radius: 4px; background: #f8f8f8; cursor: not-allowed; pointer-events: none; opacity: 0.6; } div.pagination.menu { padding-top: 10px; }"; } } /* * mongo db $limit = $_GET['limit'] ?? 18; $page = $_GET['page'] ?? 1; $url = "#pages/bill"; $query = [ 'user_id' => (string) $user_id ]; $mongo_options = [ 'projection' => [ 'billing' => 1 ]]; $pag = new Paginate($collection, $query, "mongodb"); $r = $pag->mongoGetData($limit, $page, $mongo_options); $pag->useHashRoutes($url); foreach ($r->data as $bill) { echo $bill; } echo $pag->createLinks(); */