více forms na jedné stránce (NForm)

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

Zdravim,
narážím na problém, kterého jsem se bál už delší dobu ale teď jsem se k němu dostal. Je to více formulářů na jedné stránce. Pokud jeden odešlu, odešlou se všechny a já nevím, jak zjistit, který je ten, co jsem chtěl. V Nette\Forms šlo myslím něco jako $form=new Form(‚formular1‘); což mě napadlo, že tento problém asi řeší, ale nezkoušel jsem to. Ptám se tedy jestli někoho nenapadá jak tento problém řešit v NForm.

Ještě mám jednu otázku na tebe, Davide. (Možná sem měl založit jiné téma) Jak je to s dalším vývojem NForm? S verzí kterou teď používám jsem spokojen (až na tento problém) a je to prima pomocník při programování. Předpokládám že další vývoj je zaměřen na Nette\Forms, ale co ti, kteří Nette nepoužívají?

Díky za odpovědi

phx
Člen | 651
+
0
-

NEjsem si jist zda to pujde, ale jde to detekovat takto pomoci nazvu tlacitka. $form['tlacitko']->isSubmittedBy()
Nezkousel jsem to, ale nekde jsem to nekdy videl.

Panda
Člen | 569
+
0
-
<?php
class SomePresenter extends BasePresenter
{
	/**
	 * @var Form
	 */
	public $form1;

	/**
	 * @var Form
	 */
	public $form2;

	...

	public function actionView()
	{
		$form1 = new AppForm($this, 'form1');
		// Nějaká definice formuláře 1
		$form1->onSubmit[] = array($this, 'form1_onSubmit');

		$form2 = new AppForm($this, 'form2');
		// Nějaká definice formuláře 2
		$form1->onSubmit[] = array($this, 'form2_onSubmit');
	}

	...

	public function form1_onSubmit(AppForm $sender)
	{
		// Zpracování form1
	}

	public function form2_onSubmit(AppForm $sender)
	{
		// Zpracování form1
	}
}
?>

Defaultně action formuláře ukazuje na stejný view se stejnými parametry, jen se do URL přidá signál (?do=form1-submit), který Nette předá příslušnému formuláři a ten se podle toho zařídí (zavolá si metody definované v onSubmit). Pokud se má formulář odesílat do jiného view, tak je potřeba ten signál přidat do argumentů.

Nebo snad někdo víte o jiném řešení, jak volat signál komponenty v jiném view?

phx
Člen | 651
+
0
-

Kdyz jsi u te krystalizace. Celkem bych uvatal i moznost prochazet Form jako pole. Kdyz uz mame syntax $form['name']->... tak bych ocekaval, ze foreach($form as $name=>$component) projde polozky formulare jako pole.

David Grudl
Nette Core | 8218
+
0
-

phx napsal(a):

Kdyz jsi u te krystalizace. Celkem bych uvatal i moznost prochazet Form jako pole. Kdyz uz mame syntax $form['name']->... tak bych ocekaval, ze foreach($form as $name=>$component) projde polozky formulare jako pole.

To je taky možné. Ale uvaž, že ne každá komponenta $form je prvek FormControl. Můžou tam být jakékoliv jiné komponenty, nebo kontainery, které teprve obsahují prvky formuláře, případně další kontainery atd. Pro iterování je lepší použít šikovnou metodu $form->getComponents($deep = FALSE, $type = NULL), kde první parametr říká, zda se má iterovat do hloubky (tj. projít i prvky konteinerů) a druhý nastavuje volitelný filtr:

foreach ($form->getComponents(TRUE, 'Nette\Forms\IFormControl') as $control) {
	$control->setValue(...);
}