Odesílání formuláře pomocí více Submit tlačítek

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

Ahoj, zkouším si pohrávat s formulářem, který renderuju v několika šablonách rozdělený pomocí kontejnerů a pomocí odesílacích tlačítek mezi šablonami přecházet. Myslím asi toto:

šablona 1 → vypíše se první část formuláře podle kontejneru 1
šablona 2 → vypíše se první část formuláře podle kontejneru 2
šablona 3 → vypíše se první část formuláře podle kontejneru 3

Ve formuláři jsou tlačítka pro přecházení, tedy něco jako Další a předchozí (které jsou „globální“ pro formulář a nejsou tedy zařazené do žádného kontejneru). Přecházení mezi šablonami pomocí tlačítek jde dobře až do té doby, než jsem přidal na jednotlivé prvky formuláře validační pravidla. Vše funguje dobře pouze pro první odeslání formuláře, např. při návratu zpět už se nic neprovede a já nechci vypínat validaci (např. pro onClick[]).

protected function createComponentMujForm(){
            $form = new AppForm;
            $form->onSubmit[] = callback($this, 'zpracujMujForm');

            $form->addContainer('prvni');
            $form['prvni']->addText('name')
                 ->addRule(Form::FILLED, 'Zadej nazev!');

            $form->addContainer('druhy');
            $form['druhy']->addText('popis')
		->addRule(Form::FILLED, 'Zadej popis!');;

            $form->addContainer('treti');
            $form['treti']->addText('prijmeni')
		->addRule(Form::FILLED, 'Zadej prijmeni!');;

	    // uplne dokonceni formulare
            $form->addSubmit('complete', 'Dokončit')/*->onClick[] = callback($this, 'finishMujForm')*/;
            $form->addSubmit('prvni_sablona')/*->onClick[] = callback($this, 'processMujForm_prvni')*/;
            $form->addSubmit('druha_sablona')/*->onClick[] = callback($this, 'processMujorm_druha')*/;
            $form->addSubmit('treti_sablona')/*->onClick[] = callback($this, 'processMujForm_treti')*/;

		// onClick handlery jsou zakomentovany proto, ze take nefunguji - stejny problem

            return $form;
}

Jak říkám, pokud tam nebude validace, přecházení jde v pořádku. Zpracování formuláře

public function zpracujMujForm(AppFrom $form){
	if ($form['complete']->isSubmittedBy()){
		// neco udelej
	} elseif ($form['prvni_sablona']->isSubmittedBy()){
		$this->redirect('MujPresenter:sablona', array('cislo' => 1));
	} elseif ($form['druha_sablona']->isSubmittedBy()){
		$this->redirect('MujPresenter:sablona', array('cislo' => 2));
	} elseif ($form['treti_sablona']->isSubmittedBy()){
		$this->redirect('MujPresenter:sablona', array('cislo' => 3));
	}

	// ja vim neni to dobre reseni, ale je to tu jen na ukazku !!
}
final class MujPresenter extends Presenter {

	public function actionSablona($cislo){
		$this->setView('sablona_'.$cislo);
	}

	// zde je i predchozi kod

}

Při prvím kroku ze šablony 1 na šablonu 2 projde vše v pořádku. Pokud bych chtěl však jít zpátky, už to nejde (jeví se mi to jako problém, že formulář už byl odeslán a nejde znovu odeslat – při dumpování jednotlivých kroků zpracování formuláře se nic nevypisuje, ale mělo by). Chtělo by tedy před vykreslením samotného formuláře určit, že ještě nebyl odeslán a ať se celý zvaliduje znovu? Jak na to, projížděl jsem dokumentaci a k metodám pro Form se nedostanu, abych to upravil.

Vytvářet 3 formuláře se mi nechce, nepřijde mi to jako dobré řešení, pokud si načtu vždy část jednoho, ale celkově má být ten formulář jako jeden (i když je rozkouzkován do jednotlivých šablon – kde si vždy určim jakou část vykreslím.

Je tedy potřeba mu říct před vykreslením na další šablonu, že ještě nebyl odeslán? (tedy byl, ale pro vykreslení na nové šabloně by se měl jeho stav resetnout – tedy něco jako $this['mujForm']->resetStatus(), aby se opět dal odeslat.

Editoval dEath (22. 11. 2010 9:58)