Více tlačítek u formuláře

- tatyalien
 - Člen | 239
 
Dobrý den,
může mě někdo napsat, jak v ajaxu rozpoznat kterým tlačítkem byl
formulář odeslaný?
Například jednoduchý formulář:
    protected function createComponentAjaxForm()
    {
        $form = new Form();
        $form->addText('txt', 'txt:', 20, 20)
            ->addRule($form::FILLED, '%label musí být zadaný.<br />');
        $form->addSubmit('ano', 'Ano');
        $form->addSubmit('ne', 'Ne');
        // název a oddělení jsem odstranil
        $form->onSuccess[] = callback($this, 'ajaxFormSubmitted');
        $form->getElementPrototype()->class("ajax");
        return $form;
    }
    public function ajaxFormSubmitted(Form $form)
    {
        try {
            $values = $form->getValues();
            $this->flashMessage('Info |'.Rand(1,1000)."|", 'success');
            Debugger::FireLog("odeslán formulář");
            // isSubmittedBy zde nejde... (v ajaxu)
            if($this->isAjax()) {
                $this->invalidateControl('testHodnota');
                $this->invalidateControl('flash');
            } else {
                $this->redirect('this');
            }
        } catch (IOException $e) {
            $form->addError($e->getMessage());
        }
    }
Šablona:
{block content}
{snippet testHodnota}
{$ajaxHodnota}
{/snippet}
{control ajaxForm}
{/block}
Render:
    public function renderAjax(){
        $this->template->ajaxHodnota = Rand(1,1000);
    }
Na zajaxování mám:
jquery-ajax, jquery.ajaxform.js
s dodáním:
		....
		// submit button
		if (this.is(":submit")) {
			form = this.parents("form");
			sendValues[this.attr("name")] = this.val() || "";
            // dodáno 1.6.2012
            this.get(0).form["nette-submittedBy"] = this.get(0); //tohle přidat
		// form
		}...
Tady na fóru každý jen napíše, že to nějak dořešil, ale ani v kuchařce, nebo jak to udělat pro laika jsem se nikde nedočetl…
Editoval tatyalien (8. 6. 2012 8:23)

- tatyalien
 - Člen | 239
 
JJ, moje verze je Nette Framework 2.0.3
    public function ajaxFormSubmitted(Form $form)
    {
        try {
            $values = $form->getValues();
            $this->flashMessage('Info |'.Rand(1,1000)."|", 'success');
            // nefunguje:
            // Debugger::FireLog($form->submitted->name);
            // Debugger::FireLog($form->submitted->name());
            // Debugger::FireLog($form->isSubmitted()->name);
            if($this->isAjax()) {
                $this->invalidateControl('testHodnota');
                $this->invalidateControl('flash');
            } else {
                $this->redirect('this');
            }
        } catch (IOException $e) {
            $form->addError($e->getMessage());
        }
    }
				
- tatyalien
 - Člen | 239
 
To jsem zkoušel, ale neodesílalo se mě nic ajaxově, možná dělám něco
blbě…
měl jsem:
    protected function createComponentAjaxForm()
    {
        $form = new Form();
        $form->addText('txt', 'txt:', 20, 20)
            ->addRule($form::FILLED, '%label musí být zadaný.<br />');
        //$form->addSubmit('ano', 'Ano';
        //$form->addSubmit('ne', 'Ne');
        $form->addSubmit('ano', 'Ano')->onClick[] = callback($this, 'ajaxAno');
        $form->addSubmit('ne', 'Ne')->onClick[] = callback($this, 'ajaxNe');
        // název a oddělení jsem odstranil
        //$form->onSuccess[] = callback($this, 'ajaxFormSubmitted');
        $form->getElementPrototype()->class("ajax");
        return $form;
    }
k tomu zpracování ajaxAno, ajaxNe, ale neprovedlo se.
Nemůže prosím někdo uploudnout řešení, které funguje, ať se můžu podívat, jak to tedy rozjet?

- Ascaria
 - Člen | 187
 
Na straně javascriptu je potřeba namířit ajax ne na formulář, ale na jeho tlačítko:
$('#{!$form['send']->HtmlId}').ajaxSubmit();
TO se pak do odesílaného postu přidá a nette forms pak poznají, že to bylo odesláno ním.
// Finální odeslání formuláře
$form->onSuccess[] = array($this, 'recapitulationSubmited');
public function recapitulationSubmited(Form $form)
    {
    // Pokud to bylo potvrzené submitem send, zpracujeme validní formulář
    if($form['send']->isSubmittedBy())
    }
					Editoval Ascaria (8. 6. 2012 13:00)

- tatyalien
 - Člen | 239
 
Fowie:
//
//$form['ano']->getElementPrototype()->class("ajax"); je pouze na celej formulář, správně to je:
//$form['ano']->setAttribute('class', 'ajax');
        $form->addSubmit('ne', 'Ne')->onClick[] = callback($this, 'ajaxNe');
        $form->addSubmit('ano', 'Ano')->onClick[] = callback($this, 'ajaxAno');
        $form['ano']->setAttribute('class', 'ajax');
        $form['ne']->setAttribute('class', 'ajax');
