Vlastny submit formulára pred jeho odoslaním

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

Nette- 2.0
php 5.3.8

Mám otázku ohľadom formulárov
Mám vlatný dynamicky vytvorený formulár a potrebujem, aby po stisknutí tlačítka sa mi spustila vlastná funkcia, ktorá nejak sparsuje hodnoty vo formulári a následne urobí redirect na ten istý prezenter na ktorom sa nachádza, pričom parametrom budú sparsované hodnoty.
Nemôžem použiť onSubmit ani onSuccess, pretože tie sa zavolajú až po tom, ako sa odošle formulár.
Ja chcem, aby sa tá funkcia zavolala pred jeho odoslaním a odoslanie neprebehlo.

kód :

<?php
protected function createComponentBlockTestForm() {
	$form = new Form();
//pridavanie poloziek
	$form->addSubmit('send','Odoslať');
	return $form
}

public function blockTestFormSubmitted(Nette\Application\UI\Form $form){
	$values = $form->getValues(true);
	//parsovanie values do premennej $newJson
	$this->redirect('Test:blockTest', $newJson);
}
?>

vo Funkcií createComponentBlockTestForm vytvorím formulár a chcem aby sa funkcia blockTestFormSubmitted zavolala po kliknutí na tlačítko Odoslať, pričom aby sa zavolala PRED odoslaním formulára ale po jeho validácií

ďakujem

Jan Endel
Člen | 1016
+
0
-

to co hledáš je

$form->onValidate[] = $this->someMethod;
romiix.org
Člen | 343
+
0
-

Nepochopil som čo potrebuješ.

Prečo potrebuješ aby sa formulár neodoslal?

IvanM
Člen | 14
+
0
-

ja chcem aby sa neodoslal cez nejaký $form submit metódu, ale aby sa po validácií zavolala moja funkcia ktorá ho odošle

IvanM
Člen | 14
+
0
-

nie je to ani onValidate, pretože cez debug som zistil že po kliknutí na button sa najprv zavolá actionBlockTest potom createComponentBlockTestForm a až po tom moja metóda blockTestFormSubmitted

ja chcem aby sa po kliknutí na button zavolalo ihneď blockTestFormSubmitted

castamir
Člen | 629
+
0
-

Zopakuju otázku, která zde už padla: proč to potřebuješ?

IvanM
Člen | 14
+
0
-

ja potrebujem aby sa odoslal ale s mojimi sparsovanymi hodnotami formu ako parameter.

Pripadne aby sa nemusi odoslat, ale nech sa zmenia niektore premenne v presenteri a znova sa vykresli

castamir
Člen | 629
+
0
-

Pořád jsi neodpověděl.

Každopádně odeslání formuláře spustí signál viz obrázek životního cyklu presenteru, takže pokud to odešleš, tak metodám startup a action* se vážně nevyhneš, ale to ti vadit nemusí, protože přes metodu isSubmutted můžeš ověřit, zda daný formulář je odeslán.

Mělo by fungovat něco podobného, ale upozorňuji, že je to velice nestandardní a chybí tomu ošetření hodnot. Každopádně jsi pořád nenapsal, proč to potřebuješ, ale jen jak to něco něznámého chceš vyřešit.

public function actionDefault() {
	$form = $this['nazevTveKomponenty'];
	if ($form->isSubmutted()) {
		$this->redirect('this', array('fooParam' => $form->values->foo));
	}
}
alternativní text
IvanM
Člen | 14
+
0
-

opíšem čo robím

po stisknutí tlačítka odoslať sa získajú z formu hodnoty, tie sparsujem do JSON objektu ktorý odošlem do nie latte php triedy na spracovanie. Tá mi vráti nejaký iný JSON objekt, ktorý dám ako atribút do tohto presenteru
Následne chcem aby sa mi znova načítal tento presenter a teda aby sa vytvoril nový form, ktorého položky budú vytvorené na základe hore spomínaného atribútu triedy.

Viem že je to komplikované, ale je požiadavka aby existovala samostatná čisto php trieda, ktorej vstupom a výstupom je JSON objekt a na základe výstupu sú vygenerované položky formulára

castamir
Člen | 629
+
0
-

Tady máš kostru. Vůbec se mi nezdá to, co popisuješ, ale tohle by tě mohlo nakopnout…

class MagicPresenter extends BasePresenter
{

	public function actionDefault()
	{
		if (!$this['setup']->isSubmitted) {
			// thing that can be done only if setup form is NOT submitted
		}
	}

	/**
	 * @return \Nette\Application\UI\Form
	 */
	protected function createComponentSetup()
	{
		$form = new \Nette\Application\UI\Form();
		// add input for next form

		$form->addSubmit("send", "Odeslat");
		$form->onSuccess[] = $this->setupSucceeded;

		return $form;
	}

	/**
	 * @param \Nette\Application\UI\Form $form
	 */
	public function setupSucceeded(\Nette\Application\UI\Form $form)
	{
		$this->show($form->values);
	}

	/**
	 * @return \Nette\Application\UI\Form
	 */
	protected function createComponentNew()
	{
		$form = new \Nette\Application\UI\Form();
		// dynamic content
		$form->onSuccess[] = $this->newSucceeded;
		return $form;
	}

	/**
	 * @param \Nette\Application\UI\Form $form
	 */
	public function newSucceeded(\Nette\Application\UI\Form $form)
	{

	}

	private function show($spell) {
		$wizard = new Wizard();
		$trick = $wizard->doMagic($spell);
		// do something with the trick, e.x. $this['new']->addText();
		$this->template->showNew = TRUE;
	}
}

class Wizard {

	/***/
	public function doMagic($in)
	{
		// do some magic
		return $out;
	}
}
{control setup}
{default $show = FALSE}
{if $show}
	{control new}
{/if}