0

我在 CakePHP 控制器类中创建了一个函数来处理 AJAX 请求。但是我在使用 CakePHP 函数和简单(非 MVC)PHP 代码时发现了不同的结果。我的问题是当它进入submit()过程时。使用 CakePHP 函数时,它返回空白页。

这是我使用的 AJAX 请求代码:

var userdata = {username : $("#UserUsername").val()};
        $.ajax({
            type:'POST',
            url: 'http://localhost/mycakephp/users/login',
            data: userdata,                     
            success: function(data){                                    
                if(data==0){
                    alert("empty");                 
                } else {
                    $("#UserLoginForm").submit();                       
                }
            }               
        });     

但是当我将 url 指向外部站点时,如下所示:

网址:'http://localhost/test/test.php'

其中test.php是一个简单的 PHP 代码来处理请求,提交过程工作正常。

4

2 回答 2

1

抱歉,但您的代码对我来说看起来很奇怪:您有一个登录表单,您使用 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布局。

我希望它对你有帮助。

于 2012-10-26T14:05:36.347 回答
0

根据您的评论,如果您使用 SecurityComponent,您可以禁用登录操作的 POST 验证。在您的用户控制器中,添加以下内容:

function beforeFilter()
{
    parent :: beforeFilter();

    switch($this->request->params['action'])
    {
        case 'login':
            $this->Security->validatePost = false;
            $this->Security->csrfCheck    = false;
            break;
    }
}

但是当然,您会失去 SecurityComponent 在登录操作中添加的值。

于 2012-10-24T09:15:17.217 回答