Formulár generovaný ajaxom v komponente – problém s odosielaním cez ajax

- misiak
 - Člen | 28
 
Zdravím,
narazil som na problém v komponente, ktorú si vytváram pre svoj projekt.
Šablóna komponenty:
<?php
<div>
    {if $isAdmin}
    <div id="ewAdminMenu">
        <ul>
            <li>
                <a href="{link add!}" class="ajax">Pridať</a>
            </li>
        </ul>
    </div>
    {/if}
    {foreach $flashes as $flash}
    <div id="flash" class="{$flash->type}">{$flash->message}</div>
    {/foreach}
    {snippet addForm}
    {if isset($showAddForm) && $showAddForm == true}
        {control eventAddForm}
    {/if}
    {/snippet}
    {snippet ewMainFrame}
    <div class="main">
    </div>
    {/snippet}
</div>
?>
Kód z komponenty EventViewer:
<?php
class EventViewer extends Control
{
	/* ... */
    public function handleAdd()
    {
        $this->template->showAddForm = true;
        $this->invalidateControl('addForm');
    }
    protected function createComponentEventAddForm()
    {
        $eventAddForm = new AppForm();
        $eventAddForm->getElementPrototype()->class = 'ajax';
        $eventAddForm->addText('title', 'Názov')
                     ->addRule(Form::FILLED, 'Názov udalosti musí byť vyplnený.')
                     ->addCondition(Form::FILLED)
                        ->addRule(Form::MAX_LENGTH, 'Názov udalosti nesmie byť dlhší ako 100 znakov.', 100)
                        ->addRule(Form::MIN_LENGTH, 'Názov udalosti nesmie byt kratší ako 5 znakov.', 5);
        $eventAddForm->addText('date', 'Dátum')
                     ->addRule(Form::FILLED, 'Dátum udalosti musí byť vyplnený.')
                     ->addCondition(Form::FILLED); //pridat validator na datumy
        $eventAddForm->addCheckbox('repeat', 'Opakovať každý týždeň?')
                     ->setDefaultValue(false);
        $eventAddForm->addTextArea('description', 'Popis')
                     ->addRule(Form::FILLED, 'Popis udalosti nesmie byť prázdny.')
                     ->addCondition(Form::FILLED)
                        ->addRule(Form::MIN_LENGTH, 'Popis udalosti nesmie byť kratší ako 5 znakov.', 5);
        $eventAddForm->addSubmit('eventAddFormSubmitOk', 'Pridaj');
        $eventAddForm->onSubmit[] = callback($this, 'validSubmitEventAddForm');
        return $eventAddForm;
    }
    public function validSubmitEventAddForm(AppForm $eventAddForm)
    {
        $em = Nette\Environment::getService('EntityManager');
        $event = new \Models\Entities\Event;
        $event->setTitle($eventAddForm['title']->value);
        $event->setStart($eventAddForm['date']->value);
        $event->setDescription($eventAddForm['description']->value);
        $event->setRepeat($eventAddForm['repeat']->value);
        $em->persist($event);
        $em->flush();
        $this->flashMessage('Udalosť je pridaná.', 'success');
        $this->template->showAddForm = false;
        $this->invalidateControl('addForm');
    }
	/* .... */
}
?>
Problémom je, že keď kliknem na Pridať tak sa mi formulár normalne cez ajax zobrazí, akonáhle odošlem formulár, celá stránka sa prekreslí. Použil som aj tento doplnok pre ajax formuláre: https://componette.org/search/?…, ked som vypol javascript tak sa mi stalo, že sa tato komponenta vykreslila bez formulára a tak som ani nevidel chybové hlásenia pri validácii.
Neviete ako to vyriešiť aby ten formulár šlo odoslať a prijať flashMessage od úspechu akcie alebo errors pri validácii bez toho aby to refreshlo celú stránku?
Používam Nette 2.0-alpha.

- Jan Tvrdík
 - Nette guru | 2595
 
Místo
// po načtení stránky
$(function () {
        // odeslání na formulářích
        $("form").submit(function () {
                $(this).ajaxSubmit();
                return false;
        });
        // odeslání pomocí tlačítek
        $("form :submit").click(function () {
                $(this).ajaxSubmit();
                return false;
        });
});
zkus použít
// po načtení stránky
$(function () {
        // odeslání na formulářích
        $("form").live('submit', function () {
                $(this).ajaxSubmit();
                return false;
        });
        // odeslání pomocí tlačítek
        $("form :submit").live('click', function () {
                $(this).ajaxSubmit();
                return false;
        });
});
a obalit flash message snippetem a ten invalidovat.
Editoval Jan Tvrdík (10. 10. 2010 22:03)

- misiak
 - Člen | 28
 
Táto rada pomohla len na odoslanie formulára cez ajax, bohužial ak ho pošlem nevyplnený a neprejde cez validáciu tak bez JS mi to zobrazí validačné hlášky s JS to má stále len zobrazený ten formulár a nič sa nedeje. Cez firefox developer tools som sa pozrel čo vrátilo AJAX odoslanie formulára a nebol to formulár ale celý layout. Neviete kde je problém?

- misiak
 - Člen | 28
 
Ok vyriešil som to. Je potrebné pridať formuláru handler na invalidSubmit.
Napríklad:
<?php
protected function createComponentEventAddForm()
    {
        $eventAddForm = new AppForm();
        /* ... deklaracia prvkov ... */
        $eventAddForm->addSubmit('eventAddFormSubmitOk', 'Pridaj');
        $eventAddForm->onSubmit[] = callback($this, 'validSubmitEventAddForm');
        $eventAddForm->onInvalidSubmit[] = callback($this, 'invalidSubmitEventAddForm');
        return $eventAddForm;
    }
    public function validSubmitEventAddForm(AppForm $eventAddForm)
    {
        /* .... */
        $this->flashMessage('Udalosť je pridaná.', 'success');
        $this->template->showAddForm = false;
        $this->invalidateControl('addForm');
        $this->invalidateControl('eventFlashes');
    }
    public function invalidSubmitEventAddForm(AppForm $eventAddForm)
    {
        $this->flashMessage('Nevalidny form.');
        $this->template->showAddForm = true;
        $this->invalidateControl('addForm');
        $this->invalidateControl('eventFlashes');
    }
?>
Dúfam, že to pomôže niekomu čo bude mať podobný problém.