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

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

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
+
0
-

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
+
0
-

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
+
0
-

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.