Předávání id při editačnim formuláři

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

Ahoj, na tohle téma už bylo napsáno mnoho, ale přesto bych potřeboval poradit.
Mám následující kód, který do bodu kdy neodešlu formulář funguje správně

class ProductPresenter extends SecurityPresenter
{
	/** @var \Nette\Database\Context */
    private $db;

    private $row;

	public function renderUpdate($id){
        $this->row = $this->db->table('product')->get($id);
    }

	protected function createComponentUpdateForm()
    {
        //dopsat kontrolu jestli ID existuje
        $form = (new \App\BackendModule\Classes\AddFormFactory)->create();

        $form->setDefaults(array(
            ...
        ));

        $form->onSuccess[] = array($this, 'updateFormSubmitted');
        return $form;
    }

Po odeslání formuláře se zavolá updateFormSubmitted, ale moje otázka je taková, že nevím jak do ní předat záznam nebo alespoň jeho id. Protože proměnná $this->row se už jeví prázdná a ani nastavení na persistenci nepomohlo, což by ale stejně asi nebylo správné řešení.

	public function updateFormSubmitted(\Nette\Application\UI\Form $form){
		// poslání aktualizace do DB
        $this->flashMessage('Produkt aktualizován.');
        $this->redirect(':Backend:Product:default');
    }
}

zkoušel jsem například upravit volání onSuccess[] v komponentě na

$form->onSuccess[] = function($form) use($this->row) {
        updateFormSubmitted($form, $this->row);
}
return $form;

upravil jsem také vstupní parametry metody updateFormSubmitted, ale padá mi to na chybové hlášce

Cannot use $this as lexical variable

tak jsem to přepsal na

$row = $this->row;
$form->onSuccess[] = function($form) use($row) {
     updateFormSubmitted($form, $row);
}
return $form;

a padá mi to zas na jiné chybě

syntax error, unexpected 'return' (T_RETURN)

Tak se chci zeptat na 2 otázky.

  1. Je můj přístup správný ?
  2. Jak získám záznam z db (nebo parametr id) v updateFormSubmitted ?

Díky

Editoval Dragonaut (23. 9. 2014 12:41)

David Matějka
Moderator | 6445
+
+2
-

Zpracovani formulare se provadi pred render metodou, takze prepis renderUpdate na actionUpdate a pujde to.

K id se kdekoliv v presenteru muzes dostat pomoci $this->getParameter('id')

syntax error, unexpected ‚return‘ (T_RETURN)

chybi ti strednik za anon fci

Dragonaut
Člen | 33
+
0
-

Ahoj, moc díky přes ten $this->getParameter() už to funguje :)

Editoval Dragonaut (23. 9. 2014 14:44)

Šaman
Člen | 2666
+
0
-

getParams nepoužívej, jen přepiš renderUpdate($id) na actionUpdate($id). Tam si to id ulož do hidden pole a při zpracování si ho načítej z přijatých hodnot. Ukázka nastavení je tady a zpracování tady.

Dragonaut
Člen | 33
+
0
-

Šaman: díky za tip, ta ukázka je hodně nápomocná =)