Problém výpisu dat v šablony

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

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
+
0
-

Balíček si udělek jako entitu, která si sama umí načíst položky. Pak předáš šabloně balíček a ta si bude nad ním volat foreach($package->items).
Obecně něco podobného řeší různé ORM, i notORM jako Nette\Database\Table.

Já používám LeanMapper nad Dibi.

Onda
Člen | 20
+
0
-

Tohle je jedinná možnost jak to vyřešit? Bez nějakého ORM či notORM to nevyřeším?

Šaman
Člen | 2666
+
0
-

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
+
0
-

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?

Šaman
Člen | 2666
+
0
-

To jsem nějak nepochopil. Balíček obsahuje id položky? Čekal bych to spíš naopak (klasická 1:m vazba).
A ty potřebuješ vypsat co? Všechny balíčky i položky dohromady podle datumu? Na to nepotřebuješ join, ale union.

Onda
Člen | 20
+
0
-

Napsal jsem to asi špatně, ano já potřebuji vypsat všechny balíčky i polozky ale na to mi Union nepujde ne? ten prece nejde pokud neni stejny pocet sloupců.

Šaman
Člen | 2666
+
0
-

To si můžeš zajistit, ne? Necháš si vypsat jen název, datum a jestli je to baliček, nebo polozka. Ale je fakt, že už jsem neunioval pěkných pár let, možná kecám.

Onda
Člen | 20
+
0
-

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
+
0
-

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)