Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Načtení asociativního pole a vytvoření js objektu

Aktivity
Avatar
Jan Hlavatý
Člen
Avatar
Jan Hlavatý:21.10.2019 13:31

Ahoj, php script mi vytvoří asociativní pole a ajaxem ho chci načíst. Výsledek je vždy 0. Pravděpodobně mám někde chybu v převodu json. Poradí mi někdo?

Zkusil jsem: php:

$pole=array("aa"=>1,"bb"=>2); //to je pouze příklad, ale i s tím to nefunguje
        return json_encode($pole);

js:

$.ajax(
                {
                    url:"<?php echo admin_url('admin-ajax.php'); ?>",
                    type:"POST",
                    dataType: 'json',
                    data: {action:"rn_recalc","args":param_args,},
                        success: function(response) {
                        var rn_pole_counts = JSON.parse(response);

                        console.log(rn_pole_counts);
                    }
            });

K doplnění, jde o wordpress a konzole žádnou chybu nehází.

Chci docílit: Je to součást vyhledávání.

 
Odpovědět
21.10.2019 13:31
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:21.10.2019 15:27

Zkus si googlem najit priklad
google = php jquery ajax example

To jsou nejake stripky kodu, z toho nelze odvodit, kde je problem.
Vidim tam treba return a tukam si na celo, proc nepouzil echo? Pak se zamyslim, treba to ma obalene ve funkci, kterou sem ale lajdak darebak nedal!
Nevim. Zkus misto ajaxu zavolat primo tu url, co ti to vypise na obrazovku. Rekl bych ti jakou, ale neznam vysledky funkci a hodnoty promenych

admin_url('admin-ajax.php')
param_args
// Adresa by mohla byt, i bez arg
admin-ajax.php?action=rn_recalc&args=
neco/admin-ajax.php?action=rn_recalc&args=neco
admin/admin-ajax.php?action=rn_recalc&args=neco
admin-ajax.php // teoreticky by mohlo stacit tohle
Editováno 21.10.2019 15:28
 
Nahoru Odpovědět
21.10.2019 15:27
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:21.10.2019 15:30

url:"<?php echo admin_url('admin-ajax.php'); ?>",
Jinak, tohle je dost nespolehlivy zapis. admin_url by musela splnovat nekolik podminek pro escapovani, jinak by to mohlo rozhodit html, js kod. Napr nesmi mit znaky " a \ a nejake dalsi.

 
Nahoru Odpovědět
21.10.2019 15:30
Avatar
Jan Hlavatý
Člen
Avatar
Jan Hlavatý:21.10.2019 15:42

Díky za reakci. Je to na wordpressu, takže ajax musím řešit přes jejich funkci (admin-ajax.php). Potřebuju vrátit jen to pole jako proměnou, pokud dám print_r a příslušně upravím ajax, tak se mi vše zobrazí správně. Problém je dostat to php pole do js objektu.

 
Nahoru Odpovědět
21.10.2019 15:42
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:22.10.2019 7:52

Pak je php ok, kdyz se to dobre zobrazi. Kazdopadne to return tam bez dalsiho kodu nedava smysl, protoze echo posila data uzivateli.
Je mozne, ze kdyz mu tam das type=json, ze on sam udela JSON.parse, takze, ty to pak delas duplicitne.
Ja jquery ajax nepouzivam, ale zkopiroval bych si priklad z dokumentace. Fakt bych zacal nejakym funkcnim prikladem a ne pokusem z hlavy.

 
Nahoru Odpovědět
22.10.2019 7:52
Avatar
Jan Hlavatý
Člen
Avatar
Jan Hlavatý:23.10.2019 13:19

Dospěl jsem k funkčnímu řešení, ale že bych všemu rozuměl...

php:

echo json_encode($rn_pole); //asociativní pole

js:

