set([ 'total' => 0, 'arg_name' => 'p', 'per_page' => 10, 'url' => '', 'neighbors' => 10, ]); parent::__construct($args); $this -> page = array_var($_GET, $this -> fields['arg_name'], 0); } public function getPage() { return max(1, min($this -> getTotalPages(), $this -> page)); } public function getLimit() { return $this -> fields['per_page']; } public function getTotalPages() { return ceil($this -> fields['total'] / $this -> fields['per_page']); } public function getTotal() { return $this -> fields['total']; } public function getOffset() { return ($this -> getPage() - 1) * $this -> fields['per_page']; } public function render() { $page = $this -> getPage(); $prev_link = new Url($this -> fields['url']); $prev_link[$this -> fields['arg_name']] = $page - 1; $page_link = new Url($this -> fields['url']); $pages = []; // Ссылка на первую страницу if ($page > 1) { $page_link[$this -> fields['arg_name']] = 1; $pages[] = ['name' => 1, 'link' => $page_link -> getUrl()]; } // Страницы слева активной if ($page - 1 > $this -> fields['neighbors'] + 1) $pages[] = ['name' => '...']; $min_page = max(2, $page - $this -> fields['neighbors']); for ($i = $min_page; $i < $page; $i++) { $page_link[$this -> fields['arg_name']] = $i; $pages[] = ['name' => $i, 'link' => $page_link -> getUrl()]; } // Текущая страничка $pages[] = ['name' => $page, 'curr' => true]; // Страницы справа активной $max_page = min($this -> getTotalPages() - 1, $page + $this -> fields['neighbors']); for ($i = $page + 1; $i <= $max_page; $i++) { $page_link[$this -> fields['arg_name']] = $i; $pages[] = ['name' => $i, 'link' => $page_link -> getUrl()]; } if ($page < $this -> getTotalPages() - $this -> fields['neighbors'] - 1) $pages[] = ['name' => '...']; // Ссылка на последнюю страницу if ($page < $this -> getTotalPages()) { $page_link[$this -> fields['arg_name']] = $this -> getTotalPages(); $pages[] = ['name' => $this -> getTotalPages(), 'link' => $page_link -> getUrl()]; } $next_link = new Url($this -> fields['url']); $next_link[$this -> fields['arg_name']] = $page + 1; $tpl = \Evilworlds\View\Template::getInstance(); $data = $tpl -> render("widgets/pagination.xhtml", [ 'total' => $this -> getTotalPages(), 'curr_page' => $page, 'pages' => $pages, 'next_link' => $next_link -> getUrl(), 'prev_link' => $prev_link -> getUrl(), ]); unset($pages); return $data; } }