AppForm,createComponent a předání parametrů

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

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

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)

Under
Člen | 23
+
0
-

Děkuji! To je přesně to, co jsem potřeboval :)

Elijen
Člen | 171
+
0
-

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?