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

- cafesk8
 - Člen | 103
 
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)

- David Grudl
 - Nette Core | 8285
 
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)}.