Porovnání datumů, generování odkazů, použití šablony

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
TheNEoo
Člen | 75
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

Děkuji za spolupráci to je přesně ono co potřebuju zas sem o něco chytřejší :-)

TheNEoo
Člen | 75
+
0
-

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.

hAssassin
Člen | 293
+
0
-

@TheNEoo > a co kdybys to mel vsechno jedny akci (treba actionDefault s parametrama year, month a name? Nebylo by to jednodussi? A zkus ten ten druhy foreach soupnout za odkaz v tom prvnim foreach a bude ti to generovat spravne;-)

TheNEoo
Člen | 75
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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)

hAssassin
Člen | 293
+
0
-

no prece uplne normalne:

{$mesice[$m->month]}