formular nette.ajax.js ve vyskakovacim okne
- vosy
- Člen | 532
ahoj, potreboval bych zprovoznit odesilani dat z formulare ve vyskakovacim
jqueryui dialog okne.
na strance amm jeden formular ktery se odesila v pohode pomoci ajaxu.
ale kdyz knilknu na tlacitko ktery mi zobrazi plovouci dialog onko a tam amm nastaveny
<form action="/admin/zajezdy/upravit/4?do=pridatTerminZajezdu-submit" method="post" id="frm-pridatTerminZajezdu" novalidate="novalidate" class="ajax">
ale tlacitko ajaxove nefunguje
<input type="submit" name="ulozit" id="frm-pridatTerminZajezdu-ulozit" value="Uložit" class="btn btn-success">
kdyz se provede otevreni dialogu provede se
open:function( event, ui)
{
nsZajezdy.termin.setupDialog();
}
setupDialog:function()
{
$.nette.ext('#frm-pridatTerminZajezdu', {
init: function(r)
{
},
complete: function (r)
{
var okFce = function(json)
{
};
var fData = {r:r, okFce:okFce, showR:false};
nsVosy.myDialog.default(fData);
}}, {
});
}
prijde mi ze formular ktery se externe nacte jiz po nacteni stranky a po provedeni $.nette.init(); tak ho nete uz neprechroupe prez ajax ikdyz ma class=„ajax“
- Honzy
- Člen | 22
v mem pripade: otevru si dialog a do nej ajaxem natahnu formular, ktery ale v tu chvili pri odeslani prestane byt ajaxovy :-/ kdyz s tim formularem nataham i <script> na jquery a nette.ajax, tak ajax funguje (ale je to hlupe reseni a navic prestane fungovat ajax po zavreni dialogu)
- Honzy
- Člen | 22
class tam je, ukazu:
form.latte:
{control classicForm}
main.js:
$( document ).on( "click", "a.noveokno", function(e) {
e.preventDefault();
var url = $(this).attr('href');
var snippUrl = $(this).attr('data-url');
$("#UIdialog").dialog({
modal: true,
autoOpen: true,
closeOnEscape: true,
resizable: true,
open: function ()
{
$(this).load(url);
},
height: 400,
width: 500,
title: '',
close: function() {
$(this).dialog('destroy');
$.nette.ajax({url: snippUrl});
}
});
});
Presenter:
public function createComponentClassicForm()
{
$form = new Form;
$form->getElementPrototype()->class('ajax form');
$form->setAction('');
$form->setMethod('POST');
$form->addProtection('Vypršel časový limit, odešlete formulář znovu');
...
...
...
$form->addSubmit('send', 'Uložit');
$form->onSuccess[] = callback($this, 'classicFormSubmitted');
return $form;
}
AJAX ve formu funguje, kdyz ho zobrazim normalne. Kdyz formular dam do dialogu → viz. zdrojaky, tak neajaxuje
Editoval Honzy (10. 9. 2014 16:38)
- wodCZ
- Člen | 49
Zkus $.nette.load();
– to by mělo fungovat jako
„reinit“, ale ruku do ohně za to nedám.
Bindování událostí v jquery funguje tak, že se na prvky aktuálně se
nacházející na stránce navážou dané události (ajaxové
odesílání).
Nově přidané prvky už tím ovlivněny nejsou.
nette.ajax.js se automaticky „znovunabinduje“ po požadavku, který byl
přes něj zpracován. Tím že taháš form jinak než přes $.nette.ajax se
nepřebindovává.
U čehokoliv ostatního nette.ajax.js se dynamické bindování (na stávající i nově přidané prvky) používá jquery plugin livequery (sleduje změny DOM a když něco přibyde, tak nabinduje). Vyžaduje to ale modifikaci kódu.
Editoval Inkode (10. 9. 2014 19:19)
- Honzy
- Člen | 22
Pouzivam. Stahl jsem ted pro jistotu nejnovejsi verzi, ale zadna zmena. Ono to vypada, ze nefunguje v pripade ajaxem nacteneho kodu, jakoby nette.ajax neumel odchytavat udalosti po zmene kodu. Zajimave je, ze validace formulare je OK. Zkousel jsem znovu volat i $.nette.init(); resp $.nette.load() pri open, coz vede k uncaught exception: Cannot initialize nette-ajax twice, takze plugin asi bezi. Fakt netusim, co s tim :(
open: function ()
{
$(this).load(url);
// $.nette.init();
$.nette.load();
},
- wodCZ
- Člen | 49
Zkus
open: function ()
{
$(this).load(url);
setTimeout(function(){
$.nette.load();
alert('loaded nette ajax');
}, 500);
},
tím ověříš, jestli se $.nette.load pouští až po tom, co je formulář v DOM. nejsem javascriptař, ale tohle by se mělo starat o to přebindování.
Editoval Inkode (10. 9. 2014 19:42)
- Honzy
- Člen | 22
Inkode napsal(a):
Zkus
$.nette.load();
– to by mělo fungovat jako „reinit“, ale ruku do ohně za to nedám.
to bohuzel nefunguje
Inkode napsal(a):
nette.ajax.js se automaticky „znovunabinduje“ po požadavku, který byl přes něj zpracován. Tím že taháš form jinak než přes $.nette.ajax se nepřebindovává.
a nejde to nejak natahnout pres $.nette.ajax? Ze bych v tom load misto $(this).load(url)? Ted jsem to prepsal na
open: function ()
{
$.nette.ajax({url: url});
}
a validace funguje (i kdyz jinak, ale to by nevadilo), AJAX taky funguje, akorat se zavola 2× s tim, ze prvni je „Aborted“ a druhy posila nesmysl a ne data formulare.
Editoval Honzy (10. 9. 2014 21:01)
- Honzy
- Člen | 22
<script src="{$basePath}/js/jquery.min.js"></script>
<script src="{$basePath}/js/main.js"></script>
<script src="{$basePath}/js/jquery-ui.min.js"></script>
<script src="{$basePath}/js/datepicker.cs.js" type="text/javascript"></script>
<script src="{$basePath}/js/netteForms.js"></script>
<script src="{$basePath}/js/nette.ajax.js"></script>
nic vic neni :-/ je to v <head> v @layout.latte
Editoval Honzy (10. 9. 2014 20:57)
- Vojtěch Dobeš
- Gold Partner | 1316
Hm, zajímavý snippet kódu. Pokud to dobře chápu, tvůj javascriptový
kód se nenachází v main.js
, je to tak?
- Vojtěch Dobeš
- Gold Partner | 1316
V tom případě proč se nette.ajax.js
tahá až po něm?
main.js
by měl být poslední.
- Honzy
- Člen | 22
nakonec jsem to predelal do snippetu:
@layout.latte
<html>
<head>
<script src="{$basePath}/js/jquery.min.js"></script>
<script src="{$basePath}/js/jquery-ui.min.js"></script>
<script src="{$basePath}/js/datepicker.cs.js" type="text/javascript"></script>
<script src="{$basePath}/js/netteForms.js"></script>
<script src="{$basePath}/js/nette.ajax.js"></script>
<script src="{$basePath}/js/main.js"></script>
</head>
<body>
<div class="main-content">
<div class="container">
{include #content}
</div>
</div>
<div id="UIdialog">
{snippet UIdialog}{/snippet}
</div>
</body>
</html>
form.latte
{block content}
{snippet UIdialog}
{control classicForm}
{/snippet}
{/block}
main.js
$(function () {
$.nette.init();
});
$(document).ready(function(){
$( ".datepicker" ).datepicker($.datepicker.regional[ "cs" ]);
$( document ).on( "click", "a.noveokno", function(e) {
e.preventDefault();
var url = $(this).attr('href');
var snippUrl = $(this).attr('data-url');
$("#UIdialog").dialog({
modal: true,
autoOpen: true,
closeOnEscape: true,
resizable: true,
open: function ()
{
$.nette.ajax({url: url});
},
height: 400,
width: 500,
title: '',
close: function() {
$(this).dialog('destroy');
$.nette.ajax({url: snippUrl});
}
});
});
});
Presenter:
public function createComponentClassicForm()
{
$form = new Form;
$form->getElementPrototype()->class('ajax form');
$form->setAction('');
$form->setMethod('POST');
$form->addProtection('Vypršel časový limit, odešlete formulář znovu');
...
...
...
$form->addSubmit('send', 'Uložit');
$form->onSuccess[] = callback($this, 'classicFormSubmitted');
return $form;
}
…a funguje to dobre, az na to ze se odeslani formulare vola 2× viz http://www.nahraj-obrazek.cz/?…
Editoval Honzy (11. 9. 2014 10:12)