Autor Zpráva
sloncz
Profil
DObrý, mám dotaz ohledně stránkování.

Na webu mám stránky se jmenem dnesnidatum.php, vcerejsidatum.php, jinedatum.php a každý z těch souborů obsahuje XXX záznamů. Každý záznam je uzavřný v <cast_1>obsah 1</cast_1>, <cast_2>obsah 2</cast_2>.
Můj dotaz zní, je-li možné udělat v každé této stránce stránkování, aby se z těch např. 50 záznamů, zobrazilo na dané stránce maximálně 10 záznamů a dole byly tlačítka, která by přivedli na další stránku (ideálně změna jen pomocí GET požadavku ?zobrazit=2 - zobrazí dalších 10 záznamů, ?zobrazi=3 - zobrazí dalších 10 záznamů). Jde mi o to, že pokud je v souboru například 300 částí, tak aby netrvalo miliony let, než se stránka s těmi všemi údaji načte.

Pokud by někdo měl nějaké rady, jak dané stránkování udělat, byl bych moc rád, Děkuji.
Tori
Profil
sloncz:
Ty záznamy máte napsané napevno (= jen řetězec), anebo se do nich dynamicky doplňují nějaké hodnoty, proměnné, volání funkcí apod.?
sloncz
Profil
Ty záznamy jsou napsány na pevno, nijak se neměnní. Je to html stránka, která se rovnou zobrazuje na webu.
Tori
Profil
Můžete to html rozebrat nějakým html parserem, a načíst jen prvky v zadaném pořadí.
Anebo se dá udělat cache - stránku rozebrat jen jednou, vytahnout z ní data, uložit do pole, serializovat a uložit do souboru. Při dalším čtení jen vytáhnete prvky s indexem x–y z pole. Dá se to zautomatizovat, aby se serializovaná data aktualizovala pokaždé, když bude čas modifikace cache starší než čas modifikace zdrojového souboru.
Druhá varianta bude asi rychlejší pro seznamy s min. stovkami položek (odhadem).

A asi by to šlo udělat i JavaScriptem, nastavit display: none položkám mimo požadovaný rozsah. Zadání pro zobrazení záznamů od do dávejte (a měňte) pomocí kotvy, je potřeba u ní sledovat jestli se změnila a pokud ano, tak projít stránku a skrýt/zobrazit požadované záznamy.
sloncz
Profil
Když bych tomu dal jen display:none;, tak se mi stejně budou načítat všechny soubory, jen nebudou vidět a stránka bude stejně nabíhat dlouho :/
mimochodec
Profil
sloncz:
Když bych tomu dal jen display:none;, tak se mi stejně budou načítat všechny soubory, jen nebudou vidět a stránka bude stejně nabíhat dlouho :/

Proto to taky Tori zmiňuje jen jako jednu z možností, ne jako jednoznačně nejlepší variantu. Výhodou by naopak bylo, že při klikání na starší / novější desítky záznamů by se ze serveru nestahovalo nic.
Mně ještě nejsou úplně jasné ty počty. Počet záznamů v těch jednotlivých souborech je vždy stejný? Pokud ano, nejspíš by se dala napsat nějaká logika, která by s těmi soubory pracovala jako se svého druhu "databází". Řekněme, že při požadavku zobraz.php?datum=20140415 by si php sáhlo pro patřičný soubor, vytáhlo požadovaná data a zobrazilo. Kromě toho by se už jednou rozparsovaná data dala uložit v nějaké efektivnější formě, která by od druhého požadavku dále byla ještě rychlejší.
Alphard
Profil
Zdá se, že to nestránkované řešení už někde funguje. Bylo by dobré uvést odkaz.
sloncz
Profil
Vše mám na localhostu, takže nevím jak bych sem dostal ukázku.

Mně ještě nejsou úplně jasné ty počty. Počet záznamů v těch jednotlivých souborech je vždy stejný?

Každý soubor je pro jedno dané město v ČR. V každém souboru není přesně XX záznamů, ale každý záznam je uzavřen v tagu
<cast_1>obsah 1</cast_1>, <cast_2>obsah 2</cast_2>, ..

Napadlo mě, že by šlo nějak spočítat počet těch tagů a pak na stránce vypsat prvních 10 záznamů. Přesně, jako to funguje v DB s řádkama.
mimochodec
Profil
sloncz:
Napadlo mě, že by šlo nějak spočítat počet těch tagů a pak na stránce vypsat prvních 10 záznamů. Přesně, jako to funguje v DB s řádkama.

Šlo. A pokud je tam opravdu i to číslování <cast_1>obsah 1</cast_1>, nevidím v tom žádný problém. Zjistíš nejvyšší číslo, z něj spočítáš, kolik těch desítek v souboru je, podle toho vygeneruješ nějaký blok se stránkováním. A vypíšeš tu desítku, která je zrovna požadovaná.
sloncz
Profil
Dobře, když tedy si do proměnné vypočítám počet těch částí, jak potom vypíšu pouze 10 záznamů? Pořád se v tom motám, protože u DB k tomu stačí jeden sql příkaz, ale tady? :/
mimochodec
Profil
Vezmeš obsah souboru a najdeš pozici <cast_1> a pozici </cast_10>. To, co tě zajímá, je mezi tím. Získáš to pomocí substr. Pak najdeš předěly mezi jednotlivými záznamy a jejich obsah. Prostě naprogramuješ parser.
sloncz
Profil
Sakra, omlouvám se za nepřesné informace. Ono je to sice rozdělený do částí, ale do částí jako

<table>obsah_cast_1</table>, <table>obsah_cast_2</table>, ..

Takže podle čísel to asi půjde špatně. :/
mimochodec
Profil
Ne, půjde to stejně dobře. Jestli se na to necítíš, tak to dej do Práce a zakázky. Nebo mi rovnou mailem pošli ukázku, podívám se na to. Mail mám v profilu.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: