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
Ce atribut e folosit in tag-ul <a> pentru adresa link-ului?
src href rel
<a href="http://coursesweb.net/" title="CoursesWeb.net">CoursesWeb.net</a>
Ce proprietate CSS seteaza tipul fontului utilizat?
font-family text-decoration font-size
h2 {
  font-family:"Calibri", sans-serif;
}
Ce instructiune selecteaza toate tag-urile <div> cu class="cls"?
querySelector("div.cls") getElementsByTagName("div") querySelectorAll("div.cls")
var elm_list = document.querySelectorAll("div.cls");
var nr_elms = elm_list.length;       // numar elemente selectate
alert(nr_elms);
Indicati functia care returneaza suma valorilor dintr-un array.
array_sum() array_diff() array_shift()
$arr =[1, 2, 3, 4);
$arr_sum = array_sum($arr);
echo $arr_sum;       // 10
Indicati forma corecta a verbului "study" (a studia) la Trecutul Simplu in aceasta propozitie: "We (study) English."
studyed studys studied
We studied English.
- Noi am studiat engleza.
Indicati forma corecta a verbului "decir" (a spune) la Prezent in aceasta propozitie: "Yo (decir) siempre la verdad."
digas digo decir
Yo digo siempre la verdad.
- Eu spun mereu adevarul.
Clasa Paginare - Script PHP

Last accessed pages

  1. Formatare text in pagina html (17095)
  2. Titluri, Paragrafe, Un nou rand, Linie orizontala (15390)
  3. Blog si Cugetari Personale (19987)
  4. Curs HTML gratuit Tutoriale HTML5 (60074)
  5. Curs PHP MySQL, Tutoriale si Scripturi PHP (31986)

Popular pages this month

  1. Cursuri si Tutoriale: Engleza, Spaniola, HTML, CSS, Php-Mysql, JavaScript, Ajax (7192)
  2. Curs HTML gratuit Tutoriale HTML5 (5881)
  3. Curs si Tutoriale JavaScript (4872)
  4. Curs PHP MySQL, Tutoriale si Scripturi PHP (4547)
  5. Curs CSS Online Tutoriale CSS3 (4457)