Formular + presmerovani

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

Mam appform formular, ktery ma v tovarnicce nastaveno

<?php
$form->onSubmit[] = array($this, 'editFormSubmitted');
?>

v onsubmit si formular rucne zvaliduju a nakonci mam

<?php
		if (!$form->hasErrors()) {
			$id = $this->model->store($this->getParam('id_grammar'), $form['edName']->value);
			if ($id) { //uspesne vlozeno
				$this->redirect("Grammar:edit", array("id_grammar", $id));
			}
		}
?>

cili v zasade, pokud je formular validni tak se zavola metoda store() modelu, ktera data ulozi do DB. Pointa je v tom, ze formular slouzi pro pridani i pro editaci, cili parametr id_grammar muze byt 0 nebo null (s tim si model poradi) a vrati id zaznamu (bud noveho nebo aktualizovaneho).
Ted chci udelat, aby pri vlozeni noveho zaznamu (id_grammar == 0) se po uspesnem vlozeni formular presmeroval na editaci tohot zaznamu, tedy aby v URL bylo id_grammar=nejakecislo
jenze radek:

<?php
$this->redirect("Grammar:edit", array("id_grammar", $id));
?>

produkuje chybu:
Extra parameter for signal 'Inputs_GrammarPresenter:renderedit'.

ale pritom v presenteru Grammar v metode rendrEdit ten parametr id_grammar mam:

<?php

	public function renderEdit($id_grammar) {
		parent::renderDefault();
		$rec = $this->model->getGrammar($id_grammar);
		if ($rec) {
			$form = $this['editForm'];
			$form['edName']->setDefaultValue($rec->name);
			$form['edGrammar']->setDefaultValue($rec->grammar);
		}
	}

?>
JakubJarabica
Gold Partner | 184
+
0
-

Čo keby miesto tohto:

<?php
$this->redirect("Grammar:edit", array("id_grammar", $id));
?>

Použiješ toto?

<?php
$this->redirect("Grammar:edit", array("id_grammar" => $id));
//prípadne toto:
$this->redirect("Grammar:edit", $id);
?>

V tvojom prípade mu posielaš dve hodnoty poľa, preto ti to hádže chybu Extra parameter. Kód som ale neskúšal, môže byť zlý :)

Ondřej Mirtes
Člen | 1536
+
0
-
$this->redirect("Grammar:edit", array("id_grammar" => $id));

nebo stačí jen

$this->redirect("Grammar:edit", array($id));

Ty jsi předával dva parametry, což opravdu odpovídalo hlášce „extra parameter“.

BTW: Ruční validace v onSubmit metodě? Na co? Pokud si nevystačíš s integrovanými validačními pravidly, tak formuláře podporují i vlastní callbacky na validaci.

A !$form->hasErrors() zjišťovat nemusíš, pokud formulář není validní, tak se onSubmit metoda vůbec nevolá.

m938nek
Člen | 7
+
0
-

a myslim, že místo !$form->hasErrors() jde použít $form->isValid()

odin
Člen | 50
+
0
-

Ondřej Mirtes napsal(a):

$this->redirect("Grammar:edit", array("id_grammar" => $id));

nebo stačí jen

$this->redirect("Grammar:edit", array($id));

Ty jsi předával dva parametry, což opravdu odpovídalo hlášce „extra parameter“.

BTW: Ruční validace v onSubmit metodě? Na co? Pokud si nevystačíš s integrovanými validačními pravidly, tak formuláře podporují i vlastní callbacky na validaci.

A !$form->hasErrors() zjišťovat nemusíš, pokud formulář není validní, tak se onSubmit metoda vůbec nevolá.

Diky za rady, je to ok, funguje to. Reseni tedy je bud:

<?php
$this->redirect("Grammar:edit", array("id_grammar" => $id));
?>

nebo:

<?php
$this->redirect("Grammar:edit", array($id));
?>

no ja mam radsi pojmenovane parametry, abych vedel ceho je to id, takze se budu drzet prvni varianty.

ad onsubmit) OSbmt se vola i pokud neni formular validni a co se mi podarilo vycist z dokumentace, tak se to presne tak ma chovat a doufam, ze to tak zustane

ad validace)

  1. nepouzivam je, protoze potrebuju zvalidovat jestli zadany string je validni XML, s pozadovanymi polozkami, nebo napr. jestli neco existuje v DB pokud to co bylo zobrazeno uzivateli ma v DB navazany vic jak x zaznamu (kde x je zadano v tom formulari) – jestli tohle umi validacni pravidla, tak smekam
  2. nepouzivam je, protoze potrebuju rychle vytvorit neco co zobrazi a upravi data v db, 10 podminek zvladnu napsat z fleku, validacni pravidla nette budu studovat 3 dny, coz je pro mne v tuto chvili totalni ztrata casu. Potrebuju predevsim, aby to fungovalo a aby se mi nette nepletl do cesty.
  3. navic tam mam jen jedno tlacitko
marek-m
Člen | 66
+
0
-

->addRule(„tvoje_pravidlo1“,„Tvoja hlaska 1!“);

tvoje_pravidlo1 a tam si daj tych tvojich 10 pravidiel – st. trieda a funkcia, je to potom pekne a elegantne

Editoval marek-m (18. 12. 2009 8:39)

Ondřej Mirtes
Člen | 1536
+
0
-

Metody v onSubmit se volají jen při odeslaném a validním formuláři.

Tyto tvoje validace jdou zařídit přes callbacky:

public function validateXml($value) {
	//složitá validace
	return true; //či false
}

A pravidlo do formuláře přidáš takto:

$form->addText('text', 'Validovaný text')
->addRule(array($this, 'validateXml'), 'Odeslaný text je nevalidní');

Tohle je správná a IMHO i daleko přehlednější cesta, než s tím nějak operovat v onSubmit metodách. Co já maximálně dělám, že když se v modelu nepovede zápis, nebo třeba nejde odeslat mail, tak vyhazuju IOException a tu pak přidávám do formuláře.

try {
	$this->model->save($form->values); //když se vyhodí výjimka, redirect se neprovede
	$this->redirect('this');
} catch (IOException $e) {
	$form->addError($e->getMessage()); //zpráva se přidá do formuláře a ten se zobrazí s jeho vyplněnými daty
}