Clasa Pagination prezentata in aceasta pagina poate fi utilizata pentru paginare continut stocat in baza de date MySQL, intr-un Array, sau intr-un sir cu un text prea mare ce trebuie impartit in mai multe segmente /pagini.
Scriptul este destul de flexibil, se poate usor seta numarul de randuri (sau elemente din Array) care sa fie afisate in pagina; sau cand se pagineaza un text aflat intr-un singur sir, se poate alege impartirea lui intr-un anumit numar de segmente, sau in functie de un numar maxim de caractere (fara a taia cuvintele).
Detalii despre cod sunt in comentariile din clasa.
<?php
/* Clasa Paginare - www.marplo.net/php-mysql/ */
class Pagination {
/* EDITATI datele din acest array daca paginati randuri din tabel MySQ
Adaugati datele dv. pentru conectare la baza de date MySQL (serverul MySQL, utilizator, parola, baza_de_date) */
protected $mysql = array(
'host'=> 'localhost',
'user'=> 'root',
'pass'=> 'parola',
'dbname'=> 'nume_baza_date'
);
public $table = 'pgtest'; // AICI adaugati numele tabelului MySQL
// properties
public $rowsperpage = 10; // numarul de randuri (elemente array) adaugate in pagina
public $txtchr = 800; // numarul maxim de caractwere, cand se face paginarea unui continut text
public $txtpieces = 0; // numarul de parti /pagini, cand se face paginarea unui continut text
public $range = 3; // numarul de link-uri afisate in jurul celui curent
protected $conn = false; // va retine conexiunea mysql
protected $idpage = 0; // indexul paginii curente
protected $totalpages = 0; // numarul total de pagini
protected $pag; // retine numele fisierului care foloseste clasa ($_SERVER['PHP_SELF'])
// Constructor
public function __construct() {
// seteaza proprietatile $pag si $idpage (intreg, pozitiv)
$this->pag = $_SERVER['PHP_SELF'];
$this->idpage = isset($_GET['pg']) ? intval(abs($_GET['pg']-1)) : 0;
}
// metoda pt crearea conectarii la baza de date MySQL
public function setConn() {
// daca se realizeaza cu succes conectarea la baza de date, o retine in perroprietatea $conn
if($conn = new mysqli($this->mysql['host'], $this->mysql['user'], $this->mysql['pass'], $this->mysql['dbname'])) {
$sql = "SET NAMES 'utf8'";
if($conn->query($sql)) $this->conn = $conn;
}
return $this->conn;
}
// Selecteaza randurile din tabelul mysql pentru pagina curenta. Returneaza un sir cu acestea, cu cod html
public function getMysqlRows() {
$this->setConn(); // apeleaza metoda setConn() pt. a crea conexiunea la MySQL
$startrow = $this->idpage * $this->rowsperpage; // randul de la care incepe selectarea continutului
$re_cnt = ''; // variabila ce va fi returnata
// daca e creata conectarea la baza de date MySQL
if($this-conn!==false) {
// SELECT pt. a afla numarul total de pagini ($totalpages)
$sql = "SELECT COUNT(*) FROM `$this->table`";
// efectueaza interogarea, apoi vor fi selectate randurile
if($resql = $this->conn->query($sql)) {
// daca $resql contine cel putin un rand, le preia si seteaza $totalpages
if($resql->num_rows > 0) {
$row = $resql->fetch_row();
$this->totalpages = ceil($row[0] / $this->rowsperpage);
// Definire SELECT care preia randurile pt. pagina curenta
// LIMIT $startrow, $this->rowsperpage ; specifica sa fie selectate doar randurile paginii curente
$sql = "SELECT * FROM `$this->table` LIMIT $startrow, $this->rowsperpage";
if($resql = $this->conn->query($sql)) {
// daca $resql contine cel putin un rand
if($resql->num_rows > 0) {
// AICI MODIFICATI numele coloanelor si creati codul HTML
while($row = $resql->fetch_assoc()) {
$re_cnt .= '<h3>'. $row['title']. '</h3>'. $row['id']. '<div class="content">'. $row['content']. '</div>';
}
}
else $re_cnt .= '0 rezultate';
}
else $re_cnt .= '0 inregistrari in table';
}
}
else $re_cnt .= 'Eroare: '. $this->conn->error;
$this->conn->close();
}
else $re_cnt .= 'Nu exista connectare la baza de date MySQL '. mysqli_connect_error();
return $re_cnt;
}
// primeste un Arry cu continutul ce trebuie paginat. Returneaza un sir cu elementele pt. pagina curenta
public function getArrRows($arr) {
$startrow = $this->idpage * $this->rowsperpage; // elementul de la care incepe preluarea
$ar_page = array_slice($arr, $startrow, $this->rowsperpage); // preia elementele pt. pagina curenta
$nre = count($ar_page);
$this->totalpages = ceil(count($arr) / $this->rowsperpage); // seteaza numar total de pagini
$re_cnt = ''; // variabila ce va fi returnata
// AICI ADAUGATI CODUL HTML PT REZULTATUL CE CONTINE FIECARE ELEMENT
for($i=0; $i<$nre; $i++) {
$re_cnt .= '<div class="content">'. $ar_page[$i]. '</div>';
}
return $re_cnt;
}
// metoda pt paginare text, imparte sirul in functie de numarul de caractere ($txtchr), sau nr. parti (txtpieces)
public function getText($text) {
// daca $txtpieces e mai mare decat 0, imparte $text intr-un numar de parti /pagini specificat in $txtpieces
// altfel, imparte textul in functie de numarul maxim de caractere din $txtchr
if($this->txtpieces>0) {
$this->txtchr = ceil(strlen($text) / $this->txtpieces); // seteaza $txtchr in functie de nr. parti
}
// imparte textul si creaza un Array cu partile obtinute. Returneaza sirul pt. pagina curenta
$newtext = wordwrap($text, $this->txtchr, '#|#');
$ar_text = explode('#|#', $newtext);
$nr_pieces = count($ar_text);
// daca paginarea e dupa numarul de parti, si sunt prea multe segmente - uneste pe ultimile doua
if($this->txtpieces>0 && $nr_pieces>$this->txtpieces) {
$ar_text[$nr_pieces-2] .= ' '. $ar_text[$nr_pieces-1];
unset($ar_text[$nr_pieces-1]);
}
$this->totalpages = count($ar_text); // seteaza nr. total de pagini
if($this->idpage > $this->totalpages) $this->idpage = $this->totalpages;
// seteaza un sir care sa fie adaugat la sfarsitul continutului text, daca nu e ultima pagina
$end = ($this->idpage+1)<$this->totalpages ? ' ...[<i> Continuare in pagina urmatoarte</i>].' : '';
return $ar_text[$this->idpage]. $end;
}
// metoda ce seteaza link-urile
public function getLinks() {
$re_links = ''; // variabila ce va contine randurile returnate
$currentpage = $this->idpage + 1; // deoarece indexul paginii incepe de la 0, adauga 1 ca sa seteze pagina curenta
$pag_get = '?pg='; // numele pt valoarea GET adaugata in URL
// daca $totalpages>0 si nr total pagini e mai mare sau egal cu pagina curenta
if($this->totalpages>0 && $this->totalpages >= $currentpage) {
// Link-uri inapoi, daca pagina curenta nu e prima
if ($currentpage > 1) {
// adauga << pentru link la prima pagina
$re_links .= ' <a href="'. $this->pag. '" title="Link 1">Prima pagina <<</a> ';
$prevpage = $currentpage - 1; // pagina anterioara
// adauga < pt link la pagina anterioara, daca nu e 1
if($prevpage>1) $re_links .= ' <a href="'. $this->pag. $pag_get. $prevpage. '" title="Link '. $prevpage. '">Anterior <</a> ';
}
// seteaza link-urile din jurul paginii curente
for($x = ($currentpage - $this->range); $x <= ($currentpage + $this->range); $x++) {
// daca e un numar intre prima si ultima pagina
if (($x > 0) && ($x <= $this->totalpages)) {
// daca e nr. pagina curenta, afiseaza fara link, altfel adauga link
if ($x == $currentpage) $re_links .= ' [<b>'. $x. '</b>] ';
else $re_links .= ' <a href="'. $this->pag. $pag_get. $x. '" title="Link '. $x. '">'. $x. '</a> ';
}
}
// Daca pagina curenta nu e ultima, adauga link pentru pagina urmatoare si ultima
if ($currentpage != $this->totalpages) {
$nextpage = $currentpage + 1; // obtine pagina urmatoare
// adauga > pt. pagina urmatoare (daca e mai mare decat $this->range si mai mica decat $totalpages)
if($nextpage>$this->range && $nextpage<$this->totalpages) $re_links .= ' <a href="'. $this->pag. $pag_get. $nextpage. '" title="Link '. $nextpage. '">> Urmatoarea</a> ';
// adauga >> pentru ultima pagina, daca e mai mare decat $this->range
if($this->totalpages>$this->range) $re_links .= ' <a href="'. $this->pag. $pag_get. $this->totalpages. '" title="Link '. $this->totalpages. '">>> Ultima pagina ('. $this->totalpages. ')</a> ';
}
}
// adauga link-urile intr-un DIV si-l returneaza
if(strlen($re_links)>1) $re_links = '<div class="linkspg">'. $re_links. '</div>';
return $re_links;
}
}
?>
include('class.pagination.php');
3. Creati o instanta de obiect la clasa, cu sintaxa:
<?php
// include clasa Pagination
include('class.pagination.php');
// creaza obiectul cu instanta la clasa
$objPg = new Pagination();
// daca doriti sa modificati numele tabelului, setati proprietatea "table"
// $objPg->table = 'nume_tabel';
// pt. a modifica numarul de randuri adaugate in pagina, setati "rowsperpage"
// $objPg->rowsperpage = 8;
// afiseaza continutul
echo $objPg->getMysqlRows();
// afiseaza link-urile de paginare
echo $objPg->getLinks();
?>
<?php
// Array cu date
$source = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','y','x','z');
// include clasa Pagination
include('class.pagination.php');
// creaza obiectul cu instanta la clasa
$objPg = new Pagination();
// modifica nr. elemente in pagina
$objPg->rowsperpage = 8;
// afiseaza continutul
echo $objPg->getArrRows($source);
// afiseaza link-urile de paginare
echo $objPg->getLinks();
?>
<?php
// Un sir cu textul ce va fi paginat
$source = 'Aici puteti adauga un sir cu text lung, sau puteti prelua sirul dintr-un fisier extern, de exemplu cu functia file_get_contents().';
// include clasa Pagination
include('class.pagination.php');
// creaza obiectul cu instanta la clasa
$objPg = new Pagination();
// modifica numarul maxim de caractere pentru textul paginat
$objPg->txtchr = 40;
// daca doriti sa paginati /impartiti textul intr-un nr. de parti, setati proprietatea "txtpieces"
// $objPg->txtpieces = 6;
// afiseaza continutul
echo $objPg->getText($source);
// afiseaza link-urile de paginare
echo $objPg->getLinks();
?>