Multiplier a predani objektu komponente
- babcca
- Člen | 23
Ahoj,
mam maly problem, ktery je asi zpusobeny tim jak se chova multiplier.
Predstavme si na chvilku, ze mame web service a nase stranka si taha data z nej. Rekneme ze obdrzi pole dat $p := [{a,b,c:{d,e,f}]. Mam vytvorenou komponenty, ktera umi vykreslit {d,e,f}, jelikoz se vykresluje na mnoha mistech z ruznych dotazu.
sablona:
{foreach $p as $r}
{control magic-$r->c}
{/foreach}
Bohuzel se $r->c chova jako (string) $r->c, coz je nezadouci. Nemuzu z komponenty provadet dalsich 1000 dotazu na vzdaleny server, abych ty data ziskal. Meril jsem casy a je tam obrovska rezije na vytvoreni spojeni.
Napada vas nejake reseni, popripade protiargument? Diky!
- vvoody
- Člen | 910
{control magic-nieco} to nieco je len identifikator. Pouzivat to na prenos dat je nezmysel. Ak som spravne pochopil co riesis, tak by som pre data spravil jeden model ktory vsetky data ziska a bude ich schopny na zaklade niecoho identifikovat alebo ich jednoducho ocisluje a zoznam tychto identifikatorov (cisiel) by som z modelu predal do sablony a cezen iteroval a vytvaral tie komponenty. Dalej by som model vlozil do komponenty v jej tovarnicke a ona by si na zaklade toho identifikatoru vyziadala od modelu tie data.
- babcca
- Člen | 23
Diky, je to urcite resni, ale prijde mi to jako reseni pres ruku.
Z meho pohledu to pouzivat na „prenos“ dat nesmysl neni. Muj pohled je, ze si kazdy modul (komponenta) zodpovida za svoje data. Proto by tomu „nieco“ melo byt jedno co to je. Identifikator muze byt i objekt a nejenom retezec.
Na druhou stranu, kdy to pustim na Nette\Database, tak to vytvori hromadu dotazu pro kazdy tento zaznam. Tedy prestava fungovat nejvetsi vyhoda databaze v nette.
<?php
$a = $conn->table(...); // vytahnuti z vazby 1:N
return new Nette\Application\UI\Multiplier(function ($record_id, $control) use ($a) {
$preview = new Preview($control);
// Tady se provadi kazdy dotaz znovu!
$preview->setData($a->get($record_id)->druha_tabulka);
return $preview;
});
?>
Ikdyz pouziju vkladani sablon tak ji zas musim umistit nekam na viditelne misto a to bude vetsinou tam kam logicky nepatri (projekt po me musi taky nekdo precist).
- babcca
- Člen | 23
Tak tedy pro zajimovast. Momentalni reseni, se kterym nejsem spokojen,a le bohuzel funguje.
<?php
$a = $conn->table(...)->/*nejake ty joiny*/->fetchAll(); // vytahnuti z vazby 1:N a fetchni, prijdeme o veci z NotORM
return new Nette\Application\UI\Multiplier(function ($record_id, $control) use ($a) {
$preview = new Preview($control);
$preview->setData($a[$record_id]);
return $preview;
});
?>
Sablona:
<?php
{foreach $p as $r}
{control magic-$iterator->counter}
{/foreach}
?>