$.ajax(
                {
                    url:"<?php echo admin_url('admin-ajax.php'); ?>",
                    type:"POST",
                    data: {action:"rn_recalc","args":param_args},
                    success: function(response) {
                    var rn_result=$.parseJSON(response.slice(0, -1)); // z nějakého důvodu to vrací na konci řetězce 0, která pak vyhodí chybu....takže jsem jí natvrdo vymazal
                    var rn_keys=Object.keys(rn_result); //načtu klíče objektu kvůli iteraci
                    for(i=0;i<rn_keys.length;i++ ){
                        $('#rn_count_item_'+rn_keys[i]).text(rn_result[rn_keys[i]]); // tady si změním hodnoty jak chci

                    }
                }
 
Nahoru Odpovědět
23.10.2019 13:19
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:23.10.2019 15:47

To mas v php asi nejaky error. Zkus si zobrazit jen tu adresu, php soubor v prohlizeci. Tam musi byt ta nula taky.
Na testy musis mit jednoduchy priklad, ktery se da copy-paste a spustit. Dal jsem si tu praci a mne to normalne funguje, ve firefoxu.

<?php
// http://localhost/jquery/test.php
if (isset($_GET['action']))
        {
        $pole = array("aa"=>1, "bb"=>2);
        echo json_encode($pole); //asociativní pole
        }
else
        {
?>
<input type=button onclick="odesli()" value="odesli">
<div id=out></div>
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script>
function odesli()
        {
        // https://api.jquery.com/jquery.ajax/
        $.ajax({
                url    : "test.php",
                data   : {action: "rn_recalc", args: "param_args"},
                type   : "GET",
                success: prijmi
                });
        }

function prijmi(response)
        {
        var el, json;
        el = document.getElementById('out');
        el.innerHTML += response;

        json = $.parseJSON(response);
        key_list = Object.keys(json);
        for(i=0;i<key_list.length;i++)  // tady se da pouzit: for (i in json)
                {
                el.innerHTML += '<br>' + key_list[i] + ': ' + json[key_list[i]];
                }
        }
</script>
<?php
        }
?>
Editováno 23.10.2019 15:48
 
Nahoru Odpovědět
23.10.2019 15:47
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:23.10.2019 15:58

Jestli ten vypis mas soucasti dalsiho kodu a nechce se ti hledat, kde mas chyba, dala by se pouzit finticka s ob, kterou pouzivam pro download souboru. Z toho celeho te zajima jen ob, echo, exit. To ostatni souvisis s download, nastaveni hlavicek.

ob_clean(); // smaza obrazovku
header('Content-Description: File Transfer');
header('Content-Transfer-Encoding: binary');
header('Content-Encoding: '.$charset);
header('Content-Type: '.$type.'; charset='.$charset);
header('Content-Disposition: attachment; filename="'.$file.'"');
header('Content-Length: '.$size);
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
//header("Cache-Control: no-store, no-cache");
header('Pragma: public');
header('Expires: 0');
echo $content;
exit(); // ukonci script
Editováno 23.10.2019 15:59
 
Nahoru Odpovědět
23.10.2019 15:58
Avatar
Jan Hlavatý
Člen
Avatar
Jan Hlavatý:23.10.2019 23:25

Já tam prostě žádnou chybu nevidím...
tohle je php, který tvoří to pole:

$rn_maker_counts=array('xxx' => count_post_by_key_and_category($param_args['key'],$param_args['cat'],$param_args['typ'],$param_args['stav'],$param_args['lokalita'],$param_args['cena_min'],$param_args['cena_max'],'x'));
        $rn_maker=get_terms( array(
                'taxonomy' => 'maker',
                'fields' => 'ids',
                'hide_empty'=>0
        ) );
        for($i=0;$i<count($rn_maker);$i++){
                $rn_cat_count=count_post_by_key_and_category($param_args['key'],$param_args['cat'],$param_args['typ'],$param_args['stav'],$param_args['lokalita'],$param_args['cena_min'],$param_args['cena_max'],$rn_maker[$i]);
                $rn_maker_counts += [ $rn_maker[$i] => $rn_cat_count ];
        }
        $rn_pole=$rn_cat_counts+$rn_stav_counts+$rn_lok_counts+$rn_maker_counts; //ty tři pole předtím mají totožný kod

        echo json_encode($rn_pole);

a výstup bez slice:

...."199":0,"200":0,"201":0,"202":0,"203":0}0

fakt netuším co mi tam tu nulu přidává

 
Nahoru Odpovědět
23.10.2019 23:25
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:24.10.2019 7:40

A muj kod ti tam nulu nedava?
Pak je samozrejme rozdil mezi mym a tvym kodem. Hledej. Pred a za php tagy take nesmi bych zadny vypis.

neco-mezera-prazdny-radek<?
?>neco-mezera-prazdny-radek

Zkus ten ob_clean (smaze vse pred) a exit (ukonci program, takze smaze vse za).

 
Nahoru Odpovědět
24.10.2019 7:40
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:24.10.2019 7:52

Zkus ty vardumpy. Bud selze nektera z tech funkci, u kterych nevim, jaky maji kod a jake davaji vysledky v pripade, ze treba najde 0 vysledku. A nebo tam mas dalsi php/html kod, ktery si tam vypisuje neco navic. Dopsal jsem tam komentare, kde by mne zajimaly vysledky, abych tu cast mohl zakomentovat a nahradit vysledkem pro ten muj tester. Kdo vi, treba tam fakt vznikne neco necekaneho.

if (isset($_GET['action']))
        {
//      $pole = array("aa"=>1, "bb"=>2);
//      echo json_encode($pole); //asociativní pole

        $rn_maker_counts = array(
                'xxx' => count_post_by_key_and_category(        // jaky je vysledek funkce?
                        $param_args['key'],
                        $param_args['cat'],
                        $param_args['typ'],
                        $param_args['stav'],
                        $param_args['lokalita'],
                        $param_args['cena_min'],
                        $param_args['cena_max'],
                        'x'
                        )
                );
        // var_dump($rn_maker_counts);
        $rn_maker = get_terms( array(   // jaky je vysledek funkce?
                'taxonomy'   => 'maker',
                'fields'     => 'ids',
                'hide_empty' => 0
                ));
        // var_dump($rn_maker);
        for($i=0; $i<count($rn_maker); $i++)
                {
                $rn_cat_count = count_post_by_key_and_category( // jaky je vysledek funkce?
                        $param_args['key'],
                        $param_args['cat'],
                        $param_args['typ'],
                        $param_args['stav'],
                        $param_args['lokalita'],
                        $param_args['cena_min'],
                        $param_args['cena_max'],
                        $rn_maker[$i]
                        );
                // var_dump($rn_cat_count);
                $rn_maker_counts += array( $rn_maker[$i] => $rn_cat_count );    // tady bych pouzil array, [] funguje az v novych php
                // var_dump($rn_maker_counts);
                }
        $rn_pole = $rn_cat_counts + $rn_stav_counts + $rn_lok_counts + $rn_maker_counts;
        //var_dump($rn_cat_counts, $rn_stav_counts, $rn_lok_counts, $rn_maker_counts);
        echo json_encode($rn_pole);
        }
Editováno 24.10.2019 7:54
 
Nahoru Odpovědět
24.10.2019 7:52
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:24.10.2019 8:01

Jeste tohle by mohlo byt problematicke. Nevim, jak moc je spolehlive scitani poli. Nebo, pokud je predchozi hodnota 0 a ne pole.

//$rn_maker_counts += array( $rn_maker[$i] => $rn_cat_count );

$rn_maker_counts = array('a'=>'b');
var_dump($rn_maker_counts);
$rn_maker_counts = array('a'=>'b') + array('c'=>'d')
var_dump($rn_maker_counts);
$rn_maker_counts = array('a'=>'b');
$rn_maker_counts['c'] = 'd';
var_dump($rn_maker_counts);
$rn_maker_counts = 0 + array('c'=>'d')
var_dump($rn_maker_counts);
$rn_maker_counts = '' + array('c'=>'d')
var_dump($rn_maker_counts);
$rn_maker_counts = false + array('c'=>'d')
var_dump($rn_maker_counts);
 
Nahoru Odpovědět
24.10.2019 8:01
Avatar
Jan Hlavatý
Člen
Avatar
Jan Hlavatý:24.10.2019 14:31

Tak chybka byla v tom, že wordpress (ta třída admin-ajax.php) vyžaduje ukončení php části die(). To že to tam nebylo přidávalo tu nulu. Díky moc za tvůj čas a rady.

 
Nahoru Odpovědět
24.10.2019 14:31
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 13 zpráv z 13.