Diskuze: Prevod z vystupu php do javascriptu
V předchozím kvízu, Online test znalostí JavaScript, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 37 zpráv z 37.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí JavaScript, jsme si ověřili nabyté zkušenosti z kurzu.
Počkej počkej... Co s nima v javascriptu míníš dělat? Poslat je třeba jako parametr nějaký mapový knihovně? Něco jiného? Z tvého nejasného zadání nechápu ani ň. Zkus to upřesnit.
Kdyz to trochu rozvedu...
Mam databazi, kde mam mimo jine sloupec ulice. V php mam kod, ktery vyhledava
dle zadanych parametru a pomoci foreach nacita data:
foreach($dotaz as $n)
{...
$ulice=$n['ulice']
...}
dale pak priradim ulici souradnice (napr. if($ulice=="vodickova"){$x=1;
$y=1;}
v javascriptu pouzivam funkci google map
var x=<?php echo $x; ?>;
var y=<?php echo $y; ?>;
var citymap = {
mista: {
center: {lat: x, lng: y}
},
}
ale jak mam teda vysledek ulozit do poli a nasledne prenest do javascriptu,
aby to fungovalo, pripadne jak ve skriptu docilit, aby se v pripade vice
vysledku pripocitavaly a jmenovaly napr. mista1, mista2... ?
Dostal jsem radu pouzit json_encode ale tomu bohuzel nerozumim vubec a jsem
bezradnej :/
Jeste zjednodusim dotaz... Potreboval bych, aby se mi ulice nactene z databaze, kterym v php pridelim souradnice, zobrazovaly na strance s mapou jako body (nebo kruznice) v teto mape.
Dobre tedy, myslim, ze mam predstavu - po jednom to tam prece pridavat nebudes zejo, takze bych doporucil v phpcku nejdriv udelat asociativni pole, do ktereho nasekas vsechny adresy, polohy, nebo jak tomu rikas ... rozumis mi ... proste si udelas v nejakem tom svem cyklu zapis do phpckoveho pole. Neco jako:
$array = array(
0 => array($ulice1, $x, $y),
1 => array($ulice2, $x, $y)
);
Jde o to, ze tohle pole projedes json_encode
$out = json_encode($array);
a takhle to vyprintis do javascriptovyho zdrojaku do nejakyho svyho pole
var poleAdres=<?php echo $out; ?>;
Ted bys mel mit v poleAdres klasicky javascriptovy pole poli, muzes ho projet po indexu v cyklu atd ... prvni polozka vnitrniho pole bude treba nazev ulice, druha a treti souradnice ... ted uz by nemel byt problem pouzit cyklus a pracovat s datama... zkus to a rekni mi, nakolik nejsem phpckar a tohle jsem bastlil pomoci phpfidlu a jsfidlu tak si nejsem 100% jistej... ale rozhodne me zajima jestli to pobezi, pripadne co to bude kricet za chyby..
Jo super, diky. Pole v php jsem vytvoril
$pole=array('ulice' => $ulice, 'x' =>$x, 'y'=>$y);
pro kontrolu (stale v cyklu foreach)
$ar=$pole['ulice'];
$x=$pole['x'];
$y=$pole['y'];
echo $ar." ".$x." ".$y."<br>";
Vsechno se v poradku vypsalo, takze v php funguje! A uz jenom
$out = json_encode($pole);
Tady moje mysleni opet vynechava... Nevim, jak javascriptu vysvetlit, ze z prenesenym polem (nebo je to objekt?) chci pracovat. Kdyz pouziju tvoje
var poleAdres=<?php echo $out; ?>;
, a pak se snazim vyvolat hodnotu nejakeho pole, nefunguje... Zkousel jsem i
for (var vypis in poleAdres) ...
, to jsem to nedal dohromady. Nevim, jak k datum prenesenym z php pristoupit a nasledne s nema pracovat
a jenom jeste... v javascriptu by asi melo bejt taky json_encode($out)?
var poloha=<?php echo json_encode($out); ?>;
Postupně, Filipe myslím, že jsi neudělal přesně to co jsem psal, důležité je to pole v phpcku dělat na indexy, koukni jak jsem to psal já a jak jsi ho postavil ty, tvarem se zásadně liší, proto se pak převádí na objekt, který není iterovatelný. Porovnej si tohle:
<?php
$one = 0;
$array = array(
0 => array("ulice1", 43, 12),
1 => array("ulice2", 23, 42)
);
$pole=array('ulice' => "Konvarkova", 'x' =>23, 'y'=>43);
$pole=array('ulice' => "Vesela", 'x' =>12, 'y'=>42);
echo json_encode($pole);
echo json_encode($array);
?>
tady: http://phpfiddle.org/ a uvidis ze tobe z toho vznikne objekt, kdezto me pole poli...na snadnou iteraci, na vyvolavani obsahu bez znalosti konkretnich nazvu ulic chces pole.
EDIT: (protoze limit na editaci je az prilis kratkej)
Dodatek ->
Ohledne JS, ty mu nemusis rikat vubec nic, on samozrejme chape, ze kdyz si neco ukladas do pole/objektu/promenne budes s tim pak chtit pracovat, jak pracovat, zalezi podle toho co si vyberes, zvol si pole poli, bude to bolet nejmin.
K tvemu druhemu dotazu, ne zadny json_encode znova, musis se poradne podivat, a uvidis ze $out je vystupem json_encode($array) ... znova to neencoduj, to pokazis ... nejsem machr na php, takze ti nepovim, jak do pole o tvaru, ktery jsem uvedl pridavat obsah ve foru, ale mam podezreni, ze kdyz se to asociuje na indexy, tak je to v podstate klasicky pole, takze pokud si nejsi jistej tim, jak na to, proste udelej pole, v for cyklu na tvejch datech do nej proste pridavej dalsi pole, ktery budou obsahovat jen tri hodnoty, nevaz nic na ulici jako jsi to udelal ted. Kdyztak se ozvi.
Myslim ze ted uz jsem pochopil co si mi chtel rict... Vyzkousim a pak dam vedet zatim diky
Tak jsem s tim stravil hromadu casu a nedam to dohromady... Jednak nevim, jak porovnat hodnoty, ktery se mi vratej z databaze s tim, co si ulozim v poli.A neumim pracovat v javascriptu s tema polema a uz jsem z toho tak zblblej ze tomu vubec nerozumim pouziju
$array=array(
0=>array("na padesatem",50.068385,14.507787),
1=>array("mezibranska",50.079519,14.430214),
2=>array("krizikova",50.09093,14.439565)
);
echo json_encode($array);
$out = json_encode($array);
php mi vypise
[["na
padesatem",50.068385,14.507787],["mezibranska",50.079519,14.430214],["krizikova",50.09093,14.439565]]
coz jsem pochopil jako ze v poli $array jsou ulozeny 3 dalsi pole
(ulice,souradnice x, souradnice y)
ale co s tim dal vubec netusim.
Priklad v google mapach, jak se vkladaji nove pozice, je nasledujici:
var citymap = {
chicago: {
center: {lat: 41.878, lng: -87.629},
},
newyork: {
center: {lat: 40.714, lng: -74.005},
}
Ale jak dat misto pevnych hodnot promenne? Zkousel jsem to pres cyklus for ale bud jsem to nastavil spatne nebo je to spatne cely:
var poleAdres=<?php echo $out; ?>
for(i=0;i<poleAdres.length;i++)
{
misto:
{ center: {lat: poleAdres[i][1], lng: poleAdres[i][2] }
}
}
Neee .. je to super ... dostal jsi se sam opravdu daleko ... jen ten zaver nebyl uplne jistej, ale to nevadi
var poleAdres=<?php echo $out; ?>
var cityMap = {};
for(i = 0; i < poleAdres.length; i++) {
cityMap.poleAdres[i][0] : {center: {flat: poleAdres[i][1], lng: poleAdres[i][2]}}
}
Zkus tohle. Pokusil jsem se napodobit to cos ukazal v tom google map api... mas objekt cityMap a v nem jsou jendotlive property podle nazvu ulice, kazda ulice je tedy take objektem, obsahuje property center i to je objektem, obsahuje souradnice... dej vedet jak to nebezi/bezi
Omlouvam se vloudila se mi tam chybka, takhle
var poleAdres=<?php echo $out; ?>
var cityMap = {};
for(i = 0; i < poleAdres.length; i++) {
cityMap.poleAdres[i][0] = {center: {flat: poleAdres[i][1], lng: poleAdres[i][2]}}
}
napsal jsem to jak si radil, trochu upravil
var cityMap = {
for(i = 0; i < poleAdres.length; i++) {
cityMap.poleAdres[i][0] = {center: {lat: poleAdres[i][1], lng: poleAdres[i][2]}, }
}
Nastal horsi problem... Hlasi mi to chybu:
Chyba: InvalidValueError: initMap is not a function
Pro inicializaci mapy mam kod hned pod timhle a kdyz mam pevne souradnice, vse
funguje, jak ma, kdyz vlozim cyklus tak je to v haji.
function initMap() {
// Create the map.
var map = new google.maps.Map(document.getElementById('map'), {
zoom: 4,
center: {lat: 37.090, lng: -95.712},
mapTypeId: google.maps.MapTypeId.TERRAIN
});
Tomuhle vubec nerozumim
Tak tohle ti snadno vysvetlim, tou tvou "upravou" jsi umistil cyklus do objektu, coz je jednak velkej nesmysl, druhak jsi ten objekt neuzavrel, takze pouzij presne to co jsem ti napsal v opravenem komentari. Jednak ti taky poradim jeden dulezitej krok -> kdyz mas nekde kod, ktery ti nekdo poradi, nebo ho najdes, nejdriv vyzkousej ten kos, kdyz bude fungovat upravuj si ho podle libosti, ale kdyz nebude budes mit aspon jistotu, ze ti to dotycnej poradil spatne. Pomohlo by to i me, vedel bych ted, jeslti je to v poradku, nebo ne. Zkus ten neupravenej ode me a napis.
BTW: chyba teda vzynikla proto, ze mas ve scriptu syntaktickou chybu... neuzavrenej objekt distribuuje svuj rozsah az do funkce atd...nemuzes ji pak zavolat, protoze se to zkratka cely zhroutilo. A jeste neco
cityMap.poleAdres[i][0] = {center: {lat: poleAdres[i][1], lng: poleAdres[i][2]}, }
ta carka mezi poslednima dvema zavorkama tam nema co delat... pravdepodobne ti to nic neudela ale strict mode te za to poradne zerve a nespusti ti to
Tak jsem to trochu rozebiral a nasel jsem si jeste jeden nesmysl, ktery jsem ti poradil, doufam, ze me omluvis, pracuju pri tom na domacim ukolu a spatne se soustredim... takze takhle:
var poleAdres=<?php echo $out; ?>
var cityMap = {};
for(i = 0; i < poleAdres.length; i++) {
cityMap[poleAdres[i][0]] = {center: {flat: poleAdres[i][1], lng: poleAdres[i][2]}}
}
Ja samozrejme zkusil nejdriv to, co si mi napsal, ale to nefungovalo, tak
jsem zkousel ruzny dalsi varianty, jen jsem to tu zapomnel napsat. To se
omlouvam. Nicmene ani ten kod, co si ted mi poradil, nechce fungovat, hlasi to
zase tu stejnou chybu.
Kdyz smazu cely var cityMap (var cityMap+cyklus nebo pevne definovana
mista primo ve skriptu), zahlasi mi to chybu, ze obekt cityMap neni definovan,
ale mapa samotna se do stranky nacte. A po pridani cyklu to zahlasi Chyba:
InvalidValueError: initMap is not a function a mapa se ani nenacte.
zkousel jsem ten kod jeste projet na jslint.com a hlasi mi to unecpected "<" u var poleAdres. Nemuze to bejt treba jinej zapis, jak se to vklada? Jen me to napadlo...
To je to phpcko co mu vadí, to neotestuješ. Podle mě pokud to říká že funkce pod tím není funkce, měl bys otestovat jestli všechno nad tím v pořádku funguje, takže pod ten for cyklus dej řádky
console.log(poleAdres);
console.log(cityMap);
Otestuj to v prohlížeči, otevření nástrojů pro debuging se provede F12 a pak klikni na console, konzole nebo tak... Po kliknuti na slovo object v konzoli, bys mel mít možnost si prohlídnout jestli to pole a ten objekt mají správný obsah a tvar, pokud je to tam ani nezobrazí a vypíše to třeba chybu, nebo ani tu ne ... Bude tam syntaktická chyba .... Pak kliknes místo na konzole v tom panelu na debuger, najdeš script a místo v něm, o kterém mluvíme a kouknes se jestli vypadá tak jak má, pokud si nebudeš jistej, zkopirujes celou tu část i s initmap funkcí (aspoň začátek) a pošleš mi to sem.
PS: za to, že to ti nefungovalo můžu já, nebyla to vůbec tvoje chyba, mě šlo jen o to, že jsem si nebyl jistý, jestli jsi to upravoval až po tom co to nefungovalo, nebo hned, teď je mi to jasný, tak v pohodě.
Jo ještě mě napadlo, ten první řádek console.log vlož ještě před ten for cyklus ten druhý dej pod for cyklus ...tak to bude vidět líp... Kdybys to třeba měl někde online tak bych se podíval, ale to asi nemáš co ?
hele tak vypisy z chyb rikaji jasne :
var poleAdres=<?php echo $out; ?>
sem pridej strednik za to php inline
var poleAdres=<?php echo $out; ?>;
javascript potrebuje za prikazama strednik, pokud za nim nedas enter
pridej mi to i do toho webu abych se mohl dal divat
a rovnou zmen vsechny promenny cityMap, ktery mas takhle pojmenovany v souvislosti se mnou na citymap ... ta init funkce pocita s timhle nazvem, to mi asi nejak uniklo... informacni sum nebo co
tak jsem vse provedl a mapa se nacetla, mista se mi tam nezobrazujou. Hlasi
to nejakou chybu* setCenter: not a LatLng or LatLngLiteral: in property lat: not
a number*
je to tam aktualizovany vcetne zdr. kodu tak se muzes podivat, tohle jde opravdu
mimo me :/
ode me tam mas misto lat napsano flat... nevim proc jsem to tak prepsal... vcera jsem byl hlavou nekde jinde..takze oprav to v tom cyklu... flat -> lat
ja to zkousim u sebe na kompu a cela mapa je cervena..
ale jdi.... mel jsi nekolik velmi dobrejch tahu na branku a ja genialni jiste nejsem (ne ze bych nechtel ) nicmene me tesi, ze jsme se k vysledku zdarne dopracovali.
Je pravda, ze mam minimum zkusenosti. Ale chybama se clovek uci Jeste bych mozna potreboval radu, jestli budes vedet a mit cas, i kdyz se jedna o php. Potrebuju, aby se mi ty souradnice samy generovaly do toho skriptu. Z databaze pres cyklus foreach ziskam vsechny ulice odpovidajici dotazu, a ty ukladam do promenne $ulice. V cyklu foreach pak vlozim kod:
for ($i=0;$i<$limit;$i++) {
if ($ulice=="masarykovo nadr.") $array=array($i=>array($ulice.$i, 50.087755, 14.433556));
else if ($ulice=="florenc") $array=array($i=>array($ulice.$i, 50.090931, 14.439565));
}
Jeste v cyklu foreach dam
echo json_encode($array);
stranka vypise (obrazek) coz je v poradku. Jen nevim co znamena ta jednicka v uvozovkach a hlavne to do ty mapy nefunguje. Nevedel bys nahodou, co s tim?
tohle je priklad, kterej jsem vydedukoval ... funguje to, tak to snad je spravne :
<?php
$array = array();
for($i = 0; $i < 10; $i++) {
$array[$i] = array("ulice1".$i, 1+$i, 100+$i);
}
echo json_encode($array)
?>
Priklad ukazuje, ze nejdriv si vytvorim pole, pak vezmu for cyklus ... a podle indexu do polozek v tom poli pridavam vlastne jen dalsi pole (jsou to pole uvnitr velkeho pole) .. dovnitr cyklu si dej tu svoji podminku, netusim presne co ta podminka, kterou jsi ukazal ma delat, tak to necham asi na tobe... json_encode volej az nakonec (mimo cyklus), kdyz je cely pole hotovy, jinak si to rozbijes ... ja jsem jako ulice a souradnice pouzil jen testovaci data, abych videl, ze mi to pekne roste a jsou tam vsechna v poradku vlozena, ty si do toho nacpi co potrebujes, ale drz se systemu, ulice, souradnice, souradnice ... aby ti pak fungoval ten javascript... kdyz tohle pak encodnuty echnes do javascriptu a das si pozor abys za tim mel ten strednik (jak jsem rikal nahore) tak by to melo fungovat...
Jasne, tvuj for funguje... Ja jsem se ted dost zamotal, zkusim popsat
postupne souvislosti:
Mam promennou $sql, ktera mi vraci vysledky z dotazu do databaze (jmena ulic z
databaze). Pouziju
foreach ($sql as $n)
$ulice=$n[ulice] //priradim promennou ulice pro jednotlive polozky
Pro podminku for jsem si vytvoril $limit, coz je pocet vysledku (cislo)
vracenych z databaze.
Dale potrebuju priradit jednotlivym promennym $ulice souradnice $x a $y. To
resim nasledovne, i kdyz tady uz nevim, kam to soupnout (momentalne to mam v
cyklu for, zkousel jsem i pred nej):
if ($ulice=="masarykovo nadr.") {$x=50.087755; $y=14.433556;}
else if ($ulice=="florenc") {$x=50.090931; $y=14.439565;}
a nasledne pouziju cyklus for pro ulozeni do poli:
for($i = 0; $i < $limit; $i++) {
$array[$i] = array($ulice.$i, $x, $y);
}
To vsechno se stale odehrava v cyklu foreach,kdyz cyklus for dam za foreach,
vysledek je stejny.
Kdyz dam echo $ulice, vypise se florenc, masarykovo nadr., coz je v poradku (z
databaze se vytahly spravne vysledky). Pak dam
echo json_encode($array);
a vyjede mi (obrazek). To znamena, ze zaznam masarykovo nadr. se do pole ulozil 2x a zaznam florenc ani jednou. Oboje prirazene souradnice samozrejme patri masarykove nadr. Vysledek ma byt 1:1.Chapu to, ze se do pole nacita pouze posledni nactena polozka z databaze, coz se opakuje ale neprojede mi to kazdou polozku ziskanou z databaze. Snad jsem to napsal aspon trosku srozumitelne
myslim ze rozumim...takze jen pseudokodem:
poleProJavascript = new array();
iterovaciPromenna = 0;
foreach na sql { // tahle zavorka je dulezita, jestli ji tam nemas, asi by tam
mela byt
$ulice=$n[ulice] //priradim promennou ulice pro jednotlive polozky // to je
myslim v poradku
... // dalsi nejakej tvuj kod, predpokladam, ze limit musis spocitat uz pred
foreachem
... // tvoje podminky
poleProJavascript[iterovaciPromenna] = array($ulice, $x, $y); // tady to .$i
nemelo co delat, to bylo jen pro nas
} // konec foreache
tady json_encode pole
preved to peclive z tehle uvahy do kodu, kdyz to stale nebude delat co bys chtel tak sem hod kod v kompletni podobe (vsechno co muzes, presneji receno co je pro nas dulezite... stacita cast o ktere se bavime)
asi jsem te ted spravne nepochopil... Udelal jsem:
$array = array();
$i=0;
foreach ($sql as $n)
{
$ulice=$n[ulice]
if ($ulice=="masarykovo nadr.") {$x=50.087755; $y=14.433556;}
else if ($ulice=="florenc") {$x=50.090931; $y=14.439565;}
$array[$i] = array($ulice, $x, $y);
}
echo json_encode($array); // vypise opet pouze [[masarykovo nadr., 50.087755, 14.433556]] - posledni nactenou polozku
$out = json_encode($array);
¨
takze v poli mam jen jeden udaj
na konci cyklu, pred vlasatou zavorkou co ho uzavira musis icko inkrementovat $i++
Zobrazeno 37 zpráv z 37.