Diskuze: Machr na PHP - Paginátor
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Vlastník

Zobrazeno 26 zpráv z 26.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
SQL má přeci na to LIMIT.
Ale skusím to i bez limitu
Ale ty se nemáš hrabat v databázi. Máš jen vygenerovat seznam třeba tří položek
<a href="?page=1">1</a>
<a href="?page=2">2</a>
<a href="?page=3">3</a>
a když dostaneš první číslo třeba 12, tak aby to vypsalo odkazy na 12, 13, 14 apod. Tak, aby na to uživatel mohl kliknout.
Ahoj,
udělal jsem si za několik minut primitivní stránkovač.
Zdrojový kód online:
http://pastebin.com/MAKNFsaN
Pěkné. Jen bych místo funkce floor() raději použil funkci ceil() a bude to fungovat jak má.
Zdar, tak běžím i já se svou troškou do mlýna
http://davidhynek.cz/paginator.php
class Paginator
{
public $celkem;
public $pocet;
public $pozice;
public $adresa;
public $vypis = "";
public $trida;
public $roztec = 4; //vzdalenost od aktualni pozice -1 :o)
/*
první parametr = celkový počet záznamů
druhý parametr = počet záznamů pro výpis
třeti parametr = ID divu výpisu pro stylování v CSS
čtvrtý parametr = nazev odkazu pro GET
*/
function __construct($c = 0, $p = 10, $t = 'paginator',$g = 'poz')
{
$this->celkem = $c;
$this->adresa = $_SERVER['PHP_SELF'];
$this->znak = "?";
$this->pocet = $p;
$this->trida = $t;
$this->g = $g;
$this->pozice = (isset($_GET[$this->g]) and $_GET[$this->g]*1>0)?$_GET[$this->g]:0; // zjisteni pozice z URL
$this->vypis = $this->adresa();
}
function __toString()
{
return "<div id='".$this->trida."'>\n".$this->vypis."</div>";
}
function odkaz($a,$n,$p)
{
return "\t".(($n == $p)?"<strong>$a</strong>":"<a href='{$this->adresa}{$this->znak}{$this->g}=$n'>$a</a>")."\n";
}
public function adresa()
{
if($this->celkem == 0) return "\tNejsou zde žádné výpisy.\n";
if($this->celkem <= $this->pocet) return "\tZobrazeno všech {$this->celkem} výpisů.\n";
else
{
$v = "";
$s = "";
$p = $this->pozice;
$x = ceil($this->celkem / $this->pocet);
if($x > ($this->roztec * 2))
{
$s .= $this->odkaz("<<",0,$p);
if($p>$this->roztec) $s .= "\t<span>...</span>\n";
for($a=1;$a<(2*$this->roztec);$a++)
{
$n = ($a+$p-(($p<$this->roztec)?$p:($p<($x-$this->roztec)?$this->roztec:$p-$x+(2*$this->roztec))));
$s .= $this->odkaz($n,$n,$p);
}
if($p<($x-$this->roztec)) $s.= "\t<span>...</span>\n";
$s .= $this->odkaz(">>",$x,$p);
}
else
for($a=0;$a<$x;$a++) $s.= $this->odkaz($a+1,$a,$p);
return $s;
}
}
}
// příklad použití
$p3 = new Paginator(1000,20,'vypis3','poz3');
echo "\n\n<h3>1000 záznamů, list po 20:</h3>\n".$p3;
tak prikladam tu ja svoj vytvor... viete si nastavit ktory parameter z adresy
to ma brat.. cize viete mat viacej strakovani naraz... dalej sa tam da nastavit
kopa inych veci ale to si uz poskusajte vy... no a este to kopiruje dalsie
parametre v url... cize mozte tam mat aj ine a vygeneruju sa v
strankovani...
PS: niesom ziaden php guru... v oop sa tiez nevyznam najednotku... ak tam
najdete chybu alebo vas napadne daco co by som tam mal dat dajte vediet
můj výtvor najdete na adrese
http://milangallas.funsite.cz/
zdrojový kód zveřejním po konci soutěže.
jinak David Hartinger ho musíš poslat už teď, jak jinak by ho mohl ohodnotit?
Neboj už jsem mu kód poslal Myslel jsem zveřejnění kódu ostatním.
Jde to udělat taky tak, že se v konstruktoru předá pole položek?
Jen dotaz. Jde o PHP kód, nebo se tu bude hodnotit i CSS a okolní HTML kód?
Pokud budou mít všichni účastníci dokonalý PHP kód, musím
přihlédnout i k HTML a CSS. Pokud bude mít někdo dokonalé CSS a mizerný
PHP kód, tak má samozřejmě smůlu
otázka co myslíš polem. Jestli máš v poli parametry, tak je to jen na tobě.
Aha... tak to budu muset ještě stylovat... ty mi dáváš tedy... ale co
bych pro placku neudělal
tak to moje ještě neber jako finální podobu, upravím trochu i kód pro
více typů výpisu
Myslel jsem, že se předá v konstruktoru pole položek, které se budou stránkovat
Laťku si tu nastavujete přeci sami, já jen hodnotím
já jsem dneska teď něco vykoumal, ale už se mi s tím neche dělat, tak to dodělm zítra a zítra to i pošlu se zdrojákem, poprvé se za něj příliš nestydím.
Snažil jsem se oddělit logiku od výstupu, no uvidím. Jinak mě to funguje tak že v PHP je (natvrdo) uveden celkový počet stránek a do url se přidává jednoduše attribut page se stránkou, teď mi ještě došlo že to nemám ošetřené na injekci, ale to zíra dodělám.
Ahoj, tak jsem přidávám svůj výtvor: http://uloz.to/…hp-misaz-zip
je to celkem jednoduché a snažil jsem se aby bylo i objektové. Ověřuje to injekci tak že pokud není strana číslo - pokud není is_numeric, tak se jako strana dosadí 1. stejně tak pokud není uvedeno žádné ?page tak se "dosadí" 1.
Snažil jsem se to oddělit od výstupu a proto do stránky plaginátor dostanete jednoduše:
// musíme importovat script, toho se nezbavíme
require "paginator.php";
// vytvoříte mu instanci
$paginator = new Paginator(‹‹celkový počet stránek››, ‹‹stránka››);
// první parametr uvádí celkový počet stránek
// druhý (volitelný) uvádí stránku do které se plaginátor vkláda relativně k scriptu plaginátoru.
// necháte ho vypsat do stránky:
$paginator->Vypis();
o.k. tak jsem ten svůj script ještě trochu vylepšil a přidal tam funkci startovací stránky výpisu. HTML je si myslím vygenerován dostatečně přehledně a CSS už je jen otázkou co a jak se komu líbí.
tak trochu som zmenil kod... aby to nerobilo bordel s class tagom... je to na
rovnakej adrese ako stary
http://devbook.sixfeetunder.cz/
Musím říci, že hodnocení těchto minisoutěží je stále těžší a těžší, jelikož vy jste stále lepší a je vás více, dnes jsem to nějak nedokázal bodově ohodnotit, tak alespoň pár slov.
Nejlépe si s tím pohrál Ori I, a to i co se týče kódu, tak co
se týče vzhledu, proto získává placku Kód máš asi nejlépe
zdokumentovaný, i když se mi nezdá použití var a podtržítková notace, to
větvení je tam trochu divoké. Druhou placku dostane David Hynek, jelikož je
to pěkné, funkční a už se ve zdejších soutěžích snaží docela dlouho.
Škoda chybějící dokumentaci a použití jednopísmenných proměnných.
Další pěkný kód měl Martin Konečný (pavelco1998), který ovšem ani po Kitově
zmínce neopravil floor za ceil a tudíž se nezobrazuje správně počet
stránek. fuulllův paginátor není univerzální, jelikož obsahuje
databázové dotazy. Misaz si to zjednodušil tím, že bere přímo počet
stran místo počtu položek
Adresy prosím pošlete x do PM, vítězům gratuluji, na
ostatní se těším příště
díky moc
své nedokonalosti si jsem vědom, ale snažím se, aby to bylo kus od kusu lepší...
V první řadě bych chtěl pogratulovat výhercům. V té druhé bych jen
chtěl říci, že co již postnu, to už nechci nadále opravovat, zvláště,
pokud řešení nenaleznu sám. Tož důvod, proč jsem to nakonec neopravil a
nechal první a poslední verzi.
Zobrazeno 26 zpráv z 26.