Pokročilé stránkování v PHP
Za víc než 10 let, co svou stránkovací knihovnu používám, už prošla řadami změn. Od nepatrných, jako jsou bug fixy až po zásadní, jako například změna parametrů v konstruktoru. Některé nové funkce byly přidány, ale základní kostra je víceméně stejná.
Komentáře k článku:
mas radek:$this->around = $aroundale nemas ji uvedenou v clenskych promennychmam podobnou tridu akorat nejak nema "advanced" mod zobrazovani jen stranek okolo a taky mame rozdil v tom ze ja to mam ciste jen pro pole a ty pro MySQL DB :), ale zase ta ma trida ma i urcite zavislosti napriklad na generovani URL at nemusim resit RewriteEngine a vubec se v te tride o URL starat :))Ale supa skript ;)
ja nastavuju v te sve tride separatory, tlacitka (dalsi, predchozi, zacatek, konec) co potrebuju a nastavim to jenom Controlleru (trida ktere ovlada aktualni stranku...) a necham vypsat mam svuj template system takze v template to budu mit pouze takto:$paging$a v Controlleru:$page = new Kram_Paging($arr, 10); // pole s daty a limit
/** ted zde budou nejake settery Pageru, ty separatory nazvy tlacitek, nastaveni stylu zobrazovani zaznamu.. */
$this->view->addData('paging', $page->getPages());pokud budu potrebovat napriklad designove oddelit tlacitka zacatek,konec tak jen napriklad hodim do template:<div class="paging_start">$paging_start$</div&g-t;
<div class="paging_pages">$pages$</div>
<div class="paging_end">$paging_end$</div> a v Controlleru jen:$this->view->addData('paging_start', $page->getFirstPage());
$this->view->addData('paging', $page->getPages());
$this->view->addData('paging_end', $page->getLastPage());takze ani v sablone s tim nemam problem :)jedine co je minus asi to ze ja musim predat kompletni pole s daty za to ty pracujes s poctem vysledku.., ale ja sem zase na tolik perverzni ze web bud cachuju nebo sem schopny udelat prasarnu typu ze vsechny clanky a menu hodim do $_SESSION a do DB pak uz moc nehrabu :D
Miku, pěknej a poučnej článek. Zrovna jsem zjistil, že po koupení nového PC jsem si tě nevrátil do RSS čtečky... to musím hned napravit. :)
2) uchováváním v členských proměnných a získáváním přes funkce ušetříš právě globální proměnné, které bys musel procedurálně nabalovat.
3) ve funkci bys to sice mohl uchovávat ve statické proměnné, ale pak by bylo nutné podmiňovat výstup.
4) objekty se mnohem příjemněji přesouvají - vždy se totiž předají přes referenci
5) print_r($this) je opět hezčí než print_r($GLOBALS) na dump proměnnýchZáleží ovšem na každém, s čím se mu dělá lépe :o)
Jsem v tomto nováček,něco jsem již dělal, ale v menším rozsahu, předem díky za jakoukoliv radu.Honza
Tímto si vytáhnu a spočítám počet položek ze souboru array.txt.$polozky_z_txt = unserialize(file_get_contents('array.txt'));
$pocet_txt = (count($polozky_z_txt)-1); //ta -1 je pro výpis ne od nuly.....Takže z toho vím kolik položek mám, kolik chci na stránku a i kolik stránek potřebuju, není mi zatím jasné jak se vytváří nová stránka (nebo přepisuje).Díky, Honza
$paging->set_paging();
echo $paging;Limit po 20 ti záznamech. Ostatní strany zobrazíš právě pod zmíněnou rezervovanou proměnnou, čiže:skript.php?page=1 / 2 / 3 atd ...To ale nemusíš nikde nastavovat, protože echo $paging; ti vypíše komplet html kód včetně funkčních odkazů na další strany.
skusal som toto:
<?php
include('class.Paging.php');$link = mysql_connect('localhost', 'user', 'password');
if (!$link) {
die('Could not connect: ' . mysql_error());
}
if (!mysql_select_db('database')) {
die('Could not select database: ' . mysql_error());
}$total = mysql_result(mysql_query("SELECT COUNT(*) FROM `table`"), 0);
$limit = 20;
$base = 'http://www.treba.cz/kategorie/';
// celkem | [zakladna] | [po kolika] | [format parametru]
$paging = new Paging($total, $base, $limit, '&page=%s');
$paging->set_title_format('Stránka %s'); // nepovinne
$paging->set_around(2); // nepovinne
$paging->set_paging_mode(1); // 0
$paging->set_output_mode(1); // 0
$paging->set_paging();
// vystup
echo $paging->export_paging(); // echo $paging; // $tpl['paging'] = (string)$paging;
// parametry limit pro sql dotaz:
$sql_start = $paging->get_start();
$sql_limit = $paging->get_limit();
?>
Ale to je urcite zle :D prosim Mike daj ukazku "nasazeni" so SQL
ako to mam osetrit? asi to je niekdu tu:
$href_format = (string)$href_format;
if ($href_format) {
if (strpos($href_format, '%s')) {
$this->href_format = $href_format;
}
} else {
if (strpos($_SERVER['REQUEST_URI'], '?') || strpos($_SERVER['REQUEST_URI'], '&')) {
$this->href_format = '&page=%s';
}
}
$p = (!empty($_GET['page']) ? (int)$_GET['page'] : 0);
$this->actual = abs($p)-1;
if ($this->actual < 0) {
$this->actual = 0;
}ale co s tym?
$paging = new Paging($total, $base, $limit, '&page=%s');
na
$paging = new Paging($total, $base, $limit, '?page=%s');
bola to chyba alebo mam ja nieco zle?
velmi pěkné a užiteční stránkování. Nicméně měl bych k němu jeden dotaz. Chtěl jsem si změnit 4. parametrem URL a namísto "?page=%s" tam mít něco jiného. Změnit se mi to v konstruktoru podařilo, ale výsledkem bylo nefunkční stránkování, které sice házelo do url mnou definovaný klíč a hodnotu, ale nestránkovalo a tuto hodnotu z URL ani nevyhazovalo, takže když jsem potřetí klikal na "přejití na další stránku", měl jsem v URL svoji dvojici "klíč=hodnota" třikrát...
Objekt vytvářím takto:
$paging = new Paging($n_rows, NULL, 10, '&gr_page=%s');
(V proměnné n_rows je počet řádků dat, která chci stránkovat).
Dělám někde chybu ?
Rád bych se zeptal, co když chci mít url čistou ... jak přenášet parametr v SESSION ???
<předchozí 1 ... 5 | 6 | 7 | 8 | 9 ... 50 dlaší >Něco podobného má mallJak to udělat ?
jaká podmínka, jak to mám použít?
<?php
include('class.Paging.php');
$link = mysql_connect('88.86.117.154:3306', 'kolemzeme.wz3044', 'heslo');
if (!$link) {
die('Could not connect: ' . mysql_error());
}
if (!mysql_select_db('kolemzeme.wz3044')) {
die('Could not select database: ' . mysql_error());
}
$total = mysql_result(mysql_query("SELECT COUNT(*) FROM `hledat_web`"), 0);
$limit = 20;
$base = 'http://www.kolemzeme.wz.cz/zkouska.php/';
// celkem | [zakladna] | [po kolika] | [format parametru]
$paging = new Paging($total, $base, $limit, '?page=%s');
$paging->set_title_format('Stránka %s'); // nepovinne
$paging->set_around(2); // nepovinne
$paging->set_paging_mode(1); // 0
$paging->set_output_mode(1); // 0
$paging->set_paging();
// vystup
echo $paging->export_paging(); // echo $paging; // $tpl['paging'] = (string)$paging;
// parametry limit pro sql dotaz:
$sql_start = $paging->get_start();
$sql_limit = $paging->get_limit();
?>
<?php
$print_paging = $paging->export_paging();
if(!empty($print_paging)){
?>
<p class="strankovani">
<strong>Stránkování:</strong><br />
<?php echo $print_paging; ?>
</p>
<?php }?>
A ještě jsem změnil sql dotaz z:
$data = mysql_query("SELECT * FROM `hledat_web` WHERE `Nadpis` LIKE '%$item%' OR `Text` LIKE '%$item%'");
na:
$data = mysql_query("SELECT * FROM `hledat_web` WHERE `Nadpis` LIKE '%$item%' OR `Text` LIKE '%$item%' DESC limit ".$paging->get_start().", ".$paging->get_limit()."")->assocList();
Pořád mi to však nefunguje. Mohl bys mi poradit? Děkuji.
->assocList. to je moje metoda, kterou ty voláš ve špatném kontextu.
Notice: Undefined variable: paging in /3w/wz.cz/k/kolemzeme/hledej.php on line 3
a:
Fatal error: Call to a member function get_start() on null in /3w/wz.cz/k/kolemzeme/hledej.php on line 34
Udělal jsem to co jsi mi říkal a provedl jsem ještě pár úprav a funguje to! Super článek.
<?php
// strankovani
$total = mysql_query("SELECT * FROM `hledat_web`");
$base = 'http://kolemzeme.wz.cz/zkouska.php?find='.$item.'';
$limit = 10;// celkem | [zakladna] | [po kolika] | [format parametru]
$paging_fulltext = new Paging($total, $base, $limit);
$paging_fulltext->set_around(2); // nepovinne
$paging_fulltext->set_paging_mode(1); // 0
$paging_fulltext->set_output_mode(1); // 0
$paging_fulltext->set_paging();?>
<div style="text-align:center;">
<?php
$print_paging = $paging_fulltext->export_paging();
if(!empty($print_paging)){
?>-
<p>
<span>STRÁNKY</span><br />
<span class="video"><?php echo $print_paging; ?></span>
</p>
<?php }}?></div>A sql dotaz jsem upravil na:$data = mysql_query("SELECT * FROM `hledat_web` WHERE `Nadpis` LIKE '%".mysql_real_escape_string($item)."%' OR `Text` LIKE '%".mysql_real_escape_string($item)."%' LIMIT ".$paging_fulltext->get_start().", ".$paging_fulltext->get_limit()."");
Jak to do takového systému zakomponovat?Děkuji předem za odpověď a opravdu nerad obtěžuju. Vím, že mi chybí kupa znalostí k aplikováních těchhle věcí, chci si ale prostě rozjet svůj vlastní web o jedné hře a nerad bych sahal k něčemu, jako je wordpress. Časem, až nabydu lepších znalostí, bych si web rád vytunil, ale do té doby hledám rady, kde se dá. Díky
{
// Vrátí seznam článků v databázi
public function vratClanky()
{
return Db::dotazVsechny('
SELECT `clanky_id`, `titulek`, `url`, `popisek` , `autor` , `obrazek`, `vydano`
FROM `clanky`
ORDER BY `clanky_id` DESC
');
}
}Tohle je moje třída pro správu článků. To si myslím, že je to pravé místo, o kterém jsi mluvil. Myslím, že bych měl ten sql dotaz nasadit hned po funktion vratClanky.
Tam dám ono
$total = mysql_result(mysql_query("SELECT COUNT(*) FROM `clanky`"), 0);
$limit = 5;
$base = 'http://www.....cz/clanky/';? Možná se pletu. Ale i pokud ne, tak vlastně nevím, co s tím dál.
{
$total = ...
$limit = ...$output = array();
$output['clanky'] = Db::dotazVsechny("
SELECT `clanky_id`, `titulek`, `url`, `popisek` , `autor` , `obrazek`, `vydano`
FROM `clanky`
ORDER BY `clanky_id` DESC
LIMIT {$sql_start}, {$sql_limit}
");
$output['paging'] = $paging;
return $output;
}ty mysql_funkce by samozřejmě bylo dobré upravit na správné metody té Db třídy, ale to stačí až v druhé fázi. samozřejmě musí být naincludovaná knihovna a viditelná proměnná.výstup funkce jsem upravil tak, aby vrátil pole o dvou klíčích - 1) články 2) stránkování
Snad jsem se zase něco maličko naučil. Miku, díky!
Děkuji
Muzete mi poradit?
Přidat komentář