Dvě tlačítka ve formuláři – jak najít v dokumentaci řešení
- ondrakrajcik
- Člen | 45
Chtěl bych vytvořit formulář se dvěmi buttony. Hledal jsem zde na fóru i v dokumentaci. V obou případech jsem něco našel avšak v obou případech to bylo pouze kousky kódu ze kterých jsem nebyl schopný pochopit jak to mám udělat. Nebaví mně tu pořád spamovat forum. Je někde v dokumentaci popsáno a vysvětleno jak na to? Nebo jaký je nejlepší způsob jak se to naučit (z domu) kromě spamování fóra?
- llook
- Člen | 407
Jedna možnost je onClick na tlačítku. Druhá možnost (podle mě
většinou čitelnější), je $form->isSubmitted()
, které
vrací instanci tlačítka, kterým byl formulář odeslán, takže si to
v onSuccess můžeš potom navětvit:
class FooPresenter extends Presenter {
protected function createComponentNevimForm() {
$form = new Form;
$saveButton = $form->addSubmit('save', 'Uložit ciwe');
$cancelButton = $form->addSubmit('cancel', 'Zrušit');
$this->onSuccess = function (Form $form) use ($cancelButton) {
if ($form->isSubmitted() === $cancelButton) {
$this->flashMessage('Formulář byl zrušen');
} else {
$this->flashMessage('Formulář byl uložen');
}
$this->redirect('this');
};
return $form;
}
}
- ondrakrajcik
- Člen | 45
Zajímal by mě ten onClick. V dokumentaci je v podstatě jen
Pokud má formulář více než jedno tlačítko, mezi kterými chceme rozlišovat, je vhodnější nastavit handler na událost onClick tlačítka. Ten se volá před handlerem události onSuccess:
Když k tlačítku přidám onClick tak se stejně nevolá metoda kterou
mám v onlicku nastevenou ale volá se metoda
nazevFormulareSubmitted
Nenašel jsem v dokumentaci vysvětlen handler, ani nijak vysvětlenou problematiku dvou tlačítek nebo něco co by mně pomohlo
- Jan Suchánek
- Člen | 404
ondrakrajcik: je to ono nebo jde to nějak líp?
V komponentě používám něco takového:
/**
* @return Nette\Application\UI\Form
*/
protected function createComponentExampleForm()
{
$form = new Form;
/** Nadefinuju tlačítka */
$form["save"]->onClick[] = $this->saveForm;
$form["cancel"]->onClick[] = $this->cancelForm;
$form["delete"]->onClick[] = $this->deleteForm;
return $form;
}
public function saveForm($button)
{
$form = $button->getForm();
if($form->isSuccess(){
$this->onSave($form);
}
}
public function cancelForm($button)
{
$this->onCancel($button->getForm());
}
A na to co se bude dít navěšuji akce přímo při vytváření komponenty.
matej21: Je to tak správně?
Editoval jenicek (5. 3. 2014 17:23)
- leninzprahy
- Člen | 150
To by mělo fungovat, ve starším php se myslím muselo
uvádět onClick[] = array($this, 'saveForm');
Zpracování událostí je nejlépe vidět v https://github.com/…rms/Form.php#L385
Pokud je formulář odeslaný tlačítkem, volá se na tom tlačítku událost
onClick
, případně onInvalidClick
, pokud formulář
není validní…
- Jan Suchánek
- Člen | 404
leninzprahy: Funkční to je o tom žádná jen nevím zda technika je správná, přijde mi to čitelnější.
OT: Při odeslání formu používáte vždy přesměrování? Zajímalo by mě to třeba při ajaxovém přihlašování bez redirectu, ale to už je asi moc ot.
- Jan Suchánek
- Člen | 404
Aurielle: Odesílám formulář ajaxem a po správném odeslání formuláře uživateli už formulář nenabízím.
Příklad:
public function editFormSave($button)
{
/*
$form = $button->getForm();
$values = $form->getValues();
$id = $this->getParam("id");
if($entity = $this->repository->getByID($id)){
$entity->name = $values->name;
$this->repository->persist($entity);
$this->flashMessage('Uloženo.');
}
*/
if($this->isAjax()){
$this->redrawControl();
} else {
$this->redirect('Category:');
}
}
Editoval jenicek (7. 3. 2014 16:55)