Dvě tlačítka ve formuláři – jak najít v dokumentaci řešení

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

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?

David Matějka
Moderator | 6445
+
0
-

viz https://doc.nette.org/cs/forms#…, udalost onClick

llook
Člen | 407
+
0
-

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
+
0
-

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

David Matějka
Moderator | 6445
+
0
-

ukaz kod

Jan Suchánek
Člen | 404
+
0
-

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
+
0
-

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
+
0
-

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.

Aurielle
Člen | 1281
+
0
-

Po odeslání bys měl přesměrovat vždycky, už proto, aby ti uživatel nezmáčkl F5 a neodeslal formulář znovu.

Jan Suchánek
Člen | 404
+
0
-

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)