Zpracování formuláře na jiné stránce

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

Zdravím,
v BasePresenteru si vytvořím komponentu s vyhledávacím formulářem. Výsledky bych rád odeslal na jiný presenter. Sice jsem prohledal fórum a našel několik příspěvků na toto téma, ale nedaří se mi to zprovoznit. Zkoušel jsem použít $form->setAction v tomto tvaru:

$form->setAction($this->link('Hledani', array('do' => 'hledaniFormSubmitted')));

a ještě nakonec uvedl

$form->onSubmit[] = array('Hledani', 'hledaniFormSubmitted');

Ve zdrojovém kódu se ale vykreslí formulář s kódem: /?do=searchForm-submit&presenter=Aktualnipresenter a vyhodí mi to hlášku:
InvalidStateException Event handler ‚Hledani::hledaniFormSubmitted‘ is not callable. Zde je celý kód továrničky:

protected function createComponentSearchForm()
	{
    $form = new AppForm;

    $form->setAction($this->link('Hledani', array('do' => 'hledaniFormSubmitted')));

    $form->addText('search', 'Hledání:');

    $form->addImage('ok', 'button.png');

    $form->onSubmit[] = array('Hledani', 'hledaniFormSubmitted');

    return $form;
	}
Milhauz
Člen | 26
+
0
-

Ahoj,

metodu setAction není potřeba použít. Stačí použít onClick, případně onSubmit. V poli pro onSubmit musíš odkazovat na presenter a metodu, viz. kód.

$form = new AppForm;
$form->addText('search', 'Hledání:');
$form->addImage('ok', 'button.png');
$form->onSubmit[] = array('HledaniPresenter', 'hledaniFormSubmitted');
return $form;
hauerland
Člen | 16
+
0
-

Aha, díky. Chybělo mi tam to slovo Presenter v názvu. Teď už se mi to na ten presenter odešle, ale když pak chci něco předat šabloně přes $this->template->formdata, tak mi to píše „Using $this when not in object context“. Kdyby se to udělalo přes setaction, tak by to podle mě fungovalo, protože by se to přesměrovalo. Takto to vypadá, že se jenom připojí ta metoda ke stávajícímu presenteru a dělá to bordel. Jenom nechápu, proč ten setaction nefunguje.

Milhauz
Člen | 26
+
0
-

Problém je ten, že se ta metoda volá staticky. Nevytvoří se instance presenteru a tak $this neexistuje. Pokud potřebuješ vytvořit vyhledávací formulář, který má být zřejmě na každý stránce, asi nejlepší bude ho vytvořit v BasePresenteru a do onSubmit přímo přiřadit array($this, 'hledaniFormSubmitted'); Podobný problém se tu již řešil. Mohlo by ti to pomoct.

Skic
Člen | 18
+
0
-

Ja mám ještě problém volat prezenter z jiného modulu, předpokládám toto následující volání

$form->onSubmit[] = array('ISModule/LoginPresenter', 'actionFormLoginSubmit');

vyhodi vyjimku:

InvalidStateException Event handler ‚ISModule/LoginPresenter::actionFormLoginSubmit‘ is not callable

Predem dik za radu.

EDIT: Reseni ve threadu https://forum.nette.org/…in-formulare

Editoval Skic (13. 10. 2009 21:51)