Porovnání datumů, generování odkazů, použití šablony
- TheNEoo
- Člen | 75
Zdravím.
Reším takový problém, jakým způsobem porovnávat dle datumu, vytvořit dle datumu výpis linky atd.
Takže mám data v DB, ty si vytáhnu bez problému. A teď potřebuji, aby ty data vzal, mrknul na datumy a vytvořil dle toho odkazy – Např. Rok 2011 a při kliku na odkaz vypsal vše co patří do roku 2011. Či další příklad vzal data, mrknul na datumy a udělal odkazy třeba výpis za květen, červen atd… Nevím kde začít a tápu v tom.
Je přeci hloupost, abych dělal pro každej rok a měsíc jednu šablonu a tam porovnával co patří a nepatří do toho výpisu (porovnával podle datumu).
Netuším, jak vyrobit odkaz z těch datumů a nasledně na to, aby použil šablonu a následně na to v šabloně vypsal jen ty data co patří třeba do měsíce květen.
Editoval TheNEoo (7. 9. 2011 15:22)
- David Ďurika
- Člen | 328
Takže mám data v DB, ty si vytáhnu bez problému.
neviem ako tam mas tie data ulozene ale ked ich mas ako time stamp tak v tom pripade je to jednoduche…
Např. Rok 2011 a při kliku na odkaz vypsal vše co patří do roku 2011.
query zostavis neja takto :
<?php
$stampFrom = mktime(0, 0, 0, 1, 1, 2011);
$stampTo = mktime(0, 0, 0, 1, 1, 2012);
$query = 'SELECT * FROM table WHERE stamp>'.$stampFrom.' AND stamp<'.$stampTo;
?>
moc som ta nepochopil, ale snad ti toto pomoze
- TheNEoo
- Člen | 75
Tak nejdříve potřebuju, aby mi vypsal roky, jaké mam uložené v DB. Z těch roků aby udělal klikatelné odkazy. A při kliknutí na rok vypsal ta data, která patří k tomu roku.
A co netuším, jak provázat či „vyrobit“:
Automaticky odkazy v šabloně na roky (výpis prací za každý rok)
Jakým způsobem k tomu přiřadit šablonu.
Kdybych to mel dělat ručně, tak si můžu udělat asi něco takového:
//v šabloně default
<a href="{link 2010}">2011</a> // zde třeba nevím, jak tento odkaz vyrobit automaticky podle dat z DB.
<a href="{link 2011}">2011</a>
...
//v šabloně 2010
{foreach $works as $work}
{/if}
{if $work->date == "2011"}
......
{else}
{/if}
{/foreach}
//Napsal jsem to jen zběžne
a tak dále by to šlo dělat ručně, ale to je velmi nepraktické a zvlášť když potřebuju i měsíční výpisy, tak to potřebuji zautomatizovat, ale to nevím, kde začít.
- OK3
- Člen | 91
Presenter (SQL doatzy si můžeš šoupnout do modelu):
$year = $this->getParam('year'); // parametr vybraného roku, viz dále
$years = dibi::query('SELECT DISTINCT YEAR(datum) AS year FROM tabulka ORDER BY ...'); // roky
$items = null;
if ($year) {
$items = dibi::query('SELECT * FROM tabulka WHERE YEAR(datum) = %i', $year);
}
$this->template->years = $years; // pole s roky
$this->template->items = $items; // prázdné nebo pole položek odpovídající vybranému roku
$this->template->year = $year; // prázdné nebo vybraný rok
Šablona:
{foreach $years as $y}
<a href="{link Presenter:akce, 'year'=>$y->year}">{$y->year}</a>
{/foreach}
{if $items}
{foreach $items ...}
{else}
Vyber rok...
{/if}
V presenteru odchytáváš parametr ‚year‘, podle kterého filtruješ
položky z DB.
V šabloně (podmíněně) vypisuješ položky. Šlo by to udělat i tak, že
pokud nedostaneš v parametru nic, tak nastavíš vybraný rok třeba na ten
aktuální a pak je podmínka v presenteru i šabloně zbytečná
$year = $this->getParam('year', date('Y'));
- TheNEoo
- Člen | 75
Tak jsem se z tim zacal dal pohravat ze pridam este mesice a jmeno. Ale neni to tak lehké jak si člověk myslí:-)
Takže v šabloně tejť mám:
{foreach $years as $y}
//Zde to funguje správně.
<a href="{link ServisAp:year, 'year'=>$y->year }">{$y->year}</a>
{/foreach}
{foreach $months as $m}
//Toto už nefunguje správně. V year se mi vždy zapiše poslední rok což se dá pochopit že byl naposled generován.
<a href="{link ServisAp:year, 'year'=>$y->year, 'month'=>$m->month}">{$m->month}</a>
{/foreach}
Tak mě napadlo udělat to tak, že link ServisAP:year nahradím
ServisAP:month vytvořím samozřejmě šablonu month. To když udělám, tak mi
vznikne odkaz …/month/?month=5.
Potřebuji předat ale i parametr year a podle toho filtrovat. Takže kliknu si
na rok třeba 2011 a předá se mi v linku na další šablonu
…/month/?year=2011&month=9 tak nějak by to asi mělo vypadat.
Otázka v podstatě zní, jakým způsobem se předávaj parametry mezi šablonami v linku.
Ještě přidám pak 3 parametr name.
Takže by to ve finále mělo být ROK->MESIC->JMÉNO a předávat si mezi sebou hodnoty.
- TheNEoo
- Člen | 75
A zkus ten druhy foreach soupnout za odkaz v tom prvnim foreach a bude ti to generovat spravne;-)
Ano to jsem zkoušel a správně se naplnil year rokem. Jenže nešvar je v tom, že když přibyde další rok, tak vygeneruje i pro ten rok mesíce, které v něm nejsou, ale jsou v tom roce predešlém.
Myslím, že ne, radši bych to měl v další šabloně, protože tam budou výpisy uplně jinak formátovaný.
Vůbec se mi nedaří předat aktualní parametr year do mesíců. Vznikne mi odkaz month/month=xx .A já potřebuju, aby se mi parametr year předal do month a podle roku já podmíněne vybíram mesíce, ktere jsou v tom roce aktualní a to samé bude pak v name.
- TheNEoo
- Člen | 75
n:makra sem už zkoušel, ale ty my házi chybu.
Filter LatteFilter::__invoke: Unknown macro-attribute n:href or n:class
Odkazování v presenteru jsem zas nepochopil jak pak v šabloně volam metodu link()
Jinak sem udělal hokus pokus.
<a href="{link this, 'year'=>$year, 'month'=>$m->month }">{$m->month}</a>
Tento zápis mi začal v šabloně month přenášet rok ze šablony year. Takže typuji že to tak asi může bejt.
Editoval TheNEoo (16. 9. 2011 10:53)
- OK3
- Člen | 91
V presenteru odkazuješ – nebo spíš vytváříš odkazy pomocí
$link = $this->link('Presenter:action', array('param1'=>'value1', ...));
Ale moc časté to není generovat odkazy v presenteru.
V šabloně se k odkazování používají speciání značky
(makra) {link Presenter:action 'param1'=>'value1', ...}
Pokud v presenteru správně naplníš ty proměnné z tvého „hokus pokusu“, tak by to mělo fungovat, ale stále mi přijde, že vlastně nerozumíš proč :)
- TheNEoo
- Člen | 75
Pokud v presenteru správně naplníš ty proměnné z tvého „hokus pokusu“, tak by to mělo fungovat, ale > stále mi přijde, že vlastně nerozumíš proč :)
Pravdu máš mam v tom krapet guláš. Nedalo mi to a pořád sem se v tom šťoural a vysledek sem dal dohromady nejak takto :) Btw sem naprostej začátečník :)
Vlastně sem jen rozšířil co s napsal ty.
a zbavil se těch šablon dalších a tak. tejt to mam všechno v jedné šabloně.
Presenter
public function renderYear() {
$year = $this->getParam('year'); // parametr vybraného roku, viz dále
$month = $this->getParam('month');// parametr vybraného mesice, viz dále
$name = $this->getParam('name'); // parametr vybraného jmena, viz dále
$years = dibi::query('SELECT DISTINCT YEAR(work_date) AS year FROM worksap ORDER BY work_date'); // roky
$months = dibi::query('SELECT DISTINCT MONTH(work_date) AS month FROM worksap WHERE YEAR(work_date) = %i ORDER BY work_date',$year); //mesice
$names = dibi::query('SELECT DISTINCT (name_worker) AS name FROM worksap WHERE YEAR(work_date) = %i AND MONTH(work_date) = %i ORDER BY name_worker', $year, $month); //jmeno
if ($year) {
$items = dibi::query('SELECT * FROM worksap WHERE YEAR(work_date) = %i', $year);
}
if ($month) {
$items = dibi::query('SELECT * FROM worksap WHERE YEAR(work_date) = %i AND MONTH(work_date) = %i', $year, $month);
}
if ($name) {
$items = dibi::query('SELECT * FROM worksap WHERE YEAR(work_date) = %i AND MONTH(work_date) = %i AND name_worker = %s', $year, $month, $name);
}
$this->template->years = $years; // pole s roky
$this->template->items = $items; // prázdné nebo pole položek odpovídající vybranému roku
$this->template->year = $year; // prázdné nebo vybraný rok
$mesice = array (1 =>'Leden', 2 =>'Únor', 3 => 'Březen', 4 => 'Duben', 5=> 'Květen', 6 => 'Červen', 7 => 'Červenec', 8 => 'Srpen', 9 => 'Září', 10 => 'Říjen', 11 => 'Listopad', 12 => 'Prosinec'); //predame pole to wiveru aby sme nemeli mesice psane cislicema
$this->template->mesice = $mesice;
$this->template->months = $months;
$this->template->month = $month;
$this->template->names = $names;
$this->template->name = $name;
}
Šablona:
<div class="menu">
<ul>
<li><a href="{link this}">Roky</a>
<ul>
{foreach $years as $y}<li><a href="{link ServisAp:year, 'year'=>$y->year }">{$y->year}</a></li>{/foreach}
</ul>
</li>
{if $year}
<li><a href="{link this}">Měsíce</a>
<ul>
{foreach $months as $m}<li><a href="{link ServisAp:year, 'year'=>$year, 'month'=>$m->month }"><?php echo $mesice[$m->month]; ?></a></li>{/foreach}
</li>
</ul>
{/if}
{if $month}
<li><a href="{link this}">Jména</a>
<ul>
{foreach $names as $n}<li><a href="{link ServisAp:year, 'year'=>$year, 'month'=>$month, 'name'=>$n->name}">{$n->name}</a></li>{/foreach}
</ul>
</li>
{/if}
{if $name}
<li><a href="{link ServisAp:Generate, 'year'=>$year, 'month'=>$month, 'name'=>$name}">Vygeneruj výkaz práce</a></li>
{/if}
</ul>
</div>
Tejť zas dohledávám jak se zbavit v šavbloně.
<?php echo $mesice[$m->month]; ?>
Napadlo mě něco ve stylu $p->pokus[$m->month] ale tak to
samozřejmně nejde :)
Tak luštim jak na to. Přijdu na to :)
Editoval TheNEoo (21. 9. 2011 9:21)