„Recyklace“ formulare

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

Zdravim,

v mem IS mam stranku s pridanim noveho uzivatele a s editaci existujiciho uzivatele. Vytvoril jsem si formular, ktery zobrazuji pri pridavani uzivatele, do ktereho zadavam jmeno, hesla, adresu atd.

Nyni kdyz delam editaci uzivatele, rikal jsem si, ze by bylo dobre znovu pouzit stejny formular. Jenze v editaci uzivatele nechci vypisovat inputy s heslem a overenim hesla. Proto jsem formular musel vykreslit manualne a tyto dva inputy vynechat.

Jenze pri odesilani tohoto editacniho formulare jsem narazil na problem. Jelikoz heslo a overeni hesla byly v puvodnim formulari povinne udaje, jsem upozornen, ze je musim vyplnit (i kdyz vlastne nejsou videt). Zkousel jsme tedy alespon neco takoveho:

<?php
   $form['password']->setDisabled();
   $form['password2']->setDisabled();
?>

Ale bezuspesne. Je tedy pro editaci lepsi vytvorit zcela novy formular nebo to jde vyresit nejak elegantneji?

A jeste bych mel jeden dotaz. Jde nekde stahnout nejaky jednoduchy IS (prihlasovani, sprava uzivatelu, vypis dat z db a jejich editace) v Nette. Neco na zpusob CD-Collection v examplech, ale vice promakanejsi – potreboval bych to jako studijni material.

Foowie
Člen | 269
+
0
-

Nastav setDisabled() dříve, než v render{action}. (V action{action}, nebo v továrničce).

kravčo
Člen | 721
+
0
-

Radšej použi

unset($form['password'], $form['password2']);
TomasTB
Člen | 13
+
0
-

S

<?php
unset ($form['component']);
?>

je trosku problem, pokud je na nem nejaka validace … ty se timto volanim neodstrani.

rezorcinol
Člen | 25
+
0
-

Foowie napsal(a):

Nastav setDisabled() dříve, než v render{action}. (V action{action}, nebo v továrničce).

Nejak nevim kam to tedy dat kdyz ne do metotody renderEdit(). Do actionEdit()?

rezorcinol
Člen | 25
+
0
-

Tak jsem to zkusil udelat pres beforeRender() takto:

<?php
    public function beforeRender()
    {
        if ($this->backlink() == ":Employes:edit")
        {
            $form = $this['employeeForm'];
            $form['password']->setDisabled();
            $form['password2']->setDisabled();
            $this->template->form = $form;
        }
    }

    public function renderEdit($id = 0)
    {
        $form = $this->template->form;
        ...
	vykresleni formulare
    }
?>

Ale stale stejne problem – porad plati podminka nutnosti zadani hesla.

rezorcinol
Člen | 25
+
0
-

A tak jeste do tretice… Pokud si ve funkci renderEdit() vykreslim i input password a password2, tak jsou zasedle – to znamena, ze kod ve metode beforeRender() funguje. Co ale nefunguje je to, ze i kdyz je input disablovany, porad si vynucuje pravidla (FILLED).

Pokud $form[‚password‘]->setDisabled(); nahradim za unset ($form[‚password‘]); dostanu InvalidStateException „Component is not attached to ‚Form‘.“

Yrwein
Člen | 45
+
0
-

Zkus místo zakazování komponent užít postupného přidávání komponent. ,)

Editoval Yrwein (2. 9. 2009 16:54)

Foowie
Člen | 269
+
0
-

rezorcinol napsal(a):

Tak jsem to zkusil udelat pres beforeRender() takto:

<?php
    public function beforeRender()
    {
        if ($this->backlink() == ":Employes:edit")
        {
            $form = $this['employeeForm'];
            $form['password']->setDisabled();
            $form['password2']->setDisabled();
            $this->template->form = $form;
        }
    }

    public function renderEdit($id = 0)
    {
        $form = $this->template->form;
        ...
	vykresleni formulare
    }
?>

Ale stale stejne problem – porad plati podminka nutnosti zadani hesla.

Metoda beforeRender už se nějak nepoužívá.

public function actionEdit($id = 0) {
	if(tvoje_podminka) {
		$this["komponenta"]["password"]->setDisabled();
	}
}
rezorcinol
Člen | 25
+
0
-

Pres actionEdit to funguje, dekuji moc.