Problém s nefunkční callbackem

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

Ahoj,
začínám s Nette a potřeboval bych pomoct.. V presenteru jsem vytvořil jednoduchý formulář, který pomocí latte vykresluju do šablony – tohle mi všechno funguje, ale když formulář odešlu, tak se nezavolá callback funkce.. Zkoušel jsem všechno možný, GET, POST a nic mi z toho nefungovalo..

/**
 * Inventary presenter.
 */

use Nette\Application\UI;
use Nette\Forms\Controls\SubmitButton;
class InventaryPresenter extends BasePresenter
{

    protected function createComponentCompanyFilterForm()
    {
        $form = new UI\Form;
	$form->setAction($this->link("Inventary:"));
        $form->setMethod('POST');
        $form->addSelect("country", '', array(
                                             "CZ",
                                             "SK"
                                             ));
        $form->addSelect("city", '', array(
                                             "Praha",
                                             "Jihlava"
                                             ));
        $form->addSelect("service", '', array(
                                             "Webdesign",
                                             "Programming"
                                             ));
        $form->addSubmit("submit", "Filter");
        $form->onSubmit[] = callback($this, 'filterSubmitted');
        return $form;
    }

    public function renderDefault()
	{
        if($this->presenter->isAjax()) {
            $this->invalidateControl("company");
            $this->invalidateControl("company_filter");
        }

        $this->template->formFilterForm = $this->createComponentCompanyFilterForm();



	}

    public function filterSubmitted(UI\Form $form){
        $values = $form->getValues();
        var_dump($values);die;
    }
}

V šabloně to vykreslím pak takto:

{control $formFilterForm}

Editoval Jadro007 (15. 9. 2012 13:33)

vvoody
Člen | 910
+
0
-

ten action nenastavuj

Jadro007
Člen | 8
+
0
-

vvoody napsal(a):

ten action nenastavuj

nepomohlo..

duke
Člen | 650
+
0
-

Tento řádek vyhoď:

$this->template->formFilterForm = $this->createComponentCompanyFilterForm();

V šabloně použij:

{control companyFilterForm}

Pokud někde v presenteru potřebuješ objekt této komponenty, obstarej si ho standardním způsobem, tj.:

$form = $this['companyFilterForm'];

V dokumentaci je o tom řeč zde.

A mimochodem, inventář se řekne anglicky „inventory“, nikoli „inventary“.

Editoval duke (15. 9. 2012 14:04)

vvoody
Člen | 910
+
0
-

aha, tak potom

{control companyFilterForm}
Jadro007
Člen | 8
+
0
-

duke: přesně tohle už jsem zkoušel, ale Component with name ‚formFilterForm‘ does not exist
Jinak za tu angličtinu díky, jsem se přehlídl :)

duke
Člen | 650
+
0
-

Jadro007 napsal(a):

duke: přesně tohle už jsem zkoušel, ale Component with name ‚formFilterForm‘ does not exist
Jinak za tu angličtinu díky, jsem se přehlídl :)

Uvedenou chybu ti nemohl vyhodit doporučovaný řádek:

{control companyFilterForm}

…nýbrž řádek:

{control formFilterForm}
vvoody
Člen | 910
+
0
-

preto tam ma byt companyFilterForm podla nazvu tovarnicky

edit: :D zasa som bol pomalsi

Editoval vvoody (15. 9. 2012 14:10)

Jadro007
Člen | 8
+
0
-

Duke, vvoody – super, díky moc, už to funguje.. ještě jsem teda musel přepsat onSubmit na onSuccess ale už to jede :)

duke napsal(a):

Jadro007 napsal(a):

duke: přesně tohle už jsem zkoušel, ale Component with name ‚formFilterForm‘ does not exist
Jinak za tu angličtinu díky, jsem se přehlídl :)

Uvedenou chybu ti nemohl vyhodit doporučovaný řádek:

{control companyFilterForm}

…nýbrž řádek:

{control formFilterForm}
duke
Člen | 650
+
0
-

Pro úplnost: Makru control lze předat buď název komponenty (pod kterým je vedená v presenteru, tj. pro který existuje továrnička), či přímo objekt komponenty. Když předáváš název, o vytváření se nestaráš (jen poskytneš továrničku). Když předáváš objekt, je potřeba ho vytvářet přes presenter, tj. stylem:

$component = $this['companyFilterForm']; // což je totéž jako: $component = $this->getComponent('companyFilterForm', TRUE);

Pokud ji vytváříš jinak, např. přímým voláním továrničky, tak se ti nezaregistruje v presenteru, což má za následek nefunkčnost signálů. Navíc by se ti takto továrnička mohla volat zbytečně vícekrát.

Čili tvůj původní příklad by šel opravit ještě alternativně takto. Řádek:

$this->template->formFilterForm = $this->createComponentCompanyFilterForm();

…nahradit za:

$this->template->formFilterForm = $this['companyFilterForm'];

Ale doporučuji prvně navrhované řešení.

Editoval duke (19. 9. 2012 6:11)