November Black Friday C/C++ week
Black Friday je tu! Využij jedinečnou příležitost a získej až 80 % znalostí navíc zdarma! Více zde
Pouze tento týden sleva až 80 % na e-learning týkající se C/C++

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

Aktivity (2)
Avatar
Jan Hlavatý
Člen
Avatar
Jan Hlavatý:21. října 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. října 13:31
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:21. října 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. října 15:28
 
Nahoru Odpovědět
21. října 15:27
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:21. října 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. října 15:30
Avatar
Jan Hlavatý
Člen
Avatar
Jan Hlavatý:21. října 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. října 15:42
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:22. října 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. října 7:52
Avatar
Jan Hlavatý
Člen
Avatar
Jan Hlavatý:23. října 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. října 13:19
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:23. října 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. října 15:48
 
Nahoru Odpovědět
23. října 15:47
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:23. října 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. října 15:59
 
Nahoru Odpovědět
23. října 15:58
Avatar
Jan Hlavatý
Člen
Avatar
Jan Hlavatý:23. října 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. října 23:25
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:24. října 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. října 7:40
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:24. října 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. října 7:54
 
Nahoru Odpovědět
24. října 7:52
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:24. října 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. října 8:01
Avatar
Jan Hlavatý
Člen
Avatar
Jan Hlavatý:24. října 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. října 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.