->setDefaults($this->objekt) mění $this->objekt

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
medhi
Generous Backer | 255
+
0
-

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

enumag
Člen | 2118
+
0
-

To je blbost, pokud to není pole tak se stejně na pole automaticky převede.

Ot@s
Backer | 476
+
0
-

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

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

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 :)

medhi
Generous Backer | 255
+
0
-

Bohužel jsem nyní zjistil, že použití ->toArray() stejně původní objekt změní. Například jsem tam měl vlastnost typu array (prázdná) a změnilo ji to na řetězec []. Je to možné?

medhi
Generous Backer | 255
+
0
-

Dle diskuse na chatu to prý lze považovat za bug, pokud můžete, přehoďte to prosím do správné diskuse. Dík