English
version 3.0.0

  PClib - PHP component library



19. 01. 2009

Rychlokurz - Datagridy

To by ovšem dokázal každý. Proto si ukážeme něco zajímavějšího. A to výpis seznamu všech zákazníků z tabulky ZAMESTNANCI do přehledné tabulky. To provedeme pomocí třech kroků:
1) Určíme šablonu, ve které budou údaje vypsány.
2) Zadáme dotaz, který poskytne zdrojová data.
3) Vypíšeme výsledek.
(Povšiměte si, že místo třídy tpl užíváme třídu grid)

<br>
$zamlist = new grid ('zamestnanci.tpl');<br>
$zamlist->setquery('SELECT * FROM ZAMESTNANCI');<br>
$zamlist->out();<br>
 


Zbývá definovat šablonu, kterou předepíšeme vzhled našeho seznamu.
Může vypadat například takto:

<br>
< ?
elements<br>
class 
grid name "zamlist"<br>
pager pager pglen "20"<br>
? ><
br>
<
br>
<
H1>Zaměstnanci</H1><br>
<
br>
<!-- 
BLOCK items --><br>
Jméno: {JMENO}, Příjmení: {PRIJMENI}, Narození: {DATNAR}<BR><br>
<!-- 
BLOCK end --><br>
<
br>
<
HR><br>
<
DIV class="pager">{pager}</DIV><br>
 


Podívejme se na ni řádek po řádku. První položka sekce elements říká, že se jedná o šablonu gridu. Následující řádek definuje stránkovátko, kterým je možné listovat celou tabulkou zaměstnanců stránku po stránce (později si ukážeme jak jde přizpůsobit vzhled stránkovátka). Délka stránky byla stanovena na dvacet řádek.

Následuje blok "items". Je to speciální blok, který musí obsahovat každá šablona gridu. Obsah tohoto bloku se vypíše postupně pro každý řádek vrácený dotazem - na jedné stránce se tedy vypíše v našem případě 20x. Parametry {JMENO}, {PRIJMENI} atd. budou samozřejmě pokaždé nahrazeny hodnotami z odpovídajícího řádku sql-dotazu.
Poslední řádek je místo, kde se zobrazí stránkovátko. Implicitně obsahuje odkaz na první a poslední stránku a odkazy 1 2 3 4 ... vedoucí na stránky s udaným číslem.

Je jasné, že v praxi budeme pro zobrazení seznamu používat nejspíš tabulku a proto bude blok items obsahovat nejspíš řádek tabulky, např.
<TR><TD>{JMENO}</TD><TD>{PRIJMENI}</TD><TD>{DATNAR}</TD></TR>

Jelikož je třída grid potomkem třídy tpl, lze používat i všechny prvky této třídy. Proto můžeme v sekci elements definovat formátování datumu jako v předchozím příkladu přidáním řádku:

string DATNAR date "%d. %m. %Y"

To myslím pro začátek stačí, v následující kapitole se podíváme na třídu form. Třída grid má ještě velmi mnoho funkcí, některé z nich si popíšeme v dalších dílech rychlokurzu. Ale na rozloučenou si ještě jako bonus ukážeme práci s prvkem "bind".

Představme si, že máme v tabulce ZAMESTNANCI sloupec FUNKCE obsahující pracovní zařazení zaměstnance - např. programátor nebo čistič záchodů. Problém je v tom, že toto zařazení je uvedeno jen jako číselný index, takže pokud do šablony přidáme parametr {FUNKCE} zobrazí se nám jen nicneříkající čísla.

řešením je přidat do sekce "elements" řádek

bind FUNKCE list "1,programátor,2,čistič záchodů"

Co se stane? Při výpisu pole FUNKCE grid vyhledá v uvedeném seznamu číslo z tabulky a nahradí ho názvem pracovního zařazení.
Očividně se tento způsob hodí jen pro krátké seznamy typu "0,NE,1,ANO".
Co ale když máme pracovní zařazení uložená v tabulce FUNKCE obsahující sloupce INDEX a NAZEV? řešení je následující:

bind FUNKCE query "select INDEX,NAZEV from FUNKCE"

V tomto případě bude grid hledat hodnoty pro nahrazení v tabulce FUNKCE. Upozoròuji, že tato funkcionalita je určená k dotahování hodnot z číselníků, rozhodně nenahrazuje sql-klauzuli LEFT JOIN.

Pokud pociujete jistou nechu psát do šablony sql dotaz, jde to i jinak. Pominu možnost použít místo query parametr "lookup", který načítá hodnoty ze standartní tabulky všech číselníků a vysvětlím jak zadat parametr "query" přímo z php kódu.

Půjdeme na to od lesa. V okamžiku vytvoření objektu šablony, tj. na řádku

$sablona = new tpl("sablona.tpl");

proběhne zpracování souboru šablony. V tuto chvíli se sekce "elements" přemění v asociativní pole elements, které je prvkem objektu $sablona. Toto pole můžete před vypsáním šablony podle libosti modifikovat a ovlivòovat tak její výstup! Převedení na pole probíhá úplně tupě a můžete do šablony napsat třeba:

<?elements
kocour mikes barva "černá" nenazranec
?>

pak

<br>
$sablona = new tpl("sablona.tpl");<br>
print 
$sablona->elements['mikes']['type'];  //vypise "kocour"<br>
print $sablona->elements['mikes']['barva']; //vypise "černá"<br>
print $sablona->elements['mikes']['nenazranec']; //vypise "1"<br>
 


(Jelikož třída tpl nemá handler, který by zpracovával typ kocour, bude tento řádek ignorovat, ale nic vám nebrání odvodit potomka, který bude s kocourem umět zacházet!)

Vrame se k našemu předchozímu příkladu. Do šablony napíšeme pouze:

<?elements
bind FUNKCE
?>

a v kódu definujeme náš dotaz:

<br>
$zaklist = new grid("zakaznici.tpl");<br>
$zaklist->elements['FUNKCE']['query'] = "select INDEX,NAZEV from FUNKCE";<br>
 

« zpět