Neodeslání hodnoty formulářového pole v komponentě

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

Mám následující problém a pokud by tu byl někdo, kdo by byl schopný vysvětlit mi, co přesně se děje, že to nefunguje, budu mu velice zavázán:

V presenteru jsem pomocí továrničky vytvořil formulář, který přidá/edituje položku v databázi. Funguje to asi tak, že defaultně nové položky přidává a když v seznamu těchto položek na některou kliknu, že ji chci editovat, tak zavolám např. actionEdit($id), $id předám příslušné členské proměnné presenteru a přesměruji na view s formulářem. V továrničce na formulář pak je podmínka, která změní např. text elementu legend, přidá skryté formulářové pole s id, nastaví defaultní hodnoty apod.

Když jsem zkusil něco takového napodobit v komponentě, kde místo actionEdit volám např. handleEdit($id), tak formuláři sice přenastavím defaultní hodnoty, přidám nové pole, na stránce se vše vykreslí, ale vůbec se neodešle hodnota takto nově přidaných polí.

PHP 5.3.8, Nette 2.0.1

Ot@s
Backer | 476
+
0
-

Nevím, jestli jsem to pochopil, takže obecně a velmi zjednodušeně. Když v presenteru použiješ actionEdit($id), dostáváš poždavek o editaci přímo do URL a funguje ti to. V komponentě na to ale jdeš přes signály (ono handleEdit($id)) a to je špatně. Signály se totiž vyvolávají přes „systémový“ parametr do=komponenta-handle a jsou určeny jednorázový úkon (v metodě handleNeco většinou i přesměrováváš). Submitnutí formuláře se taky zpracovává signálem, takže je to neslučitelné se současným vyvoláním signálu.

V komponentě pak máš 2 možnosti, jak přenést do URL parametr:

  1. použij persistenci (idelani)
/** @persistent */
public $id;
/** @persistent */
public $what; // ukon, ktery chces delat s ID (EDIT, DELETE, atd...)

Dále už se o nic nestaráš a rovnou používáš $this->id = 10;, v šabloně <a n:href="this, id=>10">edit</a> apod. Pokud chceš persist. parametr deaktivovat u přesměrování, stačí mu dát hodnotu NULL, např. $this->presenter->redirect('this', array('id'=>null, 'what'=>null));.

  1. obsah URL si ovládáš „ručně“

v šabloně komponenty:

<a n:href="this, what=>edit, id=>100">edituj zaznam s ID 100</a>

V komponentě samotné jsou hodnoty z URL dostupné via $this->getParameter();:

$form = new Form();
// zajisteni prenosu ridicich parametru do dalsich pozadavku
$form->addHidden('what', $this->getParameter('what'));
$form->addHidden('id', $this->getParameter('id'));
// nasleduje zbytek definice edit.formulare

Editoval Ot@s (27. 7. 2012 8:46)

kubajz
Člen | 47
+
0
-

Děkuji za radu! Takové řešení jsem potřeboval.