Autor Zpráva
jik
Profil
Zdravím,
docela nepolíbený OOP se hrabu s Nette. A s verzí 2.1, když se objekty typu selection staly typu read only, mám problém. Často potřebuji k datům získaným z tabulky přidat další - vypočítané. Až dosud jsem pracoval takto:
$pole = $this->context->tabulka->getRecord($id);
foreach ($pole as $radek) {
$radek->novy_prvek = 'nazdar';
}
$this->template->data = $pole;
S Nette2.1 je ale $pole read-only. Zatím to páchám takto:
$pole = $this->context->tabulka->getRecord($id);
$vystup = false;
foreach ($pole as $radek) {
$v_radek['polozka'] = $radek->polozka;
$v_radek['novy_prvek'] = 'nazdar';
$vystup[] = $v_radek;
}
$this->template->data = $vystup;
Ale není to šikovné - musím tam zapsat všechny položky, které potřebuji, musím ošetřovat, jestli je proměnná vůbec naplněná, ... Proto dotaz: existuje nějaký rozumnější způsob, jak sestavit výstupní data a nedělat to položku po položce?

Děkuji za rady
breeta
Profil
Vybereš jeden řádek z tabulky dle id a děláš z toho pole? Napiš spíš co chceš docílit a nepopisuj jak to děláš.
jik:
Často potřebuji k datům získaným z tabulky přidat další - vypočítané.
Fakt netuším co to znamená, nevíš jak přidávat nebo sloučit pole ...
jik
Profil
breeta:
příklad: v db mám sloupce číslo a podlomení, které ovšem z nějakého důvodu považuji za vhodné mít již v presenteru v podobě "cislo/podlomeni" - tedy z existujících sloupců potřebuji vytvořit další sloupec, například cislopod. Mám plno dalších podobných důvodů, bez toho se neobejdu.
Proč dělám pole z řádku tabulky? Protože potřebuji do formuláře nasadit výchozí hodnoty:
$this["editpozForm"]->setDefaults($def_array); 
V Nette se vlastně objekty chovají kombinovaně, ale formuláře potřebují pole. Ano, je to pitomé, proto se na to ptám.
joe
Profil
Tady je důvod, proč tomu tak je a je logický, co objekt, to řádek z databáze, neměl bys tedy objekt upravovat tak, aby neodpovídal databázovému řádku, který představuje. V odkázané diskusi je i příklad, jak něco takového třeba řešit.

jik:
V Nette se vlastně objekty chovají kombinovaně, ale formuláře potřebují pole.
Potřebují pole, ale předat můžeš i objekt, který implementuje ArrayAccess rozhraní a to Selection implementuje, takže pouze přímo "čisté" pole předávat nemusíš.
jik
Profil
joe:
Toto je sice hezké, ale mám dojem, že je to o něčem jiném - já žádné Save, případně Update nepotřebuji, jen potřebuji k již existujícím sloupcům tabulky předávaným šabloně přidat ještě další. Tedy jak přeměnit objekt selection (tedy vlastně dotaz do databáze) na soubor dat, které budu schopen modifikovat - bez jakéhokoliv spojení s databází:
$select = $this->context->tabulka->getTabulka();
$data = $select; //$data je pouze kontejnerem na data, ne dotazem
$data->novy_sloupec = 'neco';
$this->template->data = $data;
joe
Profil
jik:
Můžeš použít něco takového

$selection = model->findAll(); // vraci Selection
$rows = $selection->fetchAll();
$row = $rows[1];
$rowArray = $row->toArray();
$rowArray['moje'] = 10;
jik
Profil
To je ono! Děkuji moc.
jik
Profil
joe:
Tak ne, ani v tom data kontejneru nelze data měnit:
$this->a_lvs = $this->s_lv->getLvs($id)->fetchAll();
foreach ($this->a_lvs as $o_lv) {
    $o_lv->count = $this->context->pozemek->getPozemkyLv($o_lv->id, 'id')->count();
... a tady to hned nahlásí "ActiveRow is read-only; use update() method instead."

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: