Modal okno s inputem a odeslání zadaných dat AJAXem

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

Ahoj, s ajaxem jsem ještě nedělal a tak bych potřeboval trochu nakopnout (trochu se v tom plácám).

Potřebuji udělat následující: Mám tlačítko a po kliku na něj bych chtěl otevřít Modal okno s textovým inputem a tlačítkem odeslat. Po zadání dat do inputu a stisku tlačítka odeslat, by se mi data dostala AJAXem do presenteru a modal okno zavřelo.

Dekompozice problému:

  1. Jak vytvořím Modal okno?
  2. Jak toto okno z otevřu (href=„??“)?
  3. Jak zpracuju událost kliku na tlačítka v modal okně a odešlu ajaxem data?

Díky moc za jakoukoli radu, odkaz, …

22
Člen | 1478
+
0
-
  1. např. jQueryUI/Dialog
  2. nějakou javascriptovou událostí, onclick např.
  3. stejně jako při zpracování formuláře nebo handlerem, viz. dokumentace – AJAX
Ot@s
Backer | 476
+
0
-

Pouzij JQuery UI dilaog + jquery.nette.js + jquery.ajaxform.js

Ukazka sablony presenteru:

<script>
// aktivace odkazu na zobrazeni dialogu
jQuery(function($) {
	$('a.ajaxdialog').live('click', function(event) {
		event.preventDefault();
		$.post($.nette.href = this.href, function(data) {
			// (mimo jine) injektovani formulare do HTML
			$.nette.success(data);
			// aktivace ajaxoveho submitu formulare
			activateAjaxForm();
			// zobrazeni formulare v dialogu
			$("#snippet--simpleForm").dialog();
		}, "json");
	});
});
// aktivace "ajaxoveho" formulare
function activateAjaxForm () {
	$("#snippet--simpleForm form :submit").click(function () {
		$(this).ajaxSubmit();
		$("#snippet--simpleForm").dialog( "destroy" ); // po submitnuti zavreme dialog
		return false;
	});
}
</script>

{snippet flashMsg}
<ul n:foreach="$flashes as $flash">
	<li>{$flash->message}</li>
</ul>
{/snippet}

<a n:href="getSimpleForm!" class="ajaxdialog">Otevri dialog</a>

{snippet simpleForm}
{if isset($showSimpleForm)}{control simpleForm}{/if}
{/snippet}

V presenteru pak:

public function handlegetSimpleForm() {
	$this->template->showSimpleForm = true;
	if ($this->presenter->isAjax()) {
		$this->invalidateControl('simpleForm');
	}
}

protected function createComponentSimpleForm() {
	$form = new Nette\Application\UI\Form;
	$form->addText('email', 'Email:')
		->addRule(Form::FILLED, 'Zadejte email');

	$form->addSubmit('register', 'Registrovat')
		->onClick[] = callback($this, 'simpleFormSubmitted');

	return $form;
}

public function simpleFormSubmitted($btn) {
	// ... zde se zpracuj vysledky z $btn->form->getValues()
	$this->flashMessage('Vysledek byl ulozen/zpracovan.');
	if ($this->presenter->isAjax()) {
		$this->invalidateControl('simpleForm');
		$this->invalidateControl('flashMsg');
	} else {
		$this->redirect('this');
	}
}

Editoval Ot@s (7. 11. 2011 15:07)

lumen
Člen | 32
+
0
-

Super, děkuju… vyzkouším.

lumen
Člen | 32
+
0
-

Tak jsem nakonec použil řešení od Ot@se a funguje velmi dobře. Měl bych ještě dotaz, jak a kam můžu nadefinovat parametry toho dialogu (např. width: 300, height: 200, modal: true, …) ?

Ot@s
Backer | 476
+
0
-

lumen napsal(a):

… jak a kam můžu nadefinovat parametry toho dialogu (např. width: 300, height: 200, modal: true, …) ?

Viz. parametry (tab Option) třeba při vyvolání dialogu:

$("#snippet--simpleForm").dialog( { height: 300, width: 400, modal: true} );
// + minHeight/maxHeight a minWidth/maxWidth

EDIT: přidána mezera do zápisu ...({ height: 300,...

Editoval Ot@s (8. 11. 2011 9:04)

lumen
Člen | 32
+
0
-

Ot@s napsal(a):

lumen napsal(a):

… jak a kam můžu nadefinovat parametry toho dialogu (např. width: 300, height: 200, modal: true, …) ?

Viz. paramtery (tab Option) třeba při vyvolání dialogu:

$("#snippet--simpleForm").dialog({height: 300, width: 400, modal: true});
// + minHeight/maxHeight a minWidth/maxWidth

Tak jsem to vyzkoušel:

jQuery(function($) {
        $('a.ajaxdialog').live('click', function(event) {
                event.preventDefault();
                $.post($.nette.href = this.href, function(data) {
                        // (mimo jine) injektovani formulare do HTML
                        $.nette.success(data);
                        // aktivace ajaxoveho submitu formulare
                        activateAjaxForm();
                        // zobrazeni formulare v dialogu
                        $("#snippet--simpleForm").dialog({height: 300, width: 400, modal: true});
                }, "json");
        });
});

a Nette mi na tom řádku (.dialog(…)) vyhazuje výjimku:

Nette\Latte\ParseException

Unknown macro {height} in …/templates/@layout.latte:91

iguana007
Člen | 970
+
0
-

dej tam k zavorkam mezery: { height… } jinak je to bráno jako latte makro

OK3
Člen | 91
+
0
-

Pokud nevypisuješ do těla skriptu žádné proměnné {$var}, můžeš použít tohle

<script n:syntax="off">
    var obj = {var: 123}; // tohle neni makro
</script>

a neřešit ty mezery u složených závorek.

lumen
Člen | 32
+
0
-

Díky, zabralo (jak „mezery“, tak „n:syntax=‚off‘“).

SparkCZ
Člen | 22
+
0
-

Něco takového jsem taky scháněl. Tohle řešení je funkční, ale při ajaxSubmit nefunguje javascriptova validace. Můžete mi poradit, co je třeba do kódu přihodit?

newPOPE
Člen | 648
+
0
-

@SparkCZ skus si pozriet ako funguje JS validacia normalne a podla toho urobis aj ajaxSubmit. staci tam spustit tusim nejaki metodu kde ako param vrazis ten form a zvaliduje ti ho…

kod uz nemam, niekedy davno som sa s tym hral

SparkCZ
Člen | 22
+
0
-

JJ, našel jsem, už to šlape :) Díky :)

Mirda
Člen | 35
+
0
-

Dobrý den, zkouším tento příklad. Díky za něj, pěkná práce.
Jen se mi nedaří v dialogu rozjet Live Form Validation. Mohl by mi někdo poradit? Děkuju.

Richard Faila
Člen | 40
+
0
-

Zdravím

Udělal jsem vše přesně jak psal Ot@s, ale když si nechám vykreslit formulář, tak je jakoby odeslaný (jsou vypsané chyby o nevyplnění polí) a když se formulář odešle, dojde k chybě při redirectu a odeslání flashMessage.

Nevíte kde by mohla být chyba?

PHP 5.3.6 | Server Apache/2.2.8 (Win32) PHP/5.3.6 | Nette Framework 2.1-dev