抱歉,但您的代码对我来说看起来很奇怪:您有一个登录表单,您使用 ajax 发送您的用户名,调用控制器“UsersController”/函数“登录”,当您从该函数获得答案时,您再次提交另一个表单(“#UserLoginForm”)并将其再次发送到控制器?您正在发送两个表格!很可能这不是您想要的。如果我错了,请纠正我。
我想你想要的只是提交 UserLoginForm 并等待答案,无论它是 OK 还是 NotOK,最后显示这个结果。
您有两种选择:CakePHP 方式或您自己的使用 JQuery 的 ajax 代码。我喜欢使用两者,这取决于我想要获得的用户体验。
1.CakePHP方式
使用 JsHelper在控制器中包含 JS Helper,public $helpers = array('Js');
然后在视图中创建一个 Form,使用来自 JsHelper 的提交。
看法
<?php
echo $this->Form->create();
echo $this->Form->input('username');
echo $this->Form->input('whatever');
// use the Js submit from JsHelper
echo $this->Js->submit('Send', array(
'url'=> array('controller' => 'users', 'action' => 'login'),
'update' => '#update_ajax_div',
));
echo $this->Form->end();
// Next line is actually very important in order
// to print the automatically created ajax code from JsHelper.
echo $this->Js->writeBuffer();
?>
<div id="update_ajax_div">
this will be overwritten after submit.
</div>
控制器
在控制器中,表单中的所有数据都将在$this->data[]
数组中发送。例如$this->data['Users']
,如果这是在 Form->create() 中使用的模型。
代码非常标准,除了必须设置为 ajax 的布局。
public function login(){
// print the data being sent
$dataFromAjaxLink = $this->data[];
$v = var_export($dataFromAjaxLink, true);
$this->log("Ajax log: ".$v, 'debug');
if(isset($this->data['User'])){
$user_name = $this->data['User']['username'];
...
// do your stuff
}
// the answer must be ajax layout
$this->layout = "ajax";
// I like to use elements when using ajax, it keeps the folders clean
// in this example /app/View/Elements/display_ajax_result.ctp
$this->render('/elements/display_ajax_result');
}
此元素的内容将打印在 div "update_ajax_div" 中
2.纯Ajax方式
第二个版本是通过在<script>
标签中手动输入 ajax 代码来完成的。这个解决方案给了你更多的自由,允许你做更复杂的事情,但是代码不是那么干净!
以下 JQuery 代码必须在某个按钮/div/whatever 事件中...
$(document).ready(function(){
$(".someButton").click(function() {
// create the json data to be sent
var username = $(....).val();
var dataString = ...
// call ajax
$.ajax({
type: "POST",
// never type full paths as in your example. They are sources of errors!
url: "<?php echo $this->Html->url(array(
"controller" => "users",
"action" => "login")); ?>,
data: dataString,
cache: false,
success: function(html){
$("#update_ajax_div").html(html);
}
});
...
控制器与 CakePHP 方式相同。记得添加ajax布局。
我希望它对你有帮助。