CakePHP AJAX调用

4

我正在使用 CakePHP,这是我在这个框架上的第一个项目。我将要把输入框中的值发送到 UsersControllercheck_username() 方法。然后用 check_username() 返回的字符串填充一个 ID 为 na 的元素。目前为止,我所做的是:

//in my form
<input type="text" name="data[User][username]" style="width: 60%" required="required" id="username" oninput="check_username(this.value)">
<label style="margin-left: 20px; color: red" id="na">Not Available!</label>

//after the form
<script type="text/javascript">
    function check_username(un) {
        $.ajax({
            type: 'POST',
            url: '/oes/users/check_username',
            data: {username:un},
            cache: false,
            dataType: 'HTML',
            beforeSend: function(){
                $('#na').html('Checking...');
            },
            success: function (html){
                $('#na').val(html);
            }
        });
    }
</script>

//and my check_username() is
public  function check_username(){
    return 'Test string';
}

但这并没有起作用。有人知道为什么或者如何修改它使其起作用吗?

长命语法高亮。在您的成功回调中,#na后面忘记了闭合引号。 - Oldskool
已编辑,但仍无法正常工作,“beforeSend”正常工作,但“success”不正常。 - A. K. M. Tariqul Islam
设置错误回调并检查错误消息。 - A. Wolff
调试级别为2,没有看到任何错误。即使我使用 $('#na').val('test...'); 进行测试,仍然无法正常工作。 - A. K. M. Tariqul Islam
尝试使用 $.ajax({...}).fail(function() { console.log(arguments); }); 并查看是否有任何日志记录。 - Jason P
显示剩余2条评论
3个回答

5
可能是您的check_username控制器动作出了问题。CakePHP的方式是使用JsonView类通过XHR发送任何数据(请参见http://book.cakephp.org/2.0/en/views/json-and-xml-views.html)。它允许您调用任何带有.json扩展名的操作(例如:/oes/users/check_username.json),并以序列化JSON格式获取响应,而无需在数组数据和JSON之间进行手动转换。
这种方法推荐您使用,但当然不是必须的。
现在我认为CakePHP尝试呈现check_username视图,但由于您没有指定或创建该视图,因此无法执行。尝试将您的操作代码更改为以下内容:
public function check_username(){
     $this->autoRender = false;
     echo 'Test string';
}

另外,尽量避免在未来使用这种代码结构。


好的,它可以正常工作。但是如果我想运行 Ajax 来检查这些事情,你建议使用什么类型的编码? - A. K. M. Tariqul Islam
使用序列化的JSON数据在AJAX中是一个好的实践,因此我建议使用CakePHP JSON视图。 - Andrew Bashtannik

2
CakePHP 有一个 JS Helper 可以帮助编写 aJax 函数。唯一需要注意的是,在头部引入 jQuery,否则 CakePHP 会抛出 jQuery 错误。
您的表单:
<?php 
  echo $this->Form->create('User', array('default'=>false, 'id'=>'YourForm'));
  echo $this->Form->input('username');
  echo $this->Form->submit('Check Username');
  echo $this->Form->end();
?>

Ajax函数:
<?php
  $data = $this->Js->get('#YourForm')->serializeForm(array('isForm' => true, 'inline' => true));
  $this->Js->get('#YourForm')->event(
    'submit',
    $this->Js->request(
      array('action' => 'checkUsername', 'controller' => 'user'),
      array(
        'update' => '#na',
        'data' => $data,
        'async' => true,    
        'dataExpression'=>true,
        'method' => 'POST'
      )
    )
  );
  echo $this->Js->writeBuffer();                                                 
?>

用户控制器中的函数
function checkUsername(){
  $this->autoRender = false;
  //run your query here 

  if ( $username == true ) 
    echo 'Username is taken';
  else
    echo 'Username is not taken';  
}

1

在谷歌上有很多例子。这里是一个不错的访问地址。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接