Curs PHP-MySQL


Clasa Paginare - Script PHP

Download - Nr. descarcari - 92          


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 - 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 &lt;&lt;</a> &nbsp; ';  
     
      $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 &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_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 .= '&nbsp; <a href="'. $this->pag. $pag_get. $nextpage. '" title="Link '. $nextpage. '">&gt; Urmatoarea</a> ';
      //  adauga >> pentru ultima pagina, daca e mai mare decat $this->range
      if($this->totalpages>$this->range) $re_links .= ' &nbsp; <a href="'. $this->pag. $pag_get. $this->totalpages. '" title="Link '. $this->totalpages. '">&gt;&gt; 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;
  }
}
?>

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:
  • Prima data adaugati datele dv. de conectare la baza de date MySQL (server MySQL, utilizator, parola, baza_de_date) in variabila array: $mysql , definita in clasa (linia 6).
  • Adaugati numele tabelului in proprietatea $table din clasa (linia 12).
  • Modificati numele coloanelor selectate din tabel cu cele folosite de dv, definite in metoda getMysqlRows() (liniile 63-70). In codul clasei sunt setate coloanele: "id", "title", si "content".
    - Deasemenea, puteti modifica interogarea SQL pentru SELECT in functie de datele ce trebuie selectate (linia 63).
    $sql = "SELECT * FROM `$this->table` LIMIT $startrow, $this->rowsperpage";
    - Instructiunea: LIMIT $startrow, $this->rowsperpage specifica sa fie selectate doar randurile care vor fi adaugate in pagina curenta.

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):
  • Daca datele sunt in tabel MySQL, folositi metoda getMysqlRows().
    echo $objPg->getMysqlRows();
  • Daca datele sunt intr-un Array, se foloseste metoda getArrRows($nume_array) ($nume_array reprezinta array-ul cu elementele ce trebuie paginate).
    echo $objPg->getArrRows($arry_name);
  • Daca doriti sa paginati un continut text adaugat intr-un "string" (sir), se foloseste metoda getText($text) ($text e sirul cu textul respectiv).
    echo $objPg->getText($text);
5. In locul unde doriti sa afisati link-urile de paginare, apelati metoda getLinks():
echo $objPg->getLinks();

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();
?>

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();
?>

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();
?>


- 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.

Lectii / Tutoriale

Diverse PHP

Scripturi

  • PHP Script Chat
  • CMS Blog cu Ajax
  • Script Upload
  • Uploader
  • Multi-Uploader
  • Contoar pagina
  • Contor 2
  • Contoar click-uri
  • Contor Downloads
  • Numar Vizitatori si Utilizatori Online
  • Script inregistrare
  • Inregistrare Utilizatori
  • Curs valutar
  • Curs valutar 2
  • Mailer
  • Formular contact
  • Script comentarii
  • Script comentarii 2
  • Script comentarii 3
  • Vizitatori online
  • Script Paginare
  • Clasa Paginare
  • Script Page Rank
  • Script Chat
  • Numarare cuvinte
  • Recomanda pagina
  • Sistem notare
  • Countdown timer
  • Mini_Trafic Site
  • Subiecte forum
  • Clasa cautare Google
Clasa Paginare - Script PHP
2008 - 2012 Webmaster, Webdesigner : MarPlo