#javascript #php #symfony #twig
#javascript #php #symfony #twig
Вопрос:
У меня есть этот код для отображения точек на карте Google, который я просто не могу заставить работать, когда я передаю информацию из моего PHP в мой шаблон Twig. Однако это прекрасно работает с массивом непосредственно в javascript. Пожалуйста, можете где-нибудь избавить меня от дергания за волосы и помочь мне.
PHP-код:
// Create a list of items return from SQL
foreach ($mapdetails as $mapdetail){
if($locations!='') $locations.=',';
$locations.='[
"'.$mapdetail['venue'].'"
,"'.$mapdetail['lat'].'"
,"'.$mapdetail['lng'].'"
]';
}
// set template variables amp; render template
echo $template->render(array (
'pageTitle' => 'Map Locations',
'locations' => $locations
));
повторение $locations возвращает это:
[ «Место проведения 1″,»53.301624″ ,»-1.923434″ ],[ » Местопроведения 2″ ,»53.160526″ ,»-1.996968″ ]
ФРАГМЕНТ JAVASCRIPT:
Когда я использую эту строку в шаблоне, это не работает
var all = '[{{locations|json_encode()|raw}}]';
Когда я использую эту строку, она действительно работает
var all = [[ "Venue 1" ,"53.301624" ,"-1.923434" ],[ "Venue 2","53.160526" ,"-1.996968"]];
ПОЛНЫЙ JAVASCRIPT
<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=true"></script>
<script>
// Set the Map variable
var map;
function initialize(){
var myOptions ={
zoom: 9,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
ЭТО НЕ РАБОТАЕТ, когда заменяется приведенной ниже строкой, которую оно выполняет
var all = '[{{locations|json_encode()|raw}}]';
ЭТО ДЕЙСТВИТЕЛЬНО РАБОТАЕТ
var all = [[ "Venue 1" ,"53.301624" ,"-1.923434" ],[ "Venue 2","53.160526" ,"-1.996968"]];
console.log(all);
var infoWindow = new google.maps.InfoWindow;
map = new google.maps.Map(document.getElementById('map_canvas'), myOptions);
// Set the center of the map
var pos = new google.maps.LatLng(53.25,-1.91);
map.setCenter(pos);
function infoCallback(infowindow, marker) {
return function() {
infowindow.open(map, marker);
};
}
function setMarkers(map, all) {
for (var i in all) {
var venue = all[i][0];
var lat = all[i][1];
var lng = all[i][2];
var latlngset;
latlngset = new google.maps.LatLng(lat, lng);
console.log(venue);
console.log(lat);
var marker = new google.maps.Marker({
map: map, title: city, position: latlngset
});
var content = '';
var infowindow = new google.maps.InfoWindow();
infowindow.setContent(content);
google.maps.event.addListener(
marker,
'click',
infoCallback(infowindow, marker)
);
}
}
// Set all markers in the all variable
setMarkers(map, all);
};
// Initializes the Google Map
google.maps.event.addDomListener(window, 'load', initialize);
</script>
</head>
<body>
<div id="map_canvas" style="height: 500px; width: 800px;"></div>
</body>
</html>
Пожалуйста, любая помощь….
Ответ №1:
Проблема в том, что вы создаете строку PHP:
'[ "Venue 1","53.301624" ,"-1.923434" ],[ "Venue 2" ,"53.160526" ,"-1.996968" ]'
которые вы являетесь json_encoding (с добавлением кавычек и прочего для загрузки):
var all = '[{{locations|json_encode()|raw}}]';
Результатом чего является что-то вроде этого, представляющее собой перепутанную строку Javascript, а не объект:
var all = '["[ "Venue 1","53.301624"..."]';
Это и близко не то, что вы хотите. Вы просто хотите иметь PHP-массив, который затем вы json_encode:
$locations = array_map(function (array $mapdetail) {
return array($mapdetail['venue'], $mapdetail['lat'], $mapdetail['lng']);
}, $mapdetails);
В шаблоне:
var all = {{ locations|json_encode|raw }};
Результат выглядит следующим образом:
var all = [["Venue 1","53.301624","-1.923434" ],["Venue 2","53.160526","-1.996968"]];
который представляет собой массив массивов Javascript. Это так просто.
Комментарии:
1. Большое вам спасибо, единственная проблема, с которой я сталкиваюсь сейчас, заключается в том, что на карте отображается только 1 местоположение. При выгрузке $ locations я получаю: Array ([0] => Array ( [0] => Место проведения 1 [1] => 53.301624 [2] => -1.923434 ) [1] => Массив ( [0] => Место проведения 2 [1] => 53.160526 [2] => -1.996968 ) ) Я думаю, что javascript неправильно обрабатывает каждый элемент массива, мысли??
2. Извините, теперь разобрал. Искренне благодарю вас за это простое решение проблемы, которая сводила меня с ума.