Diskuze: Machr na PHP - Paginátor

PHP PHP Machr na PHP - Paginátor American English version English version

Avatar
David Čápka
Tým ITnetwork
Avatar
David Čápka:

Ahoj všichni, tento týden si v minisoutěži o placku Machr na PHP naprogramujeme objektový paginátor. Neděste se názvu, je to velmi jednoduché.

Často v našich aplikacích vypisujeme velké množství dat (např. komentáře k článku) a samozřejmě by nebylo pro uživatele úplně ideální data vypsat všechna na jednu stránku. Proto zobrazíme jen několik položek (třeba 20) a vypíšeme odkazy na další stránky s výsledky. Určitě tohle všichni dobře znáte třeba ze seznamu (viz obrázek).

Pokuste se navrhnout objekt, který by za nás takovouto navigaci vypisoval. Měl by být samozřejmě univerzální, předáme mu tedy pouze celkový počet položek a vypisovaný rozsah. Svůj objekt prezentujte na nějaké jednoduché stránce, aby byla vidět funkčnost a použití.

Autor nejlepšího paginátoru získá placku Machr na PHP a nějaké nálepky.

Deadline je v neděli 21.7. v 18:00.

Odpovědět 14.7.2013 17:10
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Odpovídá na David Čápka
Michal Žůrek (misaz):

SQL má přeci na to LIMIT. :`

Ale skusím to i bez limitu :D

Nahoru Odpovědět 14.7.2013 17:56
Nesnáším {}, proto se jim vyhýbám.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Kit:

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.

Nahoru Odpovědět  +1 14.7.2013 18:39
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Martin Konečný (pavelco1998):

Ahoj,

udělal jsem si za několik minut primitivní stránkovač.

Zdrojový kód online:
http://pastebin.com/MAKNFsaN

Demo:
http://konecny.php5.cz/…k_paginator/

Editováno 15.7.2013 0:54
 
Nahoru Odpovědět 15.7.2013 0:52
Avatar
Kit
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Kit:

Pěkné. Jen bych místo funkce floor() raději použil funkci ceil() a bude to fungovat jak má.

Nahoru Odpovědět  +1 15.7.2013 1:10
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Hynek
Redaktor
Avatar
David Hynek:

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;
Nahoru Odpovědět  +2 15.7.2013 19:52
Čím víc vím, tím víc věcí nevím.
Avatar
Ori
Člen
Avatar
Ori:

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

link: http://devbook.sixfeetunder.cz/

 
Nahoru Odpovědět 16.7.2013 20:49
Avatar
Milan Gallas
Redaktor
Avatar
Milan Gallas:

můj výtvor najdete na adrese
http://milangallas.funsite.cz/

zdrojový kód zveřejním po konci soutěže.

 
Nahoru Odpovědět 17.7.2013 18:20
Avatar
Odpovídá na Milan Gallas
Michal Žůrek (misaz):

jinak David Čápka ho musíš poslat už teď, jak jinak by ho mohl ohodnotit?

Nahoru Odpovědět 18.7.2013 20:43
Nesnáším {}, proto se jim vyhýbám.
Avatar
Milan Gallas
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Milan Gallas:

Neboj už jsem mu kód poslal :) Myslel jsem zveřejnění kódu ostatním.

 
Nahoru Odpovědět 18.7.2013 21:01
Avatar
Jakub Šárník:

Jde to udělat taky tak, že se v konstruktoru předá pole položek?

 
Nahoru Odpovědět 18.7.2013 21:17
Avatar
David Hynek
Redaktor
Avatar
David Hynek:

Jen dotaz. Jde o PHP kód, nebo se tu bude hodnotit i CSS a okolní HTML kód?

Nahoru Odpovědět 18.7.2013 21:18
Čím víc vím, tím víc věcí nevím.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na David Hynek
David Čápka:

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 :)

Nahoru Odpovědět 18.7.2013 21:19
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
David Hynek
Redaktor
Avatar
Odpovídá na Jakub Šárník
David Hynek:

otázka co myslíš polem. Jestli máš v poli parametry, tak je to jen na tobě.

Nahoru Odpovědět 18.7.2013 21:21
Čím víc vím, tím víc věcí nevím.
Avatar
David Hynek
Redaktor
Avatar
Odpovídá na David Čápka
David Hynek:

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 :)

Editováno 18.7.2013 21:24
Nahoru Odpovědět 18.7.2013 21:23
Čím víc vím, tím víc věcí nevím.
Avatar
Jakub Šárník:

Myslel jsem, že se předá v konstruktoru pole položek, které se budou stránkovat

 
Nahoru Odpovědět  -1 18.7.2013 21:25
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na David Hynek
David Čápka:

Laťku si tu nastavujete přeci sami, já jen hodnotím :P

Nahoru Odpovědět 18.7.2013 21:28
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Michal Žůrek (misaz):

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.

Nahoru Odpovědět 18.7.2013 22:16
Nesnáším {}, proto se jim vyhýbám.
Avatar
Michal Žůrek (misaz):

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();
Editováno 19.7.2013 9:23
Nahoru Odpovědět 19.7.2013 9:22
Nesnáším {}, proto se jim vyhýbám.
Avatar
David Hynek
Redaktor
Avatar
David Hynek:

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í.

Nahoru Odpovědět 19.7.2013 22:33
Čím víc vím, tím víc věcí nevím.
Avatar
David Hynek
Redaktor
Avatar
Avatar
Ori
Člen
Avatar
Ori:

tak trochu som zmenil kod... aby to nerobilo bordel s class tagom... je to na rovnakej adrese ako stary
http://devbook.sixfeetunder.cz/

 
Nahoru Odpovědět 21.7.2013 13:26
Avatar
David Čápka
Tým ITnetwork
Avatar
David Čápka:

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, 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ě :)

Nahoru Odpovědět  +1 21.7.2013 18:58
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
David Hynek
Redaktor
Avatar
Odpovídá na David Čápka
David Hynek:

:) díky moc :)

své nedokonalosti si jsem vědom, ale snažím se, aby to bylo kus od kusu lepší...

Nahoru Odpovědět  +1 21.7.2013 19:11
Čím víc vím, tím víc věcí nevím.
Avatar
Martin Konečný (pavelco1998):

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. :-)

 
Nahoru Odpovědět  +2 21.7.2013 19:59
Avatar
Ori
Člen
Avatar
Ori:

Ďakujem za výber môjho kódu.. k tej podtrzikovej notacii... Používam to už automaticky keďže jeden z frameworkov to používa ako štandard ... :)

 
Nahoru Odpovědět 25.7.2013 11:43
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 26 zpráv z 26.