Autor Zpráva
kuba123
Profil *
Zkouším rozjet nějaký starší skript s AJAXEM. Mám tam navigaci s odkazama, na který když kliknu tak se mi načtou do formuláře data z příslušného záznamu. Ale nějak to nefunguje jak by mělo, tak zkouším firebug a dívám se na kartu síť jestli tam něco nenajdu, ale nemohu přijít na to jak vlastně zjistím jaký výstup to php-čko odeslalo, myslím tím ten soubor, který odpovídal na požadavek ajaxu. Cu musím udělat?


Už jsem to tam našel. Sice nevím co je XHR, ale našel jsem to pod kartou XHR, a po rozbalení požadavku jsem klikl na Post, Odezva nebo HTML. Ale vzpomínám si, že jsem to kdysi dělal tak, že se mi to normálně zobrazilo v okně prohlížeče a na to si teda nevzpomínám jak bych to udělal. Připomene mi to někdo?
peta
Profil
XHR = (xml) http request, ajax odesila XHR
kuba123
Profil *
Ještě dotaz na toto - zde mám řádek v ajaxu:
   $args->post['selects'] = json_decode(stripslashes($_POST['selects']));
který mi vrací chybu, že selects nebyl nastaven (přesněji Undefined index: selects). Je chyba v javascriptu? Podle css totiž používám div#select k tomu, abych identifikoval skupinu selectů ve formuláři.
Prvek na který klikám obsahuje tento javascript:
<a class="next" onclick="$.post("ax.php?action=get&next=1", { rid: $("textarea#id").val(), selects: JSON.stringify(getSelected()) } , function(result) { loadFormData(result); }, "json");;return false;" href="localhost" accesskey="w">Load next row!</a>



A část kódu v JS:

  var getSelected = function(){
     var order_columns = $("input[name=all_columns]").val();      var obj = { "order" : {} ,
                 "filter" : {} 
               };
peta
Profil
$_POST['selects'] v php
<input name='selects' value='123'> v html (nebo jiny formularovy prvek, select, radio, check, submit, hidden...)

div#select v css
<div id='select'></div> v html
select a selects je dost rozdil

js - ten kousek kodu nejspis s problemem vubec nesouvisi, tam zadny 'selects' neni

Udelej si print_r($_POST) nebo var_dump($_POST) a uvidis jake indexy jsou v poli $_POST definovane, existujici. Je mozne, ze se pokousis pracovat z promennou v $_POST, ikdyz nebyl zatim odeslany zadny formular nebo ajax post pozadavek.
kuba123
Profil *
peta:
Ale já si myslím, že právě souvisí. Podívej se na ten první kód s ajaxem, který je v tagu a. Tam je objekt, vytvořený pomocí Jquery a ten obsahuje atribut selects.

Ten atribut selects se nastavuje pomocí funkce
JSON.stringify(getSelected())

čili (domnívám se) že nejdříve getSelected() vrátí objekt ve kterém jsou obsaženy hodnoty vybraných voleb selektů. stringify to převede na JSON.

Je to už dlouho co jsem ten script psal a bylo to poprvé co jsem se zabýval AJAXEM. Tak já si myslím, že by to POST["selects"] asi mělo obsahovat ten json ... snad? Celkem by mohlo jít o 2 až 8 hodnot, protože ve formuláři mám 8 selectů.


Ten ajax požadavek jsem právě odesílal, kontroluju to přes firebug. Dostávám hlášky, že argumenty filter_1 a order_1 (to jsou označení pro ty selecty) nejsou nastavené, hlavně teda v XHR je ta informace že POST["selects"] není nastaveno


Jak bych mohl v JS ověřit jestli getSelected() něco vrací? nějaký objekt.
peta
Profil
Jo, aha, dobre. Tak ta funkce nema zadny return. Aspon ta cast, protoze podle zavorek to neni cele.
<script>
var getSelected = function()
  {
  var order_columns = $("input[name=all_columns]").val();
  var obj = 
    {
     "order" : {} ,
     "filter" : {} 
     };
  return 123;
  }    
</script>
Ja firebug nepouzivam, vystacim si s primou adresou pro to php, abych si zobrazil obsah stranky. Tim chci rici, ze jakakoliv firebug terminologie je mi sumak a vubec se v tom neorientuji.
---
Si tam dej klidne pred request nejdriv alert(getSelected()) nebo alert(getSelected().toSource()), abys videl, co ta funkce vraci, co predavas ajaxu.
kuba123
Profil *
Jo aha, tak to jsem špatně zkopíroval. Zde je celá funkce:

  var getSelected = function(){
     var order_columns = $("input[name=all_columns]").val(); // názvy sloupců získat ze skrytého pole
     var obj = { "order" : {} ,
                 "filter" : {} 
               };
   $("select option:selected").each(
      function(index, option_selected)
      {
      var select_name = $(option_selected).parent().attr("name");
      var value = $(option_selected).val();
      var col_name;
      var regex;
      var col;
      
      if (select_name.substring(0, 6) == "filter")
        {
        // zde se název sloupce musí získat z pole v $config->options, protože znám pouze číslo option
        col_name = select_name.substring(7,select_name.length);
        regex = new RegExp("[a-z]\.`"+col_name+"`","g");
        col = order_columns.match(regex);
        
        if (col) obj["filter"][select_name] = { "col": col[0], "val": value, "col_name": col_name};
        }
        else
        {
        // zde je název sloupce uložený pod hodnotou tagu option
        regex = new RegExp("[a-z]\.`"+value+"`","g");
        col = order_columns.match(regex);

        if (col) obj["order"][select_name] = { "col": col[0], "val": value, "col_name": col_name };
        }
      }
   );
   return obj;
  } 

Po paměti hádám, že obj by měl obsahovat vybrané hodnoty selektů order_1 až order_4 a filter_1 až filter_2. Ale rád bych si to nějak prohlédl a to už si nepamatuju jak se dělá.


ZNOVA!

  var getSelected = function(){
     var order_columns = $("input[name=all_columns]").val(); // názvy sloupců získat ze skrytého pole
     var obj = { "order" : {} ,
                 "filter" : {} 
               };
   $("select option:selected").each(
      function(index, option_selected)
      {
      var select_name = $(option_selected).parent().attr("name");
      var value = $(option_selected).val();
      var col_name;
      var regex;
      var col;
      
      if (select_name.substring(0, 6) == "filter")
        {
        // zde se název sloupce musí získat z pole v $config->options, protože znám pouze číslo option
        col_name = select_name.substring(7,select_name.length);
        regex = new RegExp("[a-z]\.`"+col_name+"`","g");
        col = order_columns.match(regex);
        
        if (col) obj["filter"][select_name] = { "col": col[0], "val": value, "col_name": col_name};
        }
        else
        {
        // zde je název sloupce uložený pod hodnotou tagu option
        regex = new RegExp("[a-z]\.`"+value+"`","g");
        col = order_columns.match(regex);

        if (col) obj["order"][select_name] = { "col": col[0], "val": value, "col_name": col_name };
        }
      }
   );
   return obj;
  } 



Sory že jsem to tu vložil dvakrát, já zas myslel že se to nepovedlo celé vložit...
peta
Profil
mno, a kdyz pred radek 34 vlozis
alert(getSelected());
alert(getSelected().toSource());
tak jsou v tom alertu nejaka data? A kdyz ne, tak si zjisti, ktera cast ti nefunguje (treba tez alerty, ob radek alert (1), alert(2)...)
kuba123
Profil *
peta
To nemusím zkoušet, když vím, že alert zobrazí Objekt ale žádná data. Marně se pokouším vzpomenout jak se to dělá pomocí firebugu, když chci zobrazit objekt.


Tedy vypsat strukturu objektu i s daty.
peta
Profil
kuba123: FF zobrazi objekt pomoci alert(getSelected().toSource());. Nevim, proc ti to vlastne pisi, kdyz to nechces zkouset. On se da napsat i for cyklus for (i in obj)...
kuba123
Profil *
peta:
Protože na to existuje příkaz ve firebugu přímo, zkusím zagooglovat


Už to mám
http://getfirebug.com/wiki/index.php/Console_API


Tak je to objekt který obsahuje dva atributy. Jeden je filter a druhý je order. order neobsahuje nic a filter obsahuje další poctivě vyplněné objekty... Ten JSON.Stringify(getSelected) tedy odesílá tento string:

{"order":{},"filter":{"filter_cat":{"col":"a.`cat`","val":"#","col_name":"cat"},"filter_diffHe":{"col":"a.`diffHe`","val":"#","col_name":"diffHe"},"filter_diffShe":{"col":"a.`diffShe`","val":"#","col_name":"diffShe"},"filter_g-bod":{"col":"a.`g-bod`","val":"#","col_name":"g-bod"}}}

Myslím si, že by tedy tento string měl dorazit na server. Spolu s ním je odesílán také argument RID (značí Row number) a ted tam dorazil. Tak nechápu proč string s objektem ne.

Parametry vrácené v kartě XHR - post:
filter_1 undefined
order_1 undefined
rid 1

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: