Problém výpisu dat v šablony
- Onda
- Člen | 20
Zdravím, narazil jsem na menší problém a nevím jak ho efektivně a čistě vyřešit. Mám tabulku dejme tomu „balicky“ ktera obsahuje „polozky“. Polozky maji vzdy id balicku, nejaky popisek, cenu.
Do sablonu si poslu promennou packages kterou tvori metoda getPackages() ktera mi vrati vsechny balicky v tabulce. Ted nastava ale problem který moc nechápu a vyřešil jsem ho myslím docela „prasácky“ chci vypsat v kazdem balicku jeho obsah to znamena zavolat na kazdy package metodu getItemsFromPackage().
Udělal jsem si metodu v presenteru.
<?php
public function getItems($id){
return $this->model_package->getItemsByPackageId($id);
}
?>
A tu jsem potom v šabloně volal následovně.
<?php
{foreach $presenter->getItems($package->package_id) as $item}
atd....
{foreach}
?>
Je mi jasné že volat z šablony metodu presenteru je špatné. Ale nenapadlo mě jak to řešit efektivněji. Používám DiBi.
Díky za každou radu či tip.
- Šaman
- Člen | 2666
Nepotřebuješ ORM, potřebuješ objekt, resp. entitu (to je to O v ORM).
Nejjednodušší bude tu metodu getItems()
přesunout do entity
(normální třída) ‚Package‘. A pak máš druhou třídu, řekněmež
‚PackageRepository‘, která ti vrací ty balíčky. (Tu už asi máš jako
model_package
). Kdybys chtěl plně objektový návrh, tak budeš
mít ještě třídu (entitu) ‚Item‘. ‚Package‘ i ‚Item‘ budou
obsahovat své atributy a navíc ještě nějakou logiku, u balíčku právě
schopnost vrátit pole entit ‚Item‘.
Do šablony pak předáš jen objekt Package a všechno ostatní řešíš přes něho, nepotřebuješ žádnou metodu modelu ani presenteru.
- Onda
- Člen | 20
Dobrá tedy, vyzkouším to… děkuju za radu :) Rád bych se zeptal ještě na jednu věc, dejme tomu že bych rád udělal nějaký výpis na hlavní straně kde bude vše… balíčky,položky… seřazené dle datumu. Problém ale je že tabulka balicku obsahuje id polozky. Tudiz bych musel jakoby udelat join na sebe? Vypis by mel byt neco ve tvaru treba: balicek,balicek,polozka,balicek … atd. Nebo jde nějak udělat bych ve foreach cyklu procházel dvě pole a nějak z nich prohazoval? To je asi hloupost že?
- Onda
- Člen | 20
Opět jsem to možná blbě řekl, ten výpis by měl být něco jako že pokud to bude položka, vypíše se položka… ale pokud to bude balíček tak se nevypíše balíček ale položky v něm. Potom to bude vypadat ten výpis že když to bude položka bude to jedna položka a pokud to bude balíček tak člověk uvidí jakoby víc položek v jednom divu který se bude natahovat :) vím že to zní divně ale snad víš jak to myslím
- Šaman
- Člen | 2666
Podle toho jak moc budeš potřebovat optimalozovat. Tak si tím unionem
necháš teda vypsat jen id, datum a info, jestli je to z tabulky balicky, nebo
polozka. Seřazené podle datumu.
Celé tohle pole předáš do šablony, které předáš i PackageRepository
i ItemRepository. A ve ve foreachi si vezmeš prvek pole a podle druhu
vykreslíš buď položku, nebo balíček.
Kdybys to chtěl víc optimalizovat (jen na tři dotazy), tak si vezmeš pole z toho unionu, z něho vytvoříš pole všech idček položek a všech idček balíčků a položíš dva dotazy kterými načteš všechna data. No a v šabloně už nebudeš muset volat třídy modelu, budeš zase procházet pole z toho unionu ale data budeš hledat v těch dvou výsledcích.
Ale to už je jen nástřel od boku a nesouvisí s Nette.
Edit: Ale jestli chceš jen položky, nezávisle na tom, jestli jsou samotné, nebo v balíčku, tak by to nějak přes join jít mohlo.
Editoval Šaman (25. 10. 2014 18:15)