通过PHP形式传递JavaScript和PHP变量

问题描述:

一直在寻找一整天,找到的项目相似,但完全被卡住......通过PHP形式传递JavaScript和PHP变量

我想谷歌地图自动完成结果(经纬度)传递到一个PHP形式通过PHP变量一起一个提交(未两个按钮,即,把变量JS中隐藏的字段然后经由提交按钮提交表格)

代码目前:

<?php  

if (isset($_POST['submit'])) {  
    // echo vars if they are working... 
    echo "passed data <br>"; 
    echo $_POST['first_name'] . "<br>"; 
    echo $_POST['geocode'] . "<br>";  

    // Get variables, check data and store into DB...  
}  

?> 

然后:

<script type="text/javascript"> 

    var geocoder; 

    function initialize() { 

    // Search options 
    var searchOptions = { 
     componentRestrictions : {country: 'nz'}, 
     types: ['geocode'] 
    }; 

    var input = document.getElementById('pac-input'); 

    var autocomplete = new google.maps.places.Autocomplete(input, searchOptions); 

    geocoder = new google.maps.Geocoder(); 

    } 

    function codeAddress() { 

    var address = document.getElementById('pac-input').value; 

    geocoder.geocode({ 'address': address}, function(results, status) {  
     if (status == google.maps.GeocoderStatus.OK) {   
     document.getElementById('geocode').value = (results[0].geometry.location);    
     } else { 
     //alert('Geocode was not successful for the following reason: ' + status); 
     } 

    }); 

    } 

    google.maps.event.addDomListener(window, 'load', initialize); 

    function submitthis() { 

    codeAddress(); 

    } 

    </script> 

    <script> 

    $(function(){ // Document Ready 

    }); 

    </script> 

最后:

<form id="myForm" name="myForm" action="google-text-input.php" method="post" > 

    First Name<input name="first_name" type="text"><br> 

    Address<input id="pac-input" class="controls" type="text" placeholder="Search Box"><br> 



    <input id="geocode" name="geocode" type="text" value="null"><br> <!-- to be hidden --> 

    <input name="submit" type="submit" value="Submit" onclick="submitthis()"><br> 


    </form> 

我最好喜欢当我打提交按钮,它存储了谷歌地图造成成隐藏的,提交表单相同的页面,然后我可以把所有的PHP VAR和商店。我接受一个提交的方法,将javascript部分放入url中,在那里我可以通过POST获取PHP变量,然后在URL中获取Google Result。

我可以看到哪些不在以上工作的唯一的形式获取提交之前我的codeAddress()已完成。就好像我把返回false以防止表单提交它更新我的隐藏字段。

在此先感谢!

+0

你使用jQuery吗? – 2014-10-05 06:21:16

+0

是的,我可以做!我已经看过防止在地址字段的地址和onblur()的ENTER键来更新我的隐藏字段(目前显示),只是不知道这是否是正确的方法... – sprintcar78a 2014-10-05 06:40:01

说实话,我对Google的Geocoding api并不是很熟悉,但是有几种方法可以做到这一点。

第一种方法表单内

追加隐藏输入元素。这可能与您在问题中描述的最接近。

下面是一个简单的形式:

<form name="testForm" action="test.php" 
    method="post" onSubmit="return doSubmit();"> 
    <input type="submit" name="submit" /> 
</form> 

添加return doSubmit();意味着你可以调用该函数,并取消发送的形式,如果你需要。

这里是伴随的javascript:

function doSubmit() { 
    var latval = 42; // Use the geolocation values you want here. 
    var lat = document.createElement("input"); 
    lat.setAttribute("type", "hidden"); 
    lat.setAttribute("value", latval); 
    lat.setAttribute("name", "geo[lat]"); 
    document.forms["testForm"].appendChild(lat); 
    return true; 
    //Note: to stop the form from submitting, you can just return false. 
} 

如果使用jQuery,这变得更加容易。您不需要将onSubmit字段添加到表单。只需为提交按钮分配一个唯一的名称或ID。

$(document.ready(function() { 
    $("input[name=submit]").click(function(e) { 
     var latVal = 42; // Get geo vals here. 
     $("form[name=testForm]").appendChild(
      "<input type='hidden' name='geo[lat]' value='" + latVal + "' />" 
     ); 
    }); 

});

下面是一个简单的测试php文件:

//test.php 
<?php 

if (isset($_POST["geo"])) { 
    echo "LAT IS: ".$_POST["geo"]["lat"]; 
} 
?> 

当你按一下按钮,它会追加一个隐藏的输入到表格,并发送与POST数据的其余一起。您可以指定数组类型值来形成名称,并将其转换为PHP $_POST数组中的数组。

当您单击按钮时,此示例将打印“LAT IS:42”。

第二种方法

这是最好的一个。使用AJAX和JSON使用jQuery(阿贾克斯可以用原始的JavaScript来实现,但它isn't fun

对于这一点,我将用一个简单的形式,并添加一个div:

<form name="testForm"> 
    <input type="submit" name="submit" /> 
</form> 
<div id="output"></div> 

的PHP只是回声$_POST["geo"]["lat"]

这里是JavaScript:

$(document).ready(function() { 
    $("form[name=testForm]").submit(function (e) { 
     // Prevent form from submitting. 
     e.preventDefault(); 
     // Create a js object. 
     var jso = {}; 
     // Add a geo object. 
     jso['geo'] = {}; 
     // Define its lat value. 
     jso['geo']['lat'] = 42; 
     // Add all other values you want to POST in the method. 
     // You can also just do jso.lat = 42, then change the php accordingly. 
     // Send the ajax query. 
     $.ajax({ 
      url: 'test.php', 
      type: 'POST', 
      data: jso, 
      success: function(data, status) { 
       $("#output").html("<p>" + data + "</p>"); 
      } 
     }); 
    }); 
}); 

概括地说,这是阿贾克斯多么容易被按一下这个例子将设置日提交按钮。 e的html到42.

+0

谢谢史蒂芬,所以使用上面的代码示例工作正常 - 当我使用submit click()方式运行Google Maps Geocoder时,它不起作用,就好像geocoder函数需要很长时间,并且它在地理编码器函数完成之前提交表单处理。我希望这是有道理的,我希望明天给AJAX方法一下,看看它是如何工作的。 – sprintcar78a 2014-10-05 09:25:31

+0

@ sprintcar78a,它看起来像当您调用geocoder.geocode时,第二个参数是在获得结果后运行的函数。在geocoder.geocode回调函数中执行ajax请求,并且您应该能够将结果添加到您的ajax查询中。 – 2014-10-06 02:07:13

+0

我需要一个触发器来运行该函数,如果你输入一个地址(它autocompletes)&用户命中输入它提交表单,所以地理编码func。不会被处理(或太慢)并且页面被提交。我想我们可能必须按照您的建议,阻止表单的默认动作通过地理编码函数内的jQuery或Ajax提交和发送。 另一个解决我的工作是在地址输入onblur()上运行地理编码功能,并防止ENTER键在该输入上工作。非常感谢您的意见,jQuery非常有用,我很想熟悉Ajax! – sprintcar78a 2014-10-06 06:48:38