【问题标题】:Drupal - Issue with passing a PHP variable to JavaScript? [duplicate]Drupal - 将 PHP 变量传递给 JavaScript 的问题? [复制]
【发布时间】:2014-05-05 15:52:21
【问题描述】:

我构建了一个自定义的 google map php 文件以在我的使用 javascript 和 php 的 drupal 站点的首页中实现,并通过 template.php 文件中的drupal_add_js 调用它。我很难弄清楚如何在 javascript 中正确运行 PHP,然后将结果设置为 JavaScript 变量 markers。我试图将每个结果推送到一个数组并通过json_encode($item); 回显该数组,但是,在我的控制台中,我收到了一个错误Cannot read property 'lat' of undefined

这是我的整个 map.php:

var map = null;
var infowindow = new google.maps.InfoWindow();
var markers = [Drupal.settings.markers];

window.onload = function () {

var mapOptions = {
    center: new google.maps.LatLng(
        parseFloat(markers[0].lat),
        parseFloat(markers[0].lng)),
    zoom: 13,
    mapTypeId: google.maps.MapTypeId.ROADMAP
};
var path = new google.maps.MVCArray();
var service = new google.maps.DirectionsService();
var infoWindow = new google.maps.InfoWindow();
var map = new google.maps.Map(document.getElementById("map"), mapOptions);
var poly = new google.maps.Polyline({map: map, strokeColor: '#F3443C'});

var lat_lng = new Array();
           for (i = 0; i < markers.length; i++) {
           var data = markers[i]
           var myLatlng = new google.maps.LatLng(data.lat, data.lng);
           lat_lng.push(myLatlng);
           var marker = new google.maps.Marker({
               position: myLatlng,
               map: map,
               title: data.title
           });
           (function (marker, data) {
               google.maps.event.addListener(marker, "click", function (e) {
                   infoWindow.setContent(data.description);
                   infoWindow.open(map, marker);
               });
           })(marker, data);
       }
for (var i = 0; i < markers.length; i++) {
    if ((i + 1) < markers.length) {
        var src = new google.maps.LatLng(parseFloat(markers[i].lat), 
                                         parseFloat(markers[i].lng));
        var des = new google.maps.LatLng(parseFloat(markers[i+1].lat), 
                                         parseFloat(markers[i+1].lng));
        service.route({
            origin: src,
            destination: des,
            travelMode: google.maps.DirectionsTravelMode.DRIVING
        }, function (result, status) {
            if (status == google.maps.DirectionsStatus.OK) {
                for (var i = 0, len = result.routes[0].overview_path.length; i < len; i++) {
                    path.push(result.routes[0].overview_path[i]);
                }
                poly.setPath(path);
            }
        });
    }
}
} 

这是我的页面--front.tpl.php,我尝试创建我的 js 文件可以访问的数组:

<?php

  if (isset($_GET['routeselected'])) 
  {
  $result = mysqli_query($db, "SELECT * FROM STOP INNER JOIN RouteStop ON Stop.Stop_ID = RouteStop.Stop_ID WHERE RouteStop.Route_ID = " . (int)$_GET['routeselected'] . " AND RouteStop.Company_ID = " . (int)$_GET['companyselected']);
  $markers = array();
  while (($row = mysqli_fetch_array($result))){
      $markers[$row['title']] = array($row['Stop_ID']);
      $markers[$row['lat']] = array($row['Latitude']);
      $markers[$row['lng']] = array($row['Longitude']);
      $markers[$row['description']] = array($row['StopName']);
      }
    drupal_json_encode($markers);
    drupal_add_js(array('markers' => drupal_json_encode($markers)), 'setting');
  }
  ?>

有人可能知道我的问题的解决方案吗?感谢您的所有帮助!

【问题讨论】:

  • 谢谢,所以基本上只要像这样添加json_encode()&lt;?php echo " {\"title\": '".json_encode($row['Stop_ID']).";} ?&gt;
  • 不,在脚本/数据库操作结束之前,您不会输出任何内容。您将所有内容添加到一个数组中,最后 json_encode 该数组。

标签: javascript php google-maps drupal drupal-7


【解决方案1】:

在 javascript 文件中编写内联 PHP 代码确实是个坏主意。

解决办法是:

  • 将该 php 代码移动到模块中
  • 将 $markers 生成为 PHP 关联数组/对象
  • 使用 drupal_json_encode($markers) 将其转换为 JSON
  • 将其添加到Drupal.settings.markers 使用 drupal_add_js(array('markers' =&gt; drupal_json_encode($markers)), 'setting');
  • 在你的js中使用var markers = Drupal.settings.markers

更多详情请看这篇文章:https://drupal.org/node/756722#settings-javascript

【讨论】:

  • 感谢您的回复!如果我只在我的page--front.tpl.php 中生成$markers 会起作用吗?我试图重做我的代码,我将通过重做来改变我的问题。它仍然不起作用,我想我可能错误地填充了数组。你介意看看我的新代码吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-11
  • 2016-02-23
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
  • 1970-01-01
相关资源
最近更新 更多