kde jsem si musel pak opravit
    public function ajaxAno(SubmitButton $button)
    {
        try {
            // načtení hodnot dodáním getForm()
            $values = $button->getForm()->getValues();
            $this->flashMessage('Ano', 'success');
            //nedaří se mě zajaxovat tento formulář
            if($this->isAjax()) {
                $this->invalidateControl('testHodnota');
                $this->invalidateControl('flash');
            } else {
                $this->redirect('this');
            }
        } catch (IOException $e) {
            $form->addError($e->getMessage());
        }
    }
Ale stejně se ajaxově neodešle.
Ascaria: Asi jsem natvrdlej, ale nevím kam přesně nacpat
$('#{!$form['send']->HtmlId}').ajaxSubmit();
Protože zajaxování mám:
    <script type="text/javascript" charset="utf-8" n:syntax="off">
    jQuery.ajaxSetup({
        cache: false,
        dataType: 'json',
        success: function (payload) {
            if (payload.snippets) {
                for (var i in payload.snippets) {
                    $('#' + i).html(payload.snippets[i]);
                }
            }
        }
    });
    // odesílání odkazů
    $('a.ajax').live('click', function (event) {
        event.preventDefault();
        $.get(this.href);
    });
    // odesílání formulářů
    $('form.ajax').live('submit', function (event) {
        event.preventDefault();
        $.post(this.action, $(this).serialize());
    });
    </script>
					Editoval tatyalien (8. 6. 2012 13:24)

- tatyalien
 - Člen | 239
 
Vyřešeno
Ascaria: super!!! Díky moc, toto to vyřešilo ;)
Řešení:
    protected function createComponentAjaxForm()
    {
        $form = new Form();
        $form->addText('txt', 'txt:', 20, 20)
            ->addRule($form::FILLED, '%label musí být zadaný.<br />');
        $form->addSubmit('ano', 'Ano');
        $form->addSubmit('ne', 'Ne');
        // název a oddělení jsem odstranil
        $form->onSuccess[] = callback($this, 'ajaxFormSubmitted');
        $form->getElementPrototype()->class("ajax");
        return $form;
    }
    public function ajaxFormSubmitted(Form $form)
    {
        try {
            $values = $form->getValues();
            $this->flashMessage('Info |'.Rand(1,1000)."|", 'success');
            $this->flashMessage('Funguje |'.$form->submitted->name."|", 'success');
            Debugger::FireLog($form->submitted->name);
            if($form['ano']->isSubmittedBy()) {
                Debugger::FireLog("ANO");
                $this->flashMessage('ano', 'success');
            }
            if($form['ne']->isSubmittedBy()) {
                Debugger::FireLog("NE");
                $this->flashMessage('ne', 'success');
            }
            //nedaří se mě zajaxovat tento formulář
            if($this->isAjax()) {
                $this->invalidateControl('testHodnota');
                $this->invalidateControl('flash');
                //$this->invalidateControl('testFormAjax');
                $form->setValues(array("txt"=>""));
            } else {
                $this->redirect('this');
            }
        } catch (IOException $e) {
            $form->addError($e->getMessage());
        }
    }
A dodání:
    <script type="text/javascript" charset="utf-8" n:syntax="off">
    jQuery.ajaxSetup({
        cache: false,
        dataType: 'json',
        success: function (payload) {
            if (payload.snippets) {
                for (var i in payload.snippets) {
                    $('#' + i).html(payload.snippets[i]);
                }
            }
        }
    });
    // odesílání odkazů + stránkování
    $('a.ajax, .paginator a').live('click', function (event) {
        event.preventDefault();
        $.get(this.href);
    });
    // odesílání formulářů
    $('form.ajax').live('submit', function (event) {
        event.preventDefault();
        $.post(this.action, $(this).serialize());
    });
    // Toto dodáno na rozpoznání tlačítka
    $('form.ajax :submit').on('click', function(event) {
        event.preventDefault();
        $(this).ajaxSubmit();
    });
    </script>
				
- Ascaria
 - Člen | 187
 
Jenom dodám jestě, že ten „form.ajax live submit“ neni potřeba když tam máš skript co napojuje tlačítka.
Dále pokud invaliduješ formulář a ajaxem ho refreshneš, je potřeba na něj zmíněný skript s „:submit“ navázat znovu a nette init taky. Ideálně při vkládání snippetů:
for (var i in payload.snippets) {
    $('#' + i).html(payload.snippets[i]);
    $('#' + i).find('form.ajax :submit').on('click', function(event) {
        event.preventDefault();
        $(this).ajaxSubmit();
    });
    $('#' + i).find('form').each(function() {
        Nette.initForm(this);
    });
}
					Editoval Ascaria (8. 6. 2012 16:27)