Autor Zpráva
ForestCZE
Profil
Ahoj,

řeším stránkování. Pomocí databáze je to jednoduché, to už mám použito na několika webech. Ale netuším, jak to udělat bez databáze pouze ve while, když potřebuju vypsat soubory.

Dejme tomu, že bude třeba:

//tyto hodnoty jsou už jakože vygenerované
$pocet_souboru = 23;
$pocet_souboru_nastranku = 5;
$pocet_stranek = ceil($pocet_souboru/$pocet_souboru_nastranku);
//4,6 (zakrouhleno nahoru na 5)

$aktualni_strana = $_GET["strana"]; //např. 2

A potom něco jako:
while(false !== ($soubory = readdir($slozka))){
if(... == ...) continue;
if(... == ...) break;

echo $soubory."<br />";
}

Nevím, jak nastavity ty podmínky v ckylu, aby mi to vypsalo jen takové soubory, které potřebuju, např: .
if($aktualni_strana == 2){ //předem nevím, kolik těch stran je, takže pouze příklad
//soubor 6, 7, 8, 9, 10
}

Mohl by mi někdo prosím pomoct? Moc děkuji předem.
juriad
Profil
ForestCZE:
Pozor na readdir, nic negarantuje ohledně pořadí vrácených souborů. Garantuje jen, že v nějakém pořadí vrátí všechny. Typicky se to pořadí ale nebude měnit.
Dále bys neměl slepě spoléhat na $_GET['strana']; lepší je něco jako:
$aktualni_strana = isset($_GET['strana'])
    && is_numeric($_GET['strana'])
    && $_GET['strana'] >= 1
    && $_GET['strana'] <= $pocet_stranek
    ? (int) $_GET['strana'] : 1;

Jestli si ty soubory v tom while naházíš do pole, použiješ scandir nebo třeba glob není důležitě. Důležité je jen dostat do pole.
$pole_souboru = ...; # tady v poli budeš mít všechny soubory seřazené tak, jak ti vyhovuje

$zacatek = ($aktualni_strana - 1) * $pocet_souboru_nastranku;
$konec = min(count($pole_soboru), $aktualni_strana * $pocet_souboru_nastranku);
for ($i = $zacatek; $i < $konec; $i++) {
    echo $pole_souboru[$i], "<br>\n";
}
ForestCZE
Profil
juriad:
Na nic slepě nespoléhám, tohle je jen osekaná verze. To jsem napsal z fleku pro příklad. A na pořadí mi nezáleží. Pouze potřebuju ovlivnit počet těch souborů.
juriad
Profil
Ok, pokud chceš zachovat ten while, tak ti stačí porovnat, zda je $aktualni_soubor v rozsahu (počítadlo, které si udržuješ při iteracích while):
if ($aktualni_soubor >= $zacatek && $aktualni_soubor < $konec) {
  # vypiš soubor
}
ForestCZE
Profil
juriad:
$zacatek = ($aktualni_strana - 1) * $pocet_souboru_nastranku;
$konec = min(count($pole_soboru), $aktualni_strana * $pocet_souboru_nastranku);
for ($i = $zacatek; $i < $konec; $i++) {
    echo $pole_souboru[$i], "<br>\n";
}

To je přesně to, co potřebuju. Děkuju :)
ForestCZE
Profil
Akorát mám ještě problém s tím, že se potřebuju zbavit toho, aby mi to nevypisovalo "." a ".."

Když použiju:

if($produkty[$p] == "." || $produkty[$p] == "..") continue;

Tak mi pouze "zmizí" ty tečky, ale už to ukáže o dva soubory méně na stránku. Mám si před tím cyklem ještě zjistit počet hodnot v poli a nějak to odečíst nebo? Díky.
juriad
Profil
ForestCZE:
Inkrementuj proměnnou s počtem souborů až za tím testem na tečky. Pak nebude ovlivněná.
Nebo pokud máš soubory v tom $pole_souboru, tak ty tečkované do něj nevkládej.
Nebo raději ukaž větší úsek kódu (od místa, kde získáváš seznam souborů až po ten cyklus, kde je výpiseš).
ForestCZE
Profil
juriad:
Mám to teď takto:

$otevrit_produkty = "products/".$link_s[1];
$produkty = scandir($otevrit_produkty);

$zacatek = ($strana - 1) * $pocet_produktu;
$konec = min(count($produkty), $strana * $pocet_produktu);
for($p = $zacatek; $p < $konec; $p++){
echo $produkty[$p]."<br />\n";
}

Tu podmínku s continue můžu vložit jedině do cyklu. Jak to mám teda prosím upravit?
juriad
Profil
Nejjednodušší je funkci scandir nahradit za glob.
2. řádek by byl:
$produkty = glob($otevrit_produkty . '/*');
Prostě jsem očekával, že pole $produkty si zpracuješ tak, aby tam žádné položky, o které nemáš zájem nebyly.

Píšu něco jiného než myslím :-)
ForestCZE
Profil
juriad:
Prostě jsem očekával, že pole $produkty si zpracuješ tak, aby tam žádné položky, o které nemáš zájem nebyly.
Nemám rád pole a tak ho používám jen v případě nutnosti.

$produkty = scandir($otevrit_produkty . '/*');
Tímto mám ten řádek nahradit? Pokud ano, tak to háže error, protože to otevírá: products/kuchynske-linky/*

EDIT: Aha, tam ještě mělo být to glob místo scandir
juriad
Profil
ForestCZE:
Opraveno. Promiň.
ForestCZE
Profil
juriad:
Opraveno. Promiň.

V pořádku. Se stane. Mě to pak napadlo.

Akorát, že takhle mi to vypíše i cestu ... no ale to je vlastně jedno, protože tu celou proměnnou mohu použít do src u obrázku.

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: