->setDefaults($this->objekt) mění $this->objekt
- medhi
- Generous Backer | 255
Ahoj,
jsem zmatený z následujícího. Z database repozitáře získám objekt
s daty a uložím do $this->objekt
, nastavím/změním mu
nějakou vlastnost, například
$this->objekt->test = "a"
.
Potom si těmito daty předvyplním formulář:
if (!$this['editForm']->isSubmitted())
{
$this['editForm']->setDefaults($this->objekt);
}
Nyní se podívám na $this->objekt->test
a ona chybí!
Něco mi objekt změnilo zpět na původní. Netuším ale co a proč?
Zajímavé je, že pokud předvyplním formulář takto:
if (!$this['editForm']->isSubmitted())
{
$this['editForm']->setDefaults((array) $this->objekt);
}
tak se mi objekt nezmění. Bohužel se ale nepředvyplní ani formulář.
Děkuji
- Ot@s
- Backer | 476
V případě, že $this->objekt
je potomkem
Database/Table/ActiveRow
, tak se přidaný/upravený atribut
v objektu ActiveRow „separuje“ pro případný update záznamu. Taky si
nejsem jistý, zda-li přetypování ActiveRow pomocí (array)
dává to, co potřebuješ (asociativní pole hodnot záznamu). Viz.
Nette\Diagnostics\Debugger::dump((array) $this->objekt);
.
Nejjednodušší řešení je mít v $this->objekt
Nette\Database\Row
, resp. použít
$this->objekt = ...->fetch();
. Záleží, jak to máš
navrhnuté/použité, resp. co všecho s $this->objekt
provádíš…
- medhi
- Generous Backer | 255
Už mi poradil Hosiplan na chatu, řešením je použít
$this['editForm']->setDefaults($this->objekt->toArray());
Abych to tedy ještě upřesnil, $this->objekt
získávám
takto:
$this->objekt = $this->eventRepository->findBy(array('url' => $url))->fetch();
Je to tedy fetchnutý Database/Table/ActiveRow
Ot@s: "píše se někde o tomto separování a chování více? Nebo obecně o specifiku ActiveRow?
Editoval medhi (14. 1. 2013 10:09)
- Filip Procházka
- Moderator | 4668
ActiveRow
nemůžeš převádět na pole pomocí přetypování,
slouží na to metoda ->toArray()
– tím se vysvětluje,
proč ti to nenastavilo hodnoty.
A co se týče změny hodnoty řádku, nejspíš to bylo tím, že formuláře nad ním iterovaly, tak ho nějak resetovaly, ale nechce se mi pitvat vnitrni implementace :)