Textinput – naplnění hodnoty přez Ajax

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

Dobrý den,
předem upozorním že s ajaxem mám zatím jen zkušenost z představení viz https://doc.nette.org/…ication/ajax .

Chci se zeptat, jak se dá řešit toto: mám formulář kde mám text input kde zadává uživatel datum, vedle něj mám tlačítko, na které mám navěšenou funkci, která pouze doplní aktuální den do text inputu. (uloží data do sessionu, redirectne zpět). Chtěl bych toto zajaxovat, aby se nemusela načítat celá stránka, ale jen tato jedna hodnota (jen doplnění dnešního data do textového pole). Jak se toto dá rešit?

Kód:

<?php
class DatumPresenter extends BasePresenter
{

	public function renderDefault()
	{

	}

    protected function createComponentDatumForm($name)
    {
        $form = new AppForm($this, $name);
        $form->addText('datum_start', 'Datum startu')->addRule($form::FILLED, 'Zadejte datum.');
        // Samozřejmně ve formuláři není pouze jeden textinput, jen jsem to osekal...

	$form->addSubmit('btn_datum_start', 'Datum startu')->setValidationScope(false);
        $form->addSubmit('btn_vymazat', 'Vymazat session')->setValidationScope(false);
        $form->addSubmit('btn_odeslat', 'Odeslat');
        //..
        $form['btn_datum_start']->onClick[] = callback($this, 'datumyClicked');
        $form['btn_vymazat']->onClick[] = callback($this, 'vymazatClicked');

        // nastavení vyýchozích hodnot
        $namespace = Environment::getSession('datumy');
        $form->setDefaults((array) $namespace->datum);
    }

    public function datumyClicked(\Nette\Forms\SubmitButton $button) {
        $values = $button->getForm()->getValues();

        // zjistím si, pro jaký formulář chci doplňit datum
        // protože názvy tlačítek jsou stejné jako formuláře jen mají navíc btn_
        $formular = substr($button->getName(), 4);

        $values[$formular] = Date("d.m.Y", Time());
        $namespace = Environment::getSession('datumy');
        $namespace->datum = $values;

        $this->flashMessage("Vložen datum do hodnoty: '{$button->caption}'.");
        $this->redirect('this');
    }

    public function vymazatClicked(\Nette\Forms\SubmitButton $button) {
        $namespace = Environment::getSession('datumy');
        unset($namespace->datum);

        $this->flashMessage("Session vymazána.");
        $this->redirect('this');
    }

}
?>
bojovyletoun
Člen | 667
+
0
-

Tak jsem se na to podíval. Stačilo obalit control do snippetu, přidat formu třídu ajax a poupravit funkce a přidat obslužný js . Prozatím takto $button->form['datum_start']->value= $values = Date("d.m.Y - G:i:s", Time()); Moc se mi tam nelíbí ty hříčky s ukládáním a s session, řešil bych to jinak, teď nevím jak ještě.

Momentálně jsem se zasekl u jedné věci – odesílám ajaxově, ale ať klikám na jakékoli tlačítko, vždy se odešle prvním tlačítkem. (viz ) . Zkoušel jsem to se svým skriptem obsluhujícím ajax a formy.

PS: radši to upřesním (platí to pro ajaxové odeslání), chyba je ve všech prohlížečích a nevím, jak tedy rozpoznat, kterým tlačítkem byl formulář odeslán. V požadavku není vůbec název buttonu. V případě, že neodesílám přes ajax, tak se odešle název submit buttonu.

Vyřešeno:

var send=$(this).serializeArray();
send.push({'name':this['nette-submittedBy'],'value':1}); //přidá k odeslaným datům název submitbuttonu

Editoval bojovyletoun (13. 5. 2011 14:23)

tatyalien
Člen | 239
+
0
-

Asi v tom plavu více než jsem si myslel, ale z toho co píšeš nedokážu stvořit funkční ozkoušení…

obalení snipetu bych ještě zvládl ;), ale zbytek už je pro mě Španělsko…
Ukládání do sessionu tam mám pak pro odeslání formuláře, dávám uživateli později možnost si zkontrolovat zadané údaje a až po zkontrolování se ukládají data do db, pokud dá ne, vrátí se zpět do editace formuláře (s přednastavenými hodnotami právě ze sessionu).

Editoval tatyalien (15. 5. 2011 21:39)

tatyalien
Člen | 239
+
0
-

bojovyletoun napsal(a):

Vyřešeno:

var send=$(this).serializeArray();
send.push({'name':this['nette-submittedBy'],'value':1}); //přidá k odeslaným datům název submitbuttonu

Prosímtě, kam to mám přesně napojit? Odesílám teď jeden formulář, který má 2 tlačítka a nedokážu dostat ajaxově, kterým tlačítkem to bylo odesláno. Ajax mám z doplňků jquery.ajaxform.js a jquery.nette.js, na formuláři třídu ajax… ajaxově se to odešle, ale nemůžu pak používat

if($form['tlacitko_a']->submittedBy) {
    ...
} else  {
		...
	}
<script>
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>

Vzykoušel jsem i toto

		// submit button
		if (this.is(":submit")) {
			form = this.parents("form");
			sendValues[this.attr("name")] = this.val() || "";
            // toto
            this.get(0).form["nette-submittedBy"] = this.get(0); //tohle přidat
...

Editoval tatyalien (1. 6. 2012 9:37)