Jak na odeslání formuláře z komponenty
- MartinJanda
- Člen | 60
Ahoj, měl bych dotaz: jak z komponenty správně odeslat formulář a zároveň ho ve stejné komponentě odchytnout a zpracovat? Je lepší v komponentách používat Form neboo AppForm?
- MartinJanda
- Člen | 60
Ještě doplním, že se snažím o odeslání formuláře přes javascript:
$form->addSelect('numberRows', 'Show entries:', $select)->controlPrototype->onchange("submit();");
$form->onSubmit[] = 'changeNumRows';
Chtěl bych to odchytit v metodě changeNumRows v dané komponentě, jen se mi to stále nedaří.
Díky za každou radu.
- MartinJanda
- Člen | 60
Opravil jsem to na AppForm, ale vrací mi to výjimku:
InvalidArgumentException - Component with name 'numRowsSelect' does not exist.
Kde ‚numRowsSelect‘ je pojmenování formuláře ve vytváření objektu
AppForm, tedy:
$this->form = new AppForm($this, 'DataGridNumRows');
Díky moc
Editoval MartinJanda (25. 3. 2009 11:39)
- jasir
- Člen | 746
MartinJanda napsal(a):
InvalidArgumentException - Component with name 'numRowsSelect' does not exist.
Kde ‚numRowsSelect‘ je pojmenování formuláře ve vytváření objektu AppForm, tedy:
$this->form = new AppForm($this, 'DataGridNumRows');
No mě připadá, že se jmenuje DataGridNumRows
a ne
numRowsSelect
, co myslíš?
- MartinJanda
- Člen | 60
Aha, promiň, já to pak přejmenoval a vložil to špatně. Správně ten název má být stejně:
InvalidArgumentException - Component with name 'DataGridNumRows' does not exist
Kde ‚DataGridNumRows‘ je pojmenování formuláře ve vytváření
objektu AppForm, tedy:
$this->form = new AppForm($this, 'DataGridNumRows');
- jasir
- Člen | 746
MartinJanda napsal(a):
Aha, promiň, já to pak přejmenoval a vložil to špatně. Správně ten název má být stejně:
InvalidArgumentException - Component with name 'DataGridNumRows' does not exist
Kde ‚DataGridNumRows‘ je pojmenování formuláře ve vytváření objektu AppForm, tedy:
$this->form = new AppForm($this, 'DataGridNumRows');
A kde se vyhazuje ta chyba? Registruješ ten AppForm v komponentě? Kdyžtak sem dej vetší čášt kódu – ten Control (ve kterém registruješ formulář) a to, kde a jak ho registruješ v presenteru.
Editoval jasir (25. 3. 2009 14:09)
- MartinJanda
- Člen | 60
Díky za snahu o pomoc.
Výjimka nastane, když pošlu data z formuláře zpět na server. Vznikne v Nette/ComponentContainer.php, Line: 153
Komponentu registruju v presenteru v:
public function actionDefault()
{
...
$dataGrid = new DataGrid('operators', $columns, $operations);
$this->addComponent($dataGrid, 'operators');
...
}
App form registruju v renderGrid()
$this->form = new AppForm($this, 'DataGridNumRows');
$this->form->addSelect('numberRows', 'Show entries:', $select)->controlPrototype->onchange("submit();");
$this->form->onSubmit[] = array($this, 'changeNumRows');
$template->numRows = $this->form;
a odchytávat bych to chtěl v metodě v changeNumRows v té komponentě.
Díky
- kravčo
- Člen | 721
MartinJanda napsal(a):
App form registruju v renderGrid()
AppForm treba vytvoriť & zaregistrovať pred fázou spracovania
signálov – napr. v metóde prepareGrid()
alebo ešte lepšie
pomocou továrničky.
- jasir
- Člen | 746
Hele, zkus to přepsat na použití továrniček, viz zde (dole kapitola
Továrnička na komponenty).
Pak nemusíš řešit kde co registrovat, všechny komponenty v Presenterech
i Controlech registruješ v jedné metodě createComponent
daného Controlu/Presenteru a když si na ní potřebuješ sáhnout (a nebo
nette :), zavoláš jen
$this->getComponent('jmenoComponenty')
.
Edit: Tak Kravco byl rychlejsi :)
Editoval jasir (25. 3. 2009 14:57)
- MartinJanda
- Člen | 60
Předěláno do továrničky, ale chyba pořád stejná.
InvalidArgumentException - Component with name 'DataGridNumRows' does not exist
- MartinJanda
- Člen | 60
OK, jsem debil. Nedošlo mi, že ten formulář nemůžu vytvářet až ve fázi render té komponenty. Já jsem to původně měl v actionGrid(), ale nevěděl jsem, že komponenta má jiné životní fáze než presenter tzn. že toto je nesmysl. Když vytvořím formulář v konstruktoru, už to funguje jak potřebuju.
Díky všem za pomoc
- kravčo
- Člen | 721
Dôležité je, že pri prepísaní na továrničku ho nepotrebuješ vytvárať v konštruktore – vytvorí sa „sám“ a až v momente, keď bude potrebný (ak nebude potrebný, nevytvorí sa vôbec).
class MyControl extends Control
{
protected function createComponent($name)
{
// kód vytvárajúci komponent ...
}
public function __toString()
{
// toto volanie vytvára komponent (ak ešte neexistuje)
$this->template->form = $this->getComponent('DataGridNumRows');
// ...
}
}
Teda v prípade, že komponent je príjemcom signálu, ten nemusí byť
„natvrdo“ vytvorený (napr. v konštruktore), ale vytvorí sa automaticky
(volaním createComponent()
), pretože potrebuje prijať signál.
Elegantné, lazy, šetrí písanie a hodiny trieskania hlavy o stenu…
Editoval kravco (26. 3. 2009 2:20)