nastavenie premennej vo formulári

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

Ahojte priatelia!

Zápasím s jednou vecou, a síce.

Mám komponentu formulára, v ktorej by som chcel nastaviť niečo do premennej.

	//tuto premennu potrebujem nastavit
public $nieco;


protected function createComponentDetailForm() {

	$form = new Form();
	$form->addGroup('Detail');
	$form->addText('detail_textu', Detail textu);

	$form->addSubmit('save', 'Uložiť');
	$form->onSuccess[] = $this->detailFormSubmitted;
	$form->addProtection();
	$this->nieco = 'TEXT';
	return $form;

   }

ak dám v šablóne toto:

{control detailForm}
{$nieco}

vypíše mi to, že premenná $nieco neexistuje. Skúšal som spúšťať nastavovanie aj v metóde beforeRender, resp. render, ale nepomohlo. Dáta sa nepreniesli.

Chcem totiž v rámci formulára zobraziť obrázok, pričom, keď som skúšal ručné vykreslovanie, šlo to, ale obrázok sa nezobrazil, lebo ho mám uložený v db a v šablóne som musel použiť dataStream.

Ďakujem za každú pomoc

Editoval xxxmisko (16. 4. 2013 14:28)

David Matějka
Moderator | 6445
+
0
-
$this->template->neco = $neco;
xxxmisko
Člen | 140
+
0
-

presne takto keď to zadám v tej továrničke, vypíše mi to:

Undefined variable: nieco
hAssassin
Člen | 293
+
0
-
$this->template->neco = $this->neco;
xxxmisko
Člen | 140
+
0
-

@hAssassin

aj keď to nastavím takto: $this->template->nieco = ‚lalala‘; ,tak to vypisuje Undefined variable.

Malo by to normálne fungovať?
nevadí, že sa ku stránke view dostávam pomocou $this->setView(‚edit‘); v metóde actionNieco?

xxxmisko
Člen | 140
+
0
-

keď som si dal vydumpovať premennú po nastavení vo forme, hodnota tam bola OK. Keď som ju dal vydumpovať v beforeRender, alebo render, bola už stratená.

To znamená, že spustenie komponenty nastaví premennú a potom keď sa komponenta vráti príkazom return $form, premennú akoby vymaže. V čom môže byť problém? Je to štandardné chovanie? ako ho obísť? Ďakujem

hAssassin
Člen | 293
+
0
-

omyl, tovarnicka se vola az z sablony kdyz ji chces vykreslit pomoci {control detailForm} cili az v tento okamzik se ti naplni ta hodnota. Otazka ovsem je, jak se data do sablony predavaji. Cili jestli je mozny do template poslat z prezenteru nejakou hodnotu az potom, co zacalo renderovani. Sam si nejsem jisty.

zkus to presunout do renderDetail(). Proc to chces vubec plnit v tovarnicce?

Editoval hAssassin (16. 4. 2013 15:17)

xxxmisko
Člen | 140
+
0
-

