form v komponentě zafunguje pouze jednou

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

Ahoj, mám komponentu, která má 2 signály a jeden formulář.
Pokud odešlu formulář tak vše zafunguje. Pokud ho chci odeslat podruhé tak komponenta nereaguje.
Signály fungují vždy. Pokud ale odešlu signál tak mi přestane fungovat formulář.
Zkrátka formulář funguje pouze pokud je submit první tlačítko na které kliknu.

V komponentě mám následující formulářové metody

protected function createComponentFilterForm()
    {
        $form = new Form;
        $form->onSuccess[] = $this->processFilterForm;
        return $form;
    }

    public function processFilterForm()
    {
        $this->filter = $this->presenter->getParameter('filter');

        if(!$this->presenter->isAjax()) {
            $this->redirect('this');
        } else {
            $this->redrawControl();
        }
    }

a formulář vykresluju následovně

{snippet}
...
        <tr id="filter">
			{form filterForm class=>"ajax"}
				{foreach $columns as $column}
					<td><input type="text" name="filter[{$column}]"/></td>
				{/foreach}
				<td><input type="submit" name="filter" value="filter"/></td>
			{/form}
		</tr>
...
{/snippet}

Co dělám špatně ?

mkoubik
Člen | 728
+
0
-

Ty inputy přidávej do formuláře v té továrničce (pomocí $form->addcontainer() a $form->addText()). Ten filtr vytáhni z $form->getValues() a ulož jako persistentní parametr. píšu to stručně, tak snad všechno potřebné dohledáš v dokumentaci.

Dragonaut
Člen | 33
+
0
-

Díky.

Tak jsem to přepsal, ale chová se to pořád stejně, mám to teď následovně :

protected function createComponentFilterForm()
    {
        $form = new Form;
        $form->onSuccess[] = $this->processFilterForm;

        $sub = $form->addContainer('filter');
        foreach ($this->columns as $column) {
            $sub->addText($column, $column);
        }

        return $form;
    }

    public function processFilterForm(\Nette\Application\UI\Form $form)
    {
        $values = $form->getValues();

        $this->filter = $values['filter'];

        if(!$this->presenter->isAjax()) {
            $this->redirect('this');
        } else {
            $this->redrawControl();
        }
    }

a v templatu

<tr id="filter">
			{form filterForm class=>"ajax"}
				{formContainer filter}
					{foreach $columns as $column}
						<td>{input $column}</td>
					{/foreach}
				{/formContainer}
				<td><input type="submit" name="filter" value="filter"/></td>
			{/form}
		</tr>

Editoval Dragonaut (14. 10. 2014 13:28)

Šaman
Člen | 2666
+
0
-

Bez AJAXu ti to funguje? Často se mi podobné chyby stávaly, když jsem zkoušel ajax.

Dragonaut
Člen | 33
+
0
-

No kupodivu sem zjistil, že bez ajaxu to nefunguje vůbec :-) ikdyž se get požadavek odešle po každém kliku na submit tak se odesílají nějaké nesmysly, ale když přidam do stránky

<script>
	$(function () {
		$.nette.init();
	});
</script>

tak se mi odešle post požadavek se správnými parametry, ale podruhé už kliknutí na submit nic neudělá.

s ajaxem se mi pošle (správné parametry)

do	lGrid-filterForm-submit
filter[ActualPrice]	d
filter[Description]	b
filter[InventoryQuantity]	c
filter[Name]	a

bez ajaxu se mi getem pošle (špatně)

lGrid-columns[ActualPrice...	ActualPrice
lGrid-columns[Description...	Description
lGrid-columns[InventoryQu...	InventoryQuantity
lGrid-columns[Name]	Název
lGrid-filter[ActualPrice]
lGrid-filter[Description]
lGrid-filter[InventoryQua...
lGrid-filter[Name]
lGrid-variables[0]	ID

tak nevím :P

Editoval Dragonaut (15. 10. 2014 10:08)

Dragonaut
Člen | 33
+
0
-

Tak jsem zjistil v čem je problém, když je formulář mimo tabulku tak vše funguje jak má, ale v momentě kdy ho vložím do tabulky tak nastanou popsané problémy. Na github jsem nahrál ukázkovou aplikaci, která obsahuje komponentu s tímto problémem, jak by to šlo vyřešit ?

Díky

github: https://github.com/…irstControl/

Editoval Dragonaut (15. 10. 2014 10:09)