【问题标题】:CakePHP AJAX callCakePHP AJAX 调用
【发布时间】:2013-09-28 19:49:28
【问题描述】:

我正在使用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 之后的结束引号。
  • 已编辑。但仍然无法正常工作,beforeSend 工作正常但 success 工作不正常。
  • 设置错误回调并检查错误信息
  • 调试级别为 2,未发现错误。即使我用$('#na').val('test...'); 进行了测试,仍然无法正常工作。
  • 尝试$.ajax({...}).fail(function() { console.log(arguments); }); 看看是否有任何记录。

标签: ajax jquery cakephp


【解决方案1】:

您的check_username 控制器操作可能有问题。 CakePHP 的方式是使用JsonView 类发送任何数据 throw 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 来检查这些事情,你建议使用什么类型的编码?
  • 在 AJAX 中使用序列化 JSON 数据是一种很好的做法,因此我建议使用 CakePHP JSON View。
【解决方案2】:

CakePHP 有一个 JS Helper 来帮助编写 aJax 函数。唯一的问题是在你的头脑中包含 jquery,我们的蛋糕会抛出 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';  
}

【讨论】:

    【解决方案3】:

    通过谷歌有很多例子。 Here 是个好去处。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-13
      • 2014-09-12
      • 2012-03-15
      • 2013-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多