Nezaktualizujici se snippet

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

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)

bazo
Člen | 620
+
0
-

mas tam prilinkovany https://componette.org/search/?… ?

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

A do prohlížeče ti skutečně přišlo správně naplněné pole snippets?

TheNEoo
Člen | 75
+
0
-

bazo napsal(a):

mas tam prilinkovany https://componette.org/search/?… ?

Ano mám

TheNEoo
Člen | 75
+
0
-

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
+
0
-

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
+
0
-

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 zavolat submit(). 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
+
0
-

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
+
0
-

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
+
0
-

vojtech.dobes napsal(a):

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.

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)

TheNEoo
Člen | 75
+
0
-

Ale koukam ze mi to asi u tlacitek jdialogu nepujde pac koukam ze tam pouzivas
isSubmit: $el.is(‚input[type=submit]‘) coz u jdialogu nepouzivam form tlacitko klasicke

ji_ri_k
Člen | 44
+
0
-

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
+
0
-

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
+
0
-

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.

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Výborné shrnutí, díky.

TheNEoo
Člen | 75
+
0
-

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
+
0
-

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
+
0
-

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)