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.


Puteti copia codul clasei prezentat mai jos, sau descarcati clasa si fisiere cu exemple de la link-ul Download de mai sus.

Cod clasa Pagination

<?php
/* Clasa Paginare - 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 = 12;    // 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 character_set_client="utf8",character_set_connection="utf8",character_set_results="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 ='';              // 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 .=  '<h3>'. $row['title']. '</h3>'. $row['id']. '<div class="content">'. $row['content']. '</div>';
              }
            }
            else $re .='0 rezultate';
          }
          else $re .='0 inregistrari in table';
        }
      }
      else $re .='Eroare: '. $this->conn->error;

      $this->conn->close();
    }
    else $re .='Nu exista connectare la baza de date MySQL '. mysqli_connect_error();

    return $re;
  }

  // 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 ='';              // variabila ce va fi returnata

    // AICI ADAUGATI CODUL HTML PT REZULTATUL CE CONTINE FIECARE ELEMENT
    for($i=0; $i<$nre; $i++) {
      $re .='<div class="content">'. $ar_page[$i]. '</div>';
    }

    return $re;
  }

  // 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
  //$str, optional - sir cu nume=valoare
  public function getLinks($str='') {
    $re ='';         // variabila ce va contine randurile returnate
    $currentpage = $this->idpage + 1;         // deoarece indexul paginii incepe de la 0, adauga 1 ca sa seteze pagina curenta
    $pg =($str=='')?'?pg=':'?'.$str.'&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 .=' <a href="'. $this->pag. '" title="Link 1">&lt;&lt;</a> 1 &nbsp; ';  
       
        $prevpage = $currentpage - 1;          // pagina anterioara
        // adauga < pt link la pagina anterioara, daca nu e 1
        if($prevpage>1) $re .=' <a href="'. $this->pag. $pg. $prevpage. '" title="Link '. $prevpage. '">Anterior &lt;</a> &nbsp;';
      }

      // 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 .=' [<b>'. $x. '</b>] ';
          else $re .=' <a href="'. $this->pag. $pg. $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 .='&nbsp; <a href="'. $this->pag. $pg. $nextpage. '" title="Link '. $nextpage. '">&gt; Urmatoarea</a> ';
        //  adauga >> pentru ultima pagina, daca e mai mare decat $this->range
        if($this->totalpages>$this->range) $re .=' &nbsp; <a href="'. $this->pag. $pg. $this->totalpages. '" title="Link '. $this->totalpages. '">'. $this->totalpages. ' &gt;&gt;</a> ';
      }
    }

    // adauga link-urile intr-un DIV si-l returneaza
    if(strlen($re)>1) $re ='<div class="linkspg">'. $re. '</div>';
    return $re;
  }
}

Cum se foloseste clasa Pagination

Copiati codul clasei de mai sus intr-un fisier PHP (de exemplu cu numele "class.pagination.php").
- Daca doriti sa paginati randuri dintr-un tabel MySQL:
1. Salvati fisierul cu clasa ("class.pagination.php") pe serverul dv..
2. Includeti clasa in scriptul dv. PHP, cu instructiunea:
include('class.pagination.php');
3. Creati o instanta de obiect la clasa, cu sintaxa:
$objPg = new Pagination();
4. In locul unde doriti sa adaugati continutul paginat, apelati metoda necesara, in functie de sursa in care se afla datele (dupa ce ati creat instanta la clasa): 5. In locul unde doriti sa afisati link-urile de paginare, apelati metoda getLinks():
echo $objPg->getLinks();
- Daca vreti sa adaugati un sir cu nume=valoare in adresa URL di link-urile de paginare, adaugati acel sir ca argument in metoda getLinks():
$str ='id=2';
echo $objPg->getLinks($str);

Proprietati din clasa Pagination

- Pentru a stabili /modifica numarul de randuri (elemente din array) ce vor fi afisate in pagina, setati valoarea proprietatii $rowsperpage (definita initial cu valoarea 10).
- Proprietatea: $txtchr defineste numarul maxim de caractere pentru paginare continut text.
- Proprietatea: $txtpieces defineste numarul de parti in care va fi impartit textul. In acest caz, daca valoarea e mai mare decat 0, numarul de caractere ($txtchr) nu va mai fi luat in considerare.
- Proprietatea: $range seteaza numarul de link-uri din raza celui curent.

Aceste proprietati pot fi setate in codul clasei, sau dinamic in script, dupa ce a fost creat obiectul cu instanta clasei (vedeti in exemplele de mai jos).

Exemple utilizare clasa Pagination

1. Paginare continut dintr-o baza de date MySQL:
<?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();

//sau, cu un sir aditional nume=valoare in link-urile de paginare
// echo $objPg->getLinks('id=2');
?>

2. Paginare continut aflat intr-un array:
<?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();

//sau, cu un sir aditional nume=valoare in link-urile de paginare
// echo $objPg->getLinks('id=2');
?>

3. Paginare text:
<?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();

//sau, cu un sir aditional nume=valoare in link-urile de paginare
// echo $objPg->getLinks('id=2');
?>


- Acest script este gratuit (nu se acorda suport sau modificari personale).

A fost testat cu succes e o configuratie generala cu XAMPP. Daca pe alte sisteme apar probleme, depinde de configuratia si setarile acelui server.

Un Test simplu in fiecare zi

HTML
CSS
JavaScript
PHP-MySQL
Engleza
Spaniola
Care tag defineste zona de click intr-o harta creata dintr-o imagine?
<map> <img> <area>
<img src="image.jpg" usemap="#map1">
<map name="map1">
  <area shape="rect" coords="9, 120, 56, 149" href="#">
  <area shape="rect" coords="100, 200, 156, 249" href="#">
</map>
Ce proprietate CSS indica ce sa se intample cand continutul unui element depaseste dimensiunile lui?
display overflow position
#id {
  overflow: auto;
}
Clic pe evenimentul care este declansat cand mouse-ul e deasupra unui obiect.
onclick onmouseover onmouseout
document.getElementById("id").onmouseover = function(){
  document.write("Sa ai Viata Buna");
}
Indicati variabila PHP ce contine datele adaugate in adresa URL, dupa caracterul "?".
$_SESSION $_GET $_POST
if(isset($_GET["id"])) {
  echo $_GET["id"];
}
Clic pe pronumele reflexiv care e potrivit in propozitia: "Marc is the boy ... won the prize".
who which whoever
Marc is the boy who won the prize.
- Marc e baiatul care a castigat premiul.
Clic pe pronumele reflexiv care e potrivit in propozitia: "Voy a ver al pintor de ... les hablé ayer".
que quien cuyo
Voy a ver al pintor de quien les hablé ayer.
- Ma duc sa vad pictorul despre care ti-am vorbit ieri.
Clasa Paginare - Script PHP

Last accessed pages

  1. Zilele saptamanii - Lunile anului - Anotimpurile - Engleza (10611)
  2. Verbe frazale din limba Engleza (15272)
  3. Jokes - Glume, Bancuri, Humor (3661)
  4. Zilele saptamanii, Lunile si Anotimpuri - Exercitii incepatori (3195)
  5. Proverbe, expresii si zicatori (5908)

Popular pages this month

  1. Prezentul simplu si continuu - Present Tense Simple and Continuous (3644)
  2. Cursuri si Tutoriale: Engleza, Spaniola, HTML, CSS, Php-Mysql, JavaScript, Ajax (3243)
  3. Gramatica limbii engleze - Prezentare Generala (2719)
  4. Prezent perfect si Prezent perfect continuu - Present perfect and Continuous (2361)
  5. Trecutul simplu si continuu - Past Tense Simple and Continuous (1955)