Nezaktualizujici se snippet
- TheNEoo
- Člen | 75
Ahoj všem.
Z nepochopitelných důvodů se mi nechce po odesílání dat invalidovat snippet.
Přejdu rovnou k problému.
V .latte vše proběhne v pořádku a po odeslaní formu se mi ve firebuggu ukažou data proměné {$test} které mi byly poslány (to jest zobrazilo se ).
Ale snippet se nezaktualizuje a zůstane prázdný, i když data mi byla poslána do prohlížeče.
{block #content}
<H1>Test dialog formu a dialog tlacitka</H1>
<script>
$(function() {
$( "#dialog-form" ).dialog({
resizable: true,
height:140,
modal: true,
buttons: [{
text: "Přidat text",
click: function() {
$("form.ajaxSubmit").ajaxSubmit(
$("#dialog-form").dialog("close")); }
}]
});
});
</script>
{snippet msg}
{$test}
{/snippet}
<div id="dialog-form" title="Test text">
{control testForm}
</div>
A Presenter. Přijde mi, že vše proběhne ok, jak při kliku na dialog tlacitko, tak data jsou mi poslána. Nechápu, z jakého důvodu všude mi jinak snippety jedou. Jen zde ne.
public function createComponentTestForm() {
$form = new Form();
$form->addText("name","Název:");
$form->getElementPrototype()->class = "ajaxSubmit";
$form->onSuccess[] = callback($this, "testFormSubmit");
return $form;
}
public function testFormSubmit(){
$this->template->test = 'Zobrazilo se';
if ($this->presenter->isAjax()) {
$this->invalidateControl('msg');
} else {
$this->redirect('this');
}
}
Editoval TheNEoo (22. 8. 2012 18:39)
- Vojtěch Dobeš
- Gold Partner | 1316
A do prohlížeče ti skutečně přišlo správně naplněné pole
snippets
?
- TheNEoo
- Člen | 75
vojtech.dobes napsal(a):
A do prohlížeče ti skutečně přišlo správně naplněné pole
snippets
?
Jestli sem tě správně pochopil tak myslíš toto z firebuggu
{"state":[],"snippets":{"snippet--msg":" Zobrazilo se\n"}}
To mi přijde a to je podle mě správně.
Editoval TheNEoo (22. 8. 2012 18:47)
- Vojtěch Dobeš
- Gold Partner | 1316
Ok, v tom případě bude problém někde s ajaxifikací. Jednak odkazovaný skript
neřeší formuláře a neposkytuje metodu ajaxSubmit()
. Nehází
ti to v JS konzoli nějakou chybu?
Druhak bych ti doporučil nette.ajax.js
, pak by na tom místě stačilo
zavolat submit()
. Samozřejmě pokud by výměna skriptu
neznamenala přepsat příliš mnoho kódu.
- TheNEoo
- Člen | 75
vojtech.dobes napsal(a):
Ok, v tom případě bude problém někde s ajaxifikací. Jednak odkazovaný skript neřeší formuláře a neposkytuje metodu
ajaxSubmit()
. Nehází ti to v JS konzoli nějakou chybu?
Jinak přilinkovanou obsluhu na form taktež mam.
A chyby taktež žadné nevyhazuje.
Druhak bych ti doporučil
nette.ajax.js
, pak by na tom místě stačilo zavolatsubmit()
. Samozřejmě pokud by výměna skriptu neznamenala přepsat příliš mnoho kódu.
Ano na toto už sem předchvili koukal jen mě zatim nenapada ten submit.
Použiji to co si linknul. Předělat to pravě všechci do dialog formu. Takže předělávat budu.
Jinak když zavolam metodu submit() tak se nestane vubec nic.
chtělo by to vice informaci co a jak
Editoval TheNEoo (22. 8. 2012 19:33)
- Vojtěch Dobeš
- Gold Partner | 1316
nette.ajax.js
defaultně ajaxuje formuláře s CSS třídou
ajax
, takže jakmile by se takový formulář měl klasicky odeslat
(je u něj vyvolána událost submit
), odešle se ajaxově. Takže
pak stačí na takovém formuláři zavolat submit()
, je uměle
vyvolána událost submit
a formulář by se měl ajaxově
odeslat.
nette.ajax.js
je třeba inicializovat voláním
$.nette.init();
.
Hlavně je třeba, aby všechny elementy, které by se měly ajaxově
odesílat, měly CSS třídu ajax
.
- Bernard Williams
- Člen | 207
Nazdárek,
řešil jsem úplně stejný problém a nepodařilo se mi najít příčinu, proč se to děje. Nakonec to obcházím pomocí:
<script>
$.nette.ajax({ url: 'path_to_script' }, null, null);
</script>
Bernard
Editoval Bernard Williams (22. 8. 2012 20:49)
- TheNEoo
- Člen | 75
vojtech.dobes napsal(a):
nette.ajax.js
defaultně ajaxuje formuláře s CSS třídouajax
, takže jakmile by se takový formulář měl klasicky odeslat (je u něj vyvolána událostsubmit
), odešle se ajaxově. Takže pak stačí na takovém formuláři zavolatsubmit()
, je uměle vyvolána událostsubmit
a formulář by se měl ajaxově odeslat.
nette.ajax.js
je třeba inicializovat voláním$.nette.init();
.Hlavně je třeba, aby všechny elementy, které by se měly ajaxově odesílat, měly CSS třídu
ajax
.
Tak jestli te spravne chapu
<script>
$(function() {
$.nette.init(); // Inicializace o ktere mluvis
$( "#dialog-form" ).dialog({
resizable: true,
height:140,
modal: true,
buttons: [{
text: "Přidat text",
click: function() {
$("form.ajax").submit( //Onen submit a form.ajax
$("#dialog-form").dialog("close")); }
}]
});
});
</script>
A v presenteru
public function createComponentTestForm() {
$form = new Form();
$form->addText("name","Název:");
$form->getElementPrototype()->class = "ajax"; // ona trida zde
$form->onSuccess[] = callback($this, "testFormSubmit");
return $form;
}
public function testFormSubmit(){
$this->template->test = 'Zobrazilo se';
if ($this->presenter->isAjax()) {
$this->invalidateControl('msg');
} else {
$this->redirect('this');
}
}
Nechce mi to alep projit a nic se po jdialog submitu nestane. vsude cisto :)
Jinak doufam ze teda nic dalsiho krom toho doplnku tveho nemusim prilinkovat ajax na form atd.
Editoval TheNEoo (22. 8. 2012 21:03)
- ji_ri_k
- Člen | 44
Můžeš používat ty tlačítka z toho formuláře např. takto:
var buttons = new Array;
$("#dialog-form input[type=submit]").each(function(i, val) {
$(this).css({'width': 0, 'height': 0, 'position': 'absolute', 'left': '-9999px'}); // tlacitka posles pomoci css na vylet
buttons.push({text: val.value, click: function() { $('#' + val.id).trigger('click'); } }); // do pole jen pridas value tlacitka + nastavis trigger
});
buttons.push({ text: 'Storno', click: function() { $(this).dialog("close") } }); // muzes pridat zaviraci tlacitko
$("#modal-" + id).dialog("option", "buttons", buttons); // otevres modal okno
- Vojtěch Dobeš
- Gold Partner | 1316
Off-topic bych jen dopnil, že v Javascriptu je preferovaný zápis
var buttons = [];
. new Array
by se spíš používat
nemělo, není to ani rychlejší ani nic takového.
- drahos
- Člen | 18
vojtech.dobes napsal(a):
Off-topic bych jen dopnil, že v Javascriptu je preferovaný zápis
var buttons = [];
.new Array
by se spíš používat nemělo, není to ani rychlejší ani nic takového.
Také off-topic, za to se omlouvám. Rozdíl mezi zápisem
var buttons = [];
a var buttons = new Array
není
v tomto případě žádný. Důvod poč se preferuje zápis []
je
ten, že kdybychom chtěli vytvořit pole čísel a předali bychom číslo do
konstruktoru, vytvořilo by se pole o dané velikosti. Při použití
var pole = new Array(10)
nevytvoříme pole [10]
, ale
pole o velikosti deset: pole.length === 10
. Další důvod je ten,
že když voláme new Array
, nemusí to být vždy nutně to pole
window.Array
. Pokud bychom totiž měli v daném kontextu funkci
respektive konstruktor Array
, nevytvořili bychom pole, ale námi
nadefinovaný objekt Array
. Proto je lepší používat zápis
v hranatých závorkách.
- TheNEoo
- Člen | 75
ji_ri_k napsal(a):
Můžeš používat ty tlačítka z toho formuláře např. takto:
var buttons = new Array; $("#dialog-form input[type=submit]").each(function(i, val) { $(this).css({'width': 0, 'height': 0, 'position': 'absolute', 'left': '-9999px'}); // tlacitka posles pomoci css na vylet buttons.push({text: val.value, click: function() { $('#' + val.id).trigger('click'); } }); // do pole jen pridas value tlacitka + nastavis trigger }); buttons.push({ text: 'Storno', click: function() { $(this).dialog("close") } }); // muzes pridat zaviraci tlacitko $("#modal-" + id).dialog("option", "buttons", buttons); // otevres modal okno
Ahoj muzes mi prosim povysvetlit tento radek.
$(„#modal-“ + id).dialog(„option“, „buttons“, buttons);
bo spise „#modal-“ + id … to id modal.
Ten modal ma byt id tlacitka formu ?
- ji_ri_k
- Člen | 44
Ahoj, to $("#modal-" + id)...
je překlep (ten řádek jsem
vykopíroval z mého kódu) – v tvém případě by tam patřilo
$("#dialog-form").dialog("option", "buttons", buttons);
PS: To ID tam mám proto, že mohu otevírat více dialogových oken na jedné
stránce a chci aby se ten JS vykonal jen pro to nově otevřené okno (tzn.
každé okno dostane své unikátní ID).
- TheNEoo
- Člen | 75
ji_ri_k napsal(a):
Ahoj, to
$("#modal-" + id)...
je překlep (ten řádek jsem vykopíroval z mého kódu) – v tvém případě by tam patřilo$("#dialog-form").dialog("option", "buttons", buttons);
PS: To ID tam mám proto, že mohu otevírat více dialogových oken na jedné stránce a chci aby se ten JS vykonal jen pro to nově otevřené okno (tzn. každé okno dostane své unikátní ID).
Ok to zatim vypada ze pojede i z validaci jenze neotevre se mi okno jen se mi to ajaxove vlozi do stranky, ale okno nikde :)
ja uz nevim co z tim uz sem z toho zoufalej :)
$("#dialog-form").dialog();
kdyz posledni radku pouziji takto
tak uz se otevre
Editoval TheNEoo (29. 8. 2012 13:19)