Multiplier a predani objektu komponente

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

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

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

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

Tedy polozim tu otazku jinak.
Je mozne predat do multiplieru Objekt?
Je mozne predat do multiplieru jen a pouze retezec?

Diky :)

babcca
Člen | 23
+
0
-

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}
?>
Jan Mikeš
Člen | 771
+
0
-

Resil jsem neco podobneho a princip meho vysledku je temer totozny s tim tvojim, neprisel jsem na to jak jinym zpusobem nez pres use dostat objekt do multiplieru.