php - 接口和阿贾克斯调用

问题描述:

我正在写一个PHP应用程序,它需要时使用AJAX通过POST提交表单。当javascript无法使用时,我会按照正常的方式通过HTML/PHP提交表单。php - 接口和阿贾克斯调用

我真正想要做的是将JSON或XML返回给AJAX调用,而且我不想将所有表单处理逻辑写两遍或者真的重复自己。

我试图确定将表单处理逻辑作为单个接口写入的最佳方式,然后可以由AJAX调用和PHP脚本使用。

我想出了两个选项,这两个选项看起来都像黑客。希望我能得到一些更清洁/更好/更正确的解决方案,或者对我的两种解决方案进行评估以确定哪种方案更受欢迎。

形式: form.php的 处理器: process.php

AJAX: JS截取提交点击form.php的,POST到process.php返回JSON结果返回给JS。 JS使用JSON结果相应地更新HTML。

PHP:

选项1 form.php的职位,以process.php其中如果某一变量与POST数据传递输出HTML。例如

if ($_POST['output'] == 'html') { 
    //output as html 
} else { 
    //output JSON 
} 

选项2 form.php的职位,以intermediate.php然后将包括( 'process.php'),捕捉JSON输出和使用JSON输出中显示的HTML作为必需的。例如

ob_start(); 
include('process.php'); 
$json = json_decode(ob_get_contents()); 
ob_end_clean(); 
//use json to create HTML to display to waiting user here 

这两个选项看起来都有些诡异。第二个看起来更清洁(虽然我从来没有觉得我在使用ob_start时干净利落),因为它不需要我写任何不同的process.php - 更好地模拟外部Web服务 - 尽管这不是问题因为process.php完全在我的控制之下。

想法?

感谢一如既往, 亚伦

我会选择选项1.就像在流行的Yii框架中一样。典型的工作流程是这样的一个:

if (isAjaxRequest()) { 
    // Ouput JSON and finish script 
    die(json_encode($output)); 
} 
else { 
    // This is not AJAX request, proceed 
} 

而且isAjaxRequest是:

// Taken from Yii framework method 
function isAjaxRequest() { 
    return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH']==='XMLHttpRequest'; 
} 

你并不需要设置一定的变量,表示该请求是通过AJAX,因为浏览器发送HTTP_X_REQUESTED_WITH头和你只需要检查它是否已设置。

+0

谢谢。我已经接受了这个答案,这是我的选择。 – Alpaus 2012-02-07 09:44:05

也许沿选项1线的东西?

就在ajax脚本启动之前,使用javascript将表单变量从HTML更改为JSON,然后PHP脚本就可以捕获它了吗?

如果ajax脚本失败,它将永远不会更改该变量。

你甚至可以使用JavaScript来改变表单动作JSON_process.php或类似的东西

我建议你使用MVC框架。在控制器中,设置您需要的所有数据。然后,设置两个视图模板,一个用于JSON(可以只是简单地执行数据的json_encode),另一个用于HTML。然后,您可以根据您的选项1中的输出参数设置视图。