PHP lapozó - R.E. Pagination v1.0

Ahogy ígértem, én is elkészítettem saját lapozó osztálykönyvtáramat.

Legyen szó MySQL adatbázisról, xml-ről vagy egyszerű szövegfájlról, amiben az egyes "mezőket"
valamilyen karaktersor választja el egymástól, ez az osztálykönyvtár meg fog birkózni vele.
Rengeteg opcióval konfigurálható. Megadható, hogy egy oldalon hány elemet jelenítsen meg.
Megadható, hogy hogy nézzen ki egy oldalra mutató link a linklistában, illetve az, hogy
maga a link lista hány oldal linkjét tartalmazza egyszerre. Ezen kívül az előző, következő
legelső és legutolsó oldalra mutató linkek szövege, valamint a $_GET változóban az index neve,
ami az oldalszámot fogja jelenteni a lapozóban.

Új lapozókat is lehet írni hozzá. Az AREPagination és AREPItems absztrakt osztályokat örökítve.
De minden új osztályt az install.php -ben is hozzá kell adni az osztálykönyvtárhoz, hogy
az REPClasses osztály import() metódusával anélkül lehessen importálni az osztályokat, hogy tudnánk
annak pontos útvonalát a projectben. A REPClasses osztály installedClasses() metódusa pedig
visszaadja az összes telepített osztály nevét. Ha netán nem tudnánk, milyen osztályokból lehet gazdálkodni.
(Bár ez a fájlrendszeren is kideríthető)

REPagination letöltése
Dokumentáció letöltése
Dokumentáció online megtekintése

Példa fájl lapozására

<?php
require_once 'REPagination/classes/REPClasses.class.php';
REPClasses::import('REPFileItems');
REPClasses::import('REFilePagination');

$file = new REPFileItems('db.txt',array('egy','ketto','harom'),'&&');

$pagination = new REFilePagination($file);
$pagination->itemPerPage(2);

$page = $pagination->page();

foreach ($page as $item)
{
        print "------Adatok---------<br />".PHP_EOL;
        foreach ($item as $key => $value)
        {
                print $key.' = '. $value."<br />";
        }
}
print $pagination->pageLinks(2);
?>

Példa XML lapozására

<?php
require_once 'REPagination/classes/REPClasses.class.php';

REPClasses::import('REFilePagination');
REPClasses::import('REPXmlItems');
$file = new REPXmlItems('db.xml',array('name','age','sex'));

$pagination = new REFilePagination($file);
$pagination->itemPerPage(2);

$page = $pagination->page();

foreach ($page as $item)
{
        print "------Adatok---------<br />".PHP_EOL;
        foreach ($item as $key => $value)
        {
                print $key.' = '. $value."<br />";
        }
}

print $pagination->pageLinks(2);
?>

Példa MySQL lapozására

<?php
require_once 'REPagination/classes/REPClasses.class.php';
REPClasses::import('REMySQLPagination');
REPClasses::import('REPMySqlItems');

$link = mysql_connect('localhost','root','password');
mysql_select_db('teszt',$link);
$mysql = new REPMySQLItems('teszt');

$p = new REMySQLPagination($mysql);
$p->itemPerPage(8);
$page = $p->page();

foreach ($page as $item)
{
        foreach ($item as $key => $cell)
        {
                print $key.": ".$cell."<br />".PHP_EOL;
        }
}
print $p->pageLinks(10);
?>

v1.0.1: 2012. április 29.

Elkészült a javított verzió 1.0.1 -es verziószámmal, ami főként a lapozó linkek hibás listázását javítja. A program használatában semmi sem változott.

Kategóriák: 
Megosztás/Mentés

Hozzászólások

csomesz képe

Szia
Nem nagyon értem a mysql lapozás működését. Hova kell a lekérdezést berakni, illetve hol iratod ki a tartalmat...bocs,pedig tényleg gondolkodtam rajta.Tudnál egy picit segíteni.

Rimelek képe

Szia

Az a lényege, hogy a REPMySQLItems osztály példányosításánál át kell adnod az sql utasításodnak azt a részét, ami a "from" kulcsszó után van, de még nem tartalmazza a "limit" -et. Azt ugyanis a program teszi bele. Tehát ha le akarod kérdezni az adatbázisból a 18 évesnél idősebb felhasználóidat, akkor az így megy sql-lel:
select * from users where age > 18
A lapozóban ezt így kell írnod:
$items = new REPMySQLItems("users where age > 18");
Ez még semmi mást nem csinál, mint eltárolja, hogy egy, a fentinek megfelelő sql utasítást akarsz futtatni. Az objektumnak beállítható a limitje, csak itt még számolni kéne, hogy hányadik oldalnál mi a limit. Ha azt csinálnád, hogy mindenféle egyéb nélkül csak írnál egy ciklust az $items objektumra, úgy viselkedne, mintha egy tömb lenne. És első alkalommal lefutna a lekérdezés. Majd szépen lépkedne a következő sorokra.

foreach($items as $item) {
    echo $item['username'].'<br />';
}

Ez ugye így még nem lapozás. És ez az, amit az REMySQLPagination osztály végez. Az fog számolgatni az alapján, hogy te megmondod neki, egy oldalon hány elem jelenjen meg. És kezeli a lapozó linkeket is. Azaz, ha kell egy lista a userekről, de csak 5-ösével és egyszerre 12 linket akarsz megjeleníteni az oldalakra, az így néz ki:

$p = new REMySQLPagination($items);
$p->itemPerPage(5);
$page = $p->page();
foreach ($page as $item) {
    echo $item['username'].'<br />';
}
echo $p->pageLinks(12);

A page() metódus nem csinál mást, mint visszaad neked egy olyan REPMySQLItems típusú objektumot, mint ami fent az $items változóba is került, csak ennek már be lesz állítva a limitje úgy, hogy a mindig az aktuális oldalnak megfelelő listát adja vissza. Hogy mi az aktuális oldal, azt az url-ből veszi. Alapesetben a "page" nevű változóból a $_GET tömbben. Ami a REMySQLPagination objektumban állítható a pageVar() metódussal. Így másra is átállíthatod. Akár "oldal" -ra. De ha konkrét oldalszám kell, akkor csak simán átadod a page-nek az értéket:
$page = $p->page(2); //második oldal