JQuery - 通过AJAX调用将变量传递给PHP脚本,然后显示文件

时间:2010-03-04 15:44:31

标签: php jquery

我正在尝试为我的活动生成Outlook事件文件,当有人通过按页面上的链接请求时,它会动态执行。

这是我到目前为止所得到的,但我无法找到如何让浏览器下载返回的内容。

如果我通过_GET发送所有内容,我知道如何才能做到这一点,但我更愿意通过_POST来实现,因此我会沿着这条路走下去......

有什么想法? 谢谢!

HTML / Javascript

<script>
$(function() {
    $(".button").click(function() {
        // validate and process form
        // first hide any error messages
        var start = $("input#start").val();
        var end = $("input#end").val();
        var dataString = 'start='+ start + '&end=' + end;
        $.ajax({
            type: "POST",
            url: "/calendar.php",
            data: dataString,
            success: function(data) {
                //Need to return the file contents somehow!
            }
        });
    return false;
    });
});
</script>
<form name="calendar" method="post" action="">
      <input type="hidden" name="start" id="start" value="<?php echo $start; ?>" />
      <input type="hidden" name="end" id="end" value="<?php echo $end; ?>" />
      <input type="submit" name="submit" class="button" id="submit_btn" value="Outlook" />
    </fieldset>
</form>

PHP文件

<?php
if (isset($_POST['start'])) {
    $start = $_POST['start'];
    $end = $_POST['end'];
    $c = header("Content-Type: text/Calendar");
    $c .= header("Content-Disposition: inline; filename=calendar.ics");
    $c .= "BEGIN:VCALENDAR\n";
    $c .= "VERSION:2.0\n";
    $c .= "PRODID:-//xxxyyyy//NONSGML //EN\n";
    $c .= "METHOD:REQUEST\n"; // requied by Outlook
    $c .= "BEGIN:VEVENT\n";
    $c .= "UID:". $start . $end ."-" . "-xxxxyyyy.com\n"; // required by Outlook
    $c .= "DTSTAMP:".date('Ymd').'T'.date('His')."\n"; // required by Outlook
    $c .= "DTSTART:20080413T000000\n"; 
    $c .= "SUMMARY:" . "\n";
    $c .= "DESCRIPTION:" .  "\n";
    $c .= "END:VEVENT\n";
    $c .= "END:VCALENDAR\n";
    echo $c;        
} else {
    echo "Sorry you can't access this page directly";   
}
?>

3 个答案:

答案 0 :(得分:1)

PHP文件的输出将被放入成功回调中的“data”变量中。

此外,虽然我们在这里,你也可以快捷一些事情。您可以使用对象,而不是连接字符串以生成dataString(并希望没有人在其中放置=或&amp;),您可以使用对象:

dataObj = { start : start, end : end };

然后你只需将它传递给.ajax

的数据属性

答案 1 :(得分:0)

因为在ajax请求中我没有找到任何方法来处理重定向头,所以我在Ajax成功回调中使用了window.location代码来下载动作url。在你的情况下,除了显示一些进展,他们不应该需要发送ajax请求。所以你可以直接执行window.location ='calendar.php?start ='+ start +'&amp; end ='+ end;。

或者,如果您确定只希望通过POST执行它,请使用直接Form Post而不是使用Ajax。

答案 2 :(得分:0)

请检查以下代码提示。这可能对你有帮助..

type: "POST",

data: ({"start" : <?php echo $start; ?> , "end" : <?php echo $end; ?>}) ,
success: function() {
                    //Do something
        }
});