Jak do stránky vypsat výsledek výpočtu nad sloupci v tabulce

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

Zdar, omlouvám se za možná úplně blbej dotaz, ale nějak jsem se do toho zamotal a už nevím, kudy kam.
Takže k dotazu:

Mám v mysql tabulku vykony, která obsahuje sloupce Cas(time) a Vzdalenost(decimal). Do tabulky ukládám výsledky nějakých běhů.

V modelu mám:

public function getAktivity()
	{
		return $this->database->table('vykony');
	}

v presenteru mám:

$this->template->aktivity = $this->aktivity->order('Datum');

a v šabloně pak vypisuju jednotlivé běhy takto:

{foreach $aktivity as $aktivita}
<tr>
	<td>{$aktivita->Vzdalenost} km</td>
	<td>{$aktivita->Cas}</td>
	<td><a n:href="detail, $aktivita->id"><img src="{$basePath}/img/zoom.png" title="Detail trasy" ></a></td>
</tr>
{/foreach}

Teď bych chtěl přidat sloupeček, kde bude průměrné tempo na kilometr. Chápu, jak to vypočítat, ale nevím, kam by to mělo přijít.
Uměl bych třeba udělat v mysql pohled, který by už tenhle sloupec obsahoval:
(select Cas,Vzdalenost, sec_to_time(time_to_sec(Cas)/Vzdalenost) as Tempo from vykony;)
a mohl bych načítat ten místo tabulky, ale to se obávám, jestli pak bude možné snadno upravovat záznamy, jako když pracuju přímo s tabulkou

$this->aktivity->get($id)->update($form->values);

Nejradši bych to udělal přímo v šabloně, při výpisu jednotlivých řádku, ale nevím, jak to zapsat. Pokud použiju něco jako

<td>{$aktivita->Cas/$aktivita->Vzdalenost}</td>

tak se vypisují jen nuly.

Jan Endel
Člen | 1016
+
0
-
{var $tempo = $aktivita->cas/$aktivita->vzdalenost}
{$tempo}

pokud to teda potrebujes jen vypsat a nikde neukladat

Editoval pilec (15. 8. 2011 20:53)

Mikulas Dite
Člen | 756
+
0
-

Právě že pokuď to nechce ukládat, tak spíš jenom

{=$aktivita->cas / $aktivita->vzdalenost}
edmund
Člen | 28
+
0
-

Díky, za rady, zkoušel jsem obě varianty, ale ani jedna nefunguje. První nevypisuje nic a druhá opět jen nulu. Ještě jsem to trochu testoval a zdá se mi, že v proměnné $aktivita->cas je hodnota typu string a ne očekávané číslo. Když napíšu jen:
{$aktivita->Cas} vypíše se 00:50:10
{$aktivita->Cas |date:‚%h:%i:%s‘} vypíše ::
{$aktivita->Cas |number:2} vypíše 0.00

Přitom v db má tento sloupec typ time. Používám i jiný sloupec, který je typu date a u něj normálně funguje zápis:
{$aktivita->Datum|date:‚%d.%m.%Y‘}
Zatím jsem se dopracoval k tomuhle funkčnímu kódu:

<td>
  <?php
    $c=explode(":",$aktivita->Cas);
    $s=($c[0]*3600+$c[1]*60+$c[2])/$aktivita->Vzdalenost;
    echo  Date ("i:s", MkTime (0, 0, $s, 0, 0, 0));
  ?>
  </td>

Dělá přesně to, co chci, ale vůbec se mi to nelíbí. Určitě to musí jít nějak jednodušeji.

Editoval edmund (16. 8. 2011 10:49)

Milo
Nette Core | 1283
+
0
-

A v jakém formátu máš ten čas? Jestli to je H:M:S tak to dělit nepůjde. Ten výpočet bych provedl rovnou v databázi, bez použití view. Ale nevím jak na to, Nette\Database nepoužívám.

Anebo si napsat vlastní helper.

Editoval Milo (16. 8. 2011 10:47)

Semik
Backer | 135
+
0
-

edmund napsal(a):

Díky, za rady, ozkoušel jsem obě varianty, ale ani jedna nefunguje. První nevypisuje nic a druhá opět jen nulu.

Není problém s „datovým typem“ ? Jsou jisté varianty, které bude mít výsledek podle toho jakého typu bude čitatel resp. jmenovatel (float, int .....). Teda co vím z jiných jazyků.

Editoval Semik (16. 8. 2011 10:47)

edmund
Člen | 28
+
0
-

viz moje opravená reakce…
Nějak dlouho jsem to psal a mezitím se objevili další reakce :-)

Claudie1
Člen | 21
+
0
-

neznám Nette\Database, používám dibi. Ovšem pokud jde při selectu použít funkce MySQL, použij při selectu sloupce cas TIME_TO_SEC() -dostanes hodnotu v sekundách

Editoval Claudie1 (16. 8. 2011 11:24)

edmund
Člen | 28
+
0
-

tak díky Claudie1 za nakopnutí. Nakonec stačilo upravit jen jeden řádek v prezenteru:

$this->template->aktivity = $this->aktivity->select("*,sec_to_time(time_to_sec(Cas)/Vzdalenost) as Tempo")->order('Datum');