AppForm,createComponent a předání parametrů
- Under
- Člen | 23
Zdravím, s Nette teprv začínám a tak vlastně jen tak zatím
zkouším… snažím se vytvořit formulář který vytáhne values
z databáze(podle ID ktere je dano URL).
Prostě klasické editování něčeho.
Narazil sem ale na problém, a tedy že AppForm se musí vytvářet v Componentu, ne při renderování a tak tedy nevím jak mu mám předat to ID…
Tady je zdroj, je dost možný, že na to jdu úplně špatně, nezlobte se na mně :D
public function renderEdit($id){
$this->template->editform = $this['editform'];
if ($this['editform']=="OK"){
$this->redirect('this');
}
}
protected function createComponentEditform($id) {
$values=dibi::fetch("SELECT * FROM tabs WHERE id='$id'");
$formu = new AppForm($this, 'editform');
$formu->addText("name","Jméno písničky:")
->addRule(Form::FILLED, 'Zadejte jméno písničky')
->setValue($values["name"]);
$formu->addText("band","Jméno kapely:")
->setValue($values["band"]);
$formu->addTextArea("popis","Komentář:")
->setValue($values["popis"]);
$formu->addSubmit("sub","Upravit");
$this->template->form=$formu;
if ($formu->isSubmitted()){
if ($formu->isValid()){
$valuesu=$formu->getValues();
dibi::query("UPDATE tabs SET", $valuesu, "WHERE id=%i", $id);
$formu="OK";
}
}
return $formu;
}
Editoval Under (25. 1. 2010 15:32)
- Ondřej Mirtes
- Člen | 1536
Znáš tabulátor? :o)
K věci – máš tam pár věcí blbě – nevím, kdy se vyhodnotí
podmínka $this['editform']=="OK"
jako pravda, když komponenta je
objekt a na řetězec OK ji přetypuješ těžko.
Ke zpracování formuláře slouží zpracovávací metoda – navěsíš ji takto (v továrničce):
$form->onSubmit[] = array($this, 'editformSubmitted');
A kód metody bude vypadat nějak takto (už tam nemusíš kontrolovat odeslanost a validitu – pokud formulář není odeslaný a validní, tak se metoda nevolá):
public function editformSubmitted(AppForm $form) {
$values = $form->values;
//... zpracování
$this->redirect('this'); //a už můžeš odstranit ten nesmysl z renderEdit :)
}
Všim jsem si taky, že tam šíleně používáš setValue metodu. To je špatně. Pokud v továrničce získáš z databáze asociativní pole $values, kde klíč odpovídá názvu pole ve formuláři (vypadá to, že tomu tak u tebe je), tak stačí po definici všech polí zavolat:
$form->setDefaults($values);
A konečně, na co ses ptal – vytvoř si metodu actionEdit($id) a tam zavolej ten dotaz na DB a naplň formulář výchozími hodnotami:
public function actionEdit($id) {
$values=dibi::fetch("SELECT * FROM tabs WHERE id=%i", $id); //tady jsi špatně použil dibi, vůbec jsi nevyužil její zadávání parametrů a ochranu proti SQL injection
$this['editform']->setDefaults($values);
}
Pokud bys chtěl setDefaults volat přímo v továrničce, dá se na
parametr odvolat pomocí $this->getParam('id');
.
Editoval Ondřej Mirtes (24. 1. 2010 20:09)
- Elijen
- Člen | 171
Zdravím,
mám podobný problém, akorát s rozdílem, že formulář vytvářim až
v komponentě (Control), nikoli v presenteru. Musím tedy nastavení provést
v metodě render
? Nebo je lepší místo, kde takové nastavení
provést?
Jinak neměl by přímo do DB podle konceptu MVP (MVC) sahat výhradně model?