Formular + presmerovani
- odin
- Člen | 50
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
Č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
$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á.
- odin
- Člen | 50
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)
- 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
- 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.
- navic tam mam jen jedno tlacitko
- Ondřej Mirtes
- Člen | 1536
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
}