AJAX přenese hodnoty a zobrazí chybu Undefined index

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

S Nette se pořád učím a teď jsem dospěl do fáze, že bych se potřeboval naučit AJAX.

V mém projektu mám takový zatím zkušební příklad, kde si zkouším toto:

default.latte:

<a class="ajax" n:href="dalsiMoznosti!"><div class="large-4 columns button">Další možnosti</div></a>

layout.latte:

	<script>
  $(function () {
    $.nette.init();
  });

  $(function () {
  $("a.ajax").on("click", function(){
        $.nette.ajax({
        type: 'POST',
        url: {link dalsiMoznosti!},
        data: {
                'id' : 5,
                'param' : 6,
              },
        error: function(){
               alert("CHYBA");
       }
      });
    });
});
</script>

a v presenteru:

public function handleDalsiMoznosti()
    {
        if ($this->isAjax())
        {
            $pom1 = $_POST["id"];
            $pom2 = $_POST["param"];
            $this->template->mensiMoznost = "x: ".$pom1." --- ".$pom2;
			...
			...

A vyskytl se mi problém, že po kliknutí se mi sice ve snippetu proměnná mensiMoznost vypíše, jak má, ale ihned poté se zobrazí chybová hláška, že není definováno id, co si přenáším Undefined index: id na řádku, kde naplňuji $pom1… Není mi to právě moc jasné, protože ty hodnoty se přenesou a dokonce vypíšou, ale ihned vyskočí tato hláška a zajímalo by mě, čím by to mohlo být. Snažím se to už chvilku hledat, ale nedaří se mi nic najít.

Děkuji za případné rady
Marty

CZechBoY
Člen | 3608
+
0
-

Predej si to pres get, pokud muzes. Do parametru handle metody si dej $id, $param a Nette ti je tam primo preda (mozna funguje i pro post metodu).

martyk
Člen | 17
+
0
-

Díky za radu, už se zdá, že to funguje správně.

Jenom bych měl ještě jeden dotaz. Teď, když kliknu na odkaz s ajaxem, tak poprvé se provede vše správně, ale při opakovaném kliknutí vyskočí chyba, co mám v alertu.

CZechBoY
Člen | 3608
+
0
-

Nech si vypsat tu chybu…
Jaka je odpoved serveru? Nevytvori se zaznam v error/exception logu?

martyk
Člen | 17
+
0
-

Když si tam dám kód pro upřesnění chyby, tak mi to napíše ten první případ a tedy že je to není připojeno…

error: function(jqXHR, exception){
                   var msg = '';
                  if (jqXHR.status === 0) {
                      msg = 'Not connect.\n Verify Network.';
                  } else if (jqXHR.status == 404) {
                      msg = 'Requested page not found. [404]';
                  } else if (jqXHR.status == 500) {
                      msg = 'Internal Server Error [500].';
                  } else if (exception === 'parsererror') {
                      msg = 'Requested JSON parse failed.';
                  } else if (exception === 'timeout') {
                      msg = 'Time out error.';
                  } else if (exception === 'abort') {
                      msg = 'Ajax request aborted.';
                  } else {
                      msg = 'Uncaught Error.\n' + jqXHR.responseText;
                  }
                  alert(msg);
           }
F.Vesely
Člen | 368
+
+2
-

Pokud si delas vlastni ajaxove volani, tak tomu odkazu nedavej tridu ajax. Nette ajax se totiz pri init() samo navesi na click u odkazu a posle ti ajaxovy dotaz automaticky.

martyk
Člen | 17
+
0
-

Já právě nevím, jak vyřešit to, abych tím ajaxem pokaždé poslal něco jiného. Totiž to, co budu postupně vypisovat do snippetů bude ovlivňovat to, co tím ajaxem mám v plánu přidávat v dalších kliknutích.

Já totiž s ajaxem nemám moc zkušeností, kdysi jsem to zkoušel jenom čistě bez nette, ale právě teď jsem se chtěl naučit ten postup v nette a tam jsem narazil na to, že jsem nikde nenašel, jak odesílat parametry, které se budou různě měnit až po načtení stránky.

Já jsem si právě myslel, že zápis např. <a class=„ajax“ n:href=„dalsiMoznosti! $param1, $param2“> je možné udělat jenom, když ty hodnoty parametrů jsou v těch proměnných po/při generování stránky.

A tak jsem to tam chtěl dostat tím mým řešením, kde bych potom do těch parametrů poslal výsledky nějakých javascriptových funkcí, které by projely tu stránku a poslaly tam správné údaje. No a nevěděl jsem, jak výsledky takových funkcí dostat do toho zápisu ve stylu <a class=„ajax“ n:href=„dalsiMoznosti! $param1, $param2“>. Je to nějak možné?

F.Vesely
Člen | 368
+
0
-

Pokud ty parametry pocitas az nejakym JS, tak je naprosto v poradku si udelat vlastni volani ajaxu. Akorat tomu odkazu nedavej tridu ajax, jinak se ti bude volat 2×. Pokud tam tridu ajax potrebujes mit, tak si tam pridej jeste jednu tridu no-ajax treba a pridej $('a.no-ajax').netteAjaxOff();, abys zrusil automaticke odesilani ajaxu pres nette.ajax.js.

martyk
Člen | 17
+
0
-

A je možné to svoje řešení nějak navázat na ten zápis <a class=„mujajax“ n:href=„dalsiMoznosti!“> a na handle v presenteru nebo se to musí udělat celé mimo nette?

Já když to řeším v handleDalsiMoznosti(), tak se mi sice vypíše to, co má, ale pak se hned provede přesměrování na adresu mojeadresa/?do=dalsiMoznosti a obsah hlavního bloku stránky zmizí.

jiri.pudil
Nette Blogger | 1028
+
+2
-

Když si ručně navěšuješ volání na odkaz, musíš se postarat, aby se nevykonala defaultní obsluha té události, tj. přechod na cílovou adresu:

$("a.ajax").on("click", function(e) {
	e.preventDefault();
	$.nette.ajax({});
});
martyk
Člen | 17
+
0
-

Díky moc, už se zdá, že to jede. Třeba to pomůže i někomu dalšímu.