více forms na jedné stránce (NForm)
- bbb_
- Člen | 11
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
- Panda
- Člen | 569
<?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?
- David Grudl
- Nette Core | 8218
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, zeforeach($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(...);
}