Výpočty v šabloně – přes makro?

cafesk8
Člen | 102
+
0
-

Zdravím,

po odeslání formuláře si do šablony vytáhnu položky z databáze:

<?php
	public $my_items;

	public function renderCalculator() {
		$this->template->my_items = $this->my_items;
	}
	public function formSuccess() {
		$this->my_items = $this->itemsRepository->findAll();
    }
?>

a v šabloně poté ve smyčce vypisuji jejich hodnoty:

{ifset $my_items}
    {foreach $my_items as $item}
        {$item->foo}
		{$item->bar}
        {$item->foobar}
    {/foreach}
{/ifset}

Což je v pořádku a funguje mi to správně. “Problém” nastává ve chvíli, kdy bych potřeboval se sloupci z databáze dělat nějaké složitější operace/výpočty.

Nerad bych logiku cpal do .latte šablony, protože si myslím, že výpočty by měly být spíše ve vrstvě control či model.

V latte bych to udělal takto, což mi nepřipadá OK:

{var $calculated = ({$item->bar} *12) / ({$item->foo} + {$item->foobar})}
Vypočtená hodnota je: {$calculated}

Nebo mě napadlo v presenteru si data projet nějakou smyčkou a nacpat do pole

	public function formSuccess() {
		$db_items = $this->itemsRepository->findAll();
		$my_items = [];
		foreach($db_items as $db_item) {
			$db_item['calculated'] = ($db_item['bar']*12) / ($db_item['foo'] + $db_item['foobar]);
			$my_items[]	= $db_item;
		}
		$this->my_items = $my_items;
}

a potom bych mohl ve smyčce šablony už jen psát:

Vypočtená hodnota je: {$item->calculated}

Anebo tu funkci pro výpočet dát rovnou do vrstvy modelu, tudíž do itemsRepository.php a pak volat namísto

<?php $db_items = $this->itemsRepository->findAll(); ?>

rovnou

<?php $db_items = $this->itemsRepository->findAllwithCalculatedValue(); ?>

Další věc co mě napadla je napsat si nějaké latte makro, kde bych vlastně obešel tuto smyčku plnění vlastního pole a udělal bych si něco jenom jako

{$item|caculate:$item->foo:$item->bar:$item->foobar}

Co si myslíte že je nejlepší? Případně jestli jsem úplně mimo mísu, poradíte mi jak byste postupovali Vy?

Děkuji

Editoval cafesk8 (28. 2. 2020 12:00)

Ondřej Kubíček
Člen | 476
+
+3
-

jo, dal bych to zrovna do toho modelu

David Grudl
Nette Core | 7420
+
+3
-

Pokud je ten výpočet smysluplný pro model, udělal bych pro něj funkci tam. Pokud má smysl jen pro zobrazování, přidal bych funkci v prezentační vrstvě. Způsobů je víc, může to být funkce komponenty/presenteru {$presenter->calculate($item)} nebo nějakého dalšího objektu {$helper->calculate($item)} nebo custom funkce {calculate($item)}.