nastavenie premennej vo formulári
- xxxmisko
- Člen | 140
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)
- xxxmisko
- Člen | 140
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
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
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
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
@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
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
@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
Š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
@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.