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
头和你只需要检查它是否已设置。
也许沿选项1线的东西?
就在ajax脚本启动之前,使用javascript将表单变量从HTML更改为JSON,然后PHP脚本就可以捕获它了吗?
如果ajax脚本失败,它将永远不会更改该变量。
你甚至可以使用JavaScript来改变表单动作JSON_process.php或类似的东西
我建议你使用MVC框架。在控制器中,设置您需要的所有数据。然后,设置两个视图模板,一个用于JSON(可以只是简单地执行数据的json_encode),另一个用于HTML。然后,您可以根据您的选项1中的输出参数设置视图。
谢谢。我已经接受了这个答案,这是我的选择。 – Alpaus 2012-02-07 09:44:05