zrejme asi nie, lebo mi to nefunguje :(

Skrátka tam bude pes zakopaný, asi to budem musieť manuálne vykresliť, čo? Vtedy by to mohlo zafungovať, nie?

V továrničke to plním, pretože z db na základe nejakého selectu si vyťahujem obrázok. Ten potom nastavujem do premennej. V továrničke nastavujem formulár už aj s hodnotami.

Editoval xxxmisko (16. 4. 2013 15:20)

duke
Člen | 650
+
0
-

Bude ti fungovat {$template->nieco}.

{$nieco} nefunguje, protože k vyextrahování všech parametrů šablony do lokálních proměnných (které používá zkompilovaná šablona při tomto zápisu) dochází na začátku renderování šablony a jak již bylo vysvětleno, ty přidáváš parametr až během renderování.

Případně to můžeš ještě vyřešit tak, že v beforeRender nebo v render metodě iniciuješ vytvoření formuláře továrničkou. Tj. např. tímto kódem:

$this['detailForm'];

Nicméně plnit šablonu presenteru z továrničky jeho subkomponenty nepovažuji za rozumné řešení. K plnění šablony presenteru daty je určená především render metoda presenteru.

xxxmisko
Člen | 140
+
0
-

@duke,@hAssassin

Spravil som to tak, že v renderDetailForm som nastavil premennú na hodnotu, akú potrebujem. Potom sa prenesie do šablóny v poriadku.

Ďalej používam actionNieco, kde pri zmene hodnôt formulára načítavam obrázok a zobrazujem ho.

Skôr ma zaráža taká vec, v továrničke vytvorím formulár, pričom mu aj naplním dáta a vrátim ho. Je to tak zlé? Mám dáta formulára napĺňať v render metóde?

duke
Člen | 650
+
0
-

xxxmisko napsal(a):

Skôr ma zaráža taká vec, v továrničke vytvorím formulár, pričom mu aj naplním dáta a vrátim ho. Je to tak zlé? Mám dáta formulára napĺňať v render metóde?

Předpokládám, že máš na mysli nastavení výchozích hodnot formuláře metodou setDefaults().
Toto je otázka, na kterou sám nemám ujasněnou odpověď.

Na jednu stranu je výhodné řešit to v továrničce, protože je tak možné odložit tuto činnost až do momentu vytvoření formuláře (jeho vytvoření může být nějak podmíněné – např. právy uživatele, a pak v případě jeho nevytvoření bych ušetřil čas spojený s režií získání výchozích dat např. z databáze).

Na druhou stranu to znamená, že se při zpracování formuláře budou zbytečně tato výchozí data obstarávat, aby byla v zápětí přepsána hodnotami z $_POST. Toto by se např. nedělo, pokud by se formulář plnil daty v render metodě. Tím se ale zase vzdáváme možnosti líného vytvoření formuláře až z šablony…

Nejspíš by šlo použít továrničku a v ní podmínit volání setDefaults např. takto:

	if (empty($_POST)) {
		$form->setDefaults($this->getDefaultFormData());
	}

… ale sahat na $_POST mi přijde trochu nečisté.

Zajímalo by mě, jak tento problém řeší ostatní.
EDIT: Založil jsem pro toto téma nové vlákno.

Editoval duke (16. 4. 2013 21:08)

xxxmisko
Člen | 140
+
0
-

@duke

takto. Ja mám nejaký model, ktorý je vlastne objekt reprezentujúci dáta v tabuľke. V prípade, že mám nejaké id a toto id sa nachádza v tabuľke, siahnem do db a naplním si pole dát. Potom pri každom prvku, kde to má zmysel, zadávam setDefault($data[‚nieco‘]);

Pričom v prípade, že sa v db nič nenachádza, vytvorím si prázdny model, ktorý má takisto nejaké default hodnoty, zvyčajne sú to prázdne, resp. null hodnoty, poprípade nejaké čísla. A napĺňam to rovnako. V podstate by som to vedel naplniť aj inde, ale pri použití addComponent si to zatiaľ neviem nejako predstaviť. Takisto si neviem predstaviť napĺňať nejaký zložitý formulár, ktorý ešte len vytvorím :D

Som začiatočník, mám sa ešte veľa učiť, ale toto riešenie mi prijde najjednoduchšie a najkrajšie – viem sa v tom pekne vyznať :D

duke
Člen | 650
+
0
-

Šlo mi o to, cos myslel tímto:

xxxmisko napsal:

… pričom mu aj naplním dáta …

Naplnit ho můžeš buď zmíněnou metodou setDefaults() nebo můžeš na každém inputu zavolat setDefaultValue().

V principu jde o totéž.

xxxmisko napsal:

Potom pri každom prvku, kde to má zmysel, zadávam setDefault($data[‚nieco‘]);

Prvky formulářů takovou metodu nemají. Patrně máš na mysli setDefaultValue().

xxxmisko napsal:

V podstate by som to vedel naplniť aj inde, ale pri použití addComponent si to zatiaľ neviem nejako predstaviť.

Metodu addComponent vůbec volat nepotřebuješ. Ta se volá automaticky poté, co tvá továrnička komponentu vytvoří. A tvá továrnička ji vytvoří, až když je to třeba (např. když se pokusíš komponentu vykreslit v šalboně nebo když jí chceš nastavit nějaká data, či když přijímá signál, atp.).

xxxmisko
Člen | 140
+
0
-

@duke

bol som ožratý, keď som to písal :D

Dáta prvku napĺňam cez setDefaultValue(), de facto je to jedno, či cez toto, alebo setDefaults(). Dôležité, že to robím v továrničke.

Metoda addComponent to nemala byť, mala to byť metóda addDynamic, čo je rozšírenie formulárov :D Prepáč za zmätočné informácie.