Diskuze: Načtení asociativního pole a vytvoření js objektu
V předchozím kvízu, Online test znalostí JavaScript, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 13 zpráv z 13.
V předchozím kvízu, Online test znalostí JavaScript, jsme si ověřili nabyté zkušenosti z kurzu.
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
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.
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.
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.
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
}
}
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
}
?>
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
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á
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).
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);
}
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);
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.
Zobrazeno 13 zpráv z 13.