Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Machr na PHP - Paginátor

Aktivity
Avatar
David Hartinger
Vlastník
Avatar
David Hartinger:14.7.2013 17:10

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
You are the greatest project you will ever work on.
Avatar
Odpovídá na David Hartinger
Michal Žůrek - misaz:14.7.2013 17:56

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

Ale skusím to i bez limitu :D

 
Nahoru Odpovědět
14.7.2013 17:56
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Michal Žůrek - misaz
Kit:14.7.2013 18:39

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
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):15.7.2013 0:52

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
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Kit:15.7.2013 1:10

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

Nahoru Odpovědět
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
Tvůrce
Avatar
David Hynek:15.7.2013 19:52

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
15.7.2013 19:52
Čím víc vím, tím víc věcí nevím.
Avatar
Ori I
Člen
Avatar
Ori I:16.7.2013 20:49

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
Tvůrce
Avatar
Milan Gallas:17.7.2013 18:20

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:18.7.2013 20:43

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

 
Nahoru Odpovědět
18.7.2013 20:43
Avatar
Milan Gallas
Tvůrce
Avatar
Odpovídá na Michal Žůrek - misaz
Milan Gallas:18.7.2013 21:01

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
Neaktivní uživatel:18.7.2013 21:17

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

Nahoru Odpovědět
18.7.2013 21:17
Neaktivní uživatelský účet
Avatar
David Hynek
Tvůrce
Avatar
David Hynek:18.7.2013 21:18

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 Hartinger
Vlastník
Avatar
Odpovídá na David Hynek
David Hartinger:18.7.2013 21:19

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
You are the greatest project you will ever work on.
Avatar
David Hynek
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
David Hynek:18.7.2013 21:21

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
Tvůrce
Avatar
Odpovídá na David Hartinger
David Hynek:18.7.2013 21:23

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
Neaktivní uživatel:18.7.2013 21:25

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

Nahoru Odpovědět
18.7.2013 21:25
Neaktivní uživatelský účet
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na David Hynek
David Hartinger:18.7.2013 21:28

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

Nahoru Odpovědět
18.7.2013 21:28
You are the greatest project you will ever work on.
Avatar
Michal Žůrek - misaz:18.7.2013 22:16

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
Avatar
Michal Žůrek - misaz:19.7.2013 9:22

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
Avatar
David Hynek
Tvůrce
Avatar
David Hynek:19.7.2013 22:33

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
Tvůrce
Avatar
Nahoru Odpovědět
21.7.2013 12:04
Čím víc vím, tím víc věcí nevím.
Avatar
Ori I
Člen
Avatar
Ori I:21.7.2013 13:26

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 Hartinger
Vlastník
Avatar
David Hartinger:21.7.2013 18:58

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

Nahoru Odpovědět
21.7.2013 18:58
You are the greatest project you will ever work on.
Avatar
David Hynek
Tvůrce
Avatar
Odpovídá na David Hartinger
David Hynek:21.7.2013 19:11

:) díky moc :)

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

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

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
21.7.2013 19:59
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Ori I
Člen
Avatar
Ori I:25.7.2013 11:43

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