Validace jen odeslaných elementů

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

Jde nějak donutit form validaci aby se validovaly jen odeslaná políčka? Udělám si form o 5ti inputech, všechny povinné, vykreslím jen 4 a form nedokáži úspěšně zpracovat protože skončí na nevyplněném poli.

Jan Endel
Člen | 1016
+
0
-

Form nemá jak zjisit, které políčko má vykreslené a které nikolivěk. Prostě takové políčko ve formuláři nemůže být. O co se snažíš? Třeba vymyslíme lepší řešení.

akadlec
Člen | 1326
+
0
-

Tak může to zjistit z postu, teda krom checkboxu.
Mám prostě form který má X políček ale né vždy dojde k vykreslení všech, ty co nejsou v postu by braly default hodnoty.

iguana007
Člen | 970
+
0
-

Pokud by si měl každý form přirazený k jiné akci/renderu, tak by to mohlo být poměrně simple … místo toho, aby si je ručně „nevypsal“ v ručním renderu formuláře, tak by si prvky toho formuláře mohl unsetnout před předáním do šablony, tj. nějak takto:

protected function createComponentTestForm() {
	$form = new Nette\Application\UI\Form;

	$form->addText('aaa', 'aaa')->setRequired();
	$form->addText('bbb', 'bbb')->setRequired();
	$form->addText('ccc', 'ccc')->setRequired();
	$form->addText('ddd', 'ddd')->setRequired();
	$form->addSubmit('save', 'Save');
	$form->onSuccess[] = array($this, 'testFormSubmitted');
    return $form;
}

public function testFormSubmitted(UI\Form $form) {
	$values = $form->getValues();
	$this->redirect('this');
}

public function renderDefault()
{
	$form = $this->getComponent('testForm');
	unset($form['bbb']);
}
Pavel Macháň
Člen | 282
+
0
-

akadlec napsal(a):

Jde nějak donutit form validaci aby se validovaly jen odeslaná políčka? Udělám si form o 5ti inputech, všechny povinné, vykreslím jen 4 a form nedokáži úspěšně zpracovat protože skončí na nevyplněném poli.

Co takhle vytvořit továrničku která bude předávat třeba parametr $type a podle toho si složíš formulář na přesnej počet položek

class TestFactory {

    const
        ONE = 0,
        TWO = 1,
        THREE = 2;

    /**
     * @var int $type
     * @return \Nette\Application\UI\Form
     */
    public function create($type) {
    	$form = new Form;
        $form->addText('aaa', 'aaa')->setRequired();
    	$form->addText('bbb', 'bbb')->setRequired();
    	$form->addText('ccc', 'ccc')->setRequired();

        if($type == self::TWO) {
			$form->addText('ddd', 'ddd')->setRequired();
        } else ...

        return $form;
    }

}

class MyPresenter extends Presenter {

    /** @var \TestFactory @inject */
    public $testFactory;

   /** @return Form */
    public function createComponentCampaignPreview() {
        return $this->testFactory->create(TestFactory::TWO);
    }
}

Editoval EIFEL (27. 5. 2014 10:44)

akadlec
Člen | 1326
+
0
-

jenže co když bych ty hodnoty chtěl mít i v getValues ? Jen tedy ve výchozích hodnotách.

Pavel Macháň
Člen | 282
+
0
-

akadlec napsal(a):

jenže co když bych ty hodnoty chtěl mít i v getValues ? Jen tedy ve výchozích hodnotách.

Tak to udelej přez addCondition kde nastaviš že pokud neni prazdnej tak se bude validovat.

Editoval EIFEL (27. 5. 2014 11:02)