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 | 8218
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)}
.