我正在使用 CakePHP 1.3.7,我正在尝试执行以下操作:
在给定页面上,用户可以单击传递保存到数据库中的参数的链接(或图像或按钮,无关紧要)。但是,所有这一切,无需刷新页面。
我一直在做一些研究,我相信我也需要使用 AJAX 来完成这个任务。但是,我找不到关于如何做到这一点的很好的示例/解释。
我认为这个想法是使用 AJAX 创建链接,它调用将接收变量作为参数的 Controller /操作,并执行操作以将其保存在数据库的相应字段/表中。
有人有我想做的事情的小例子吗?或者也许给我指出一些解释它的教程...提前非常感谢!
编辑
好的,谢谢各位的回复。他们并没有直接工作,但我想我已经越来越接近我想要的了。这就是我现在正在做的事情:
我认为有以下代码:
<div id="prev"><a>click me</a></div>
<div id="message_board"> </div>
我称这个JS文件为:
$(document).ready(function () {
$("#prev").click(function(event) {
$.ajax({data:{name:"John",id:"100"}, dataType:"html", success:function (data, textStatus) {$("#message_board").html(data);}, type:"post", url:"\/galleries\/add"});
return false;
});
});
我的图库 Controller 中的添加操作如下所示:
function add() {
$this->autoRender = false;
if($this->RequestHandler->isAjax()) {
echo "<h2>Hello</h2>";
print_r($this->data);
$this->layout = 'ajax';
if(!empty($this->data)) {
$fields = array('phone' => 8, 'modified' => false);
$this->User->id = 6;
$this->User->save($fields, false, array('phone'));
}
}
}
当点击“#prev”元素时,我收到了 add 操作的响应,我知道这是因为文本“Hello”打印在 #message_board 内。它无需刷新页面即可完成此操作,这就是我需要的原因。我的问题是我无法使 $.ajax() 函数发送任何数据,当它到达 Controller 时 $this->data 为空,所以它永远不会进入将信息保存到数据库的 if 内部(现在它保存只是一件简单的事情,但我希望它保存来自 View 的数据)。
有人能看出我做错了什么吗?如何将数据发送到 Controller ?
最佳答案
CakePHP 并不重要,您需要的大部分代码都在客户端。自己实现 AJAX 是一件很痛苦的事,所以你真的想使用一个库;目前最流行的可能是 jQuery。他们的 AJAX 页面上有很多示例:http://api.jquery.com/jQuery.ajax/
所以,假设文档中有类似的内容:
<form id="s">
<input id="q"/>
<input type="submit" href="Search!"/>
</form>
<div id="r"/>
你可以将其放入 JavaScript 中:
$('#s').submit(function(evt) {
evt.preventDefault();
$.ajax({
url: 'foo.php',
data: {
query: $('#q').val()
},
success: function(data) {
$('#r').html(data);
}
});
return false;
});
那么您的 foo.php
只需要返回将进入 div#r
的 HTML 片段。
编辑:我忘记停止提交:( 感谢@Leo 的更正。
编辑:我明白你的困惑是什么。您将不会获得数据
。我没有使用过 CakePHP,但我假设 $this->data
是您从 $_REQUEST['data']
获得的内容?你在服务器上看不到它。 data
是所提交内容的哈希值;您将直接获得 $_REQUEST['name']
和 $_REQUEST['id']
(我认为,将其翻译为 CakePHP 为 $this->name
和 $this->id
)。
关于database - CakePHP 和 AJAX 无需刷新页面即可更新数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5401218/