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を向けたとき:

url:'http://localhost/test/test.php'

どのtest.phpがリクエストを処理するための単純なPHPコードであるか、送信プロセスは正常に機能します。

4

2 に答える 2

1

申し訳ありませんが、あなたのコードは私には奇妙に見えます:ログインフォームがあり、ajaxを使用してコントローラー「UsersController」/関数「login」を呼び出すユーザー名を送信し、この関数からの回答が得られたら、もう一度送信しますフォーム( "#UserLoginForm")を実行して、コントローラーに再度送信しますか?2つのフォームを送信しています!おそらくこれはあなたが望むものではありません。私が間違っている場合は私を訂正してください。

UserLoginFormを送信して、OKかNotOKかに関係なく、回答を待って、最後にこの結果を表示するだけでよいと思います。

これを行うには、CakePHPの方法またはJQueryを使用した独自のajaxコードの2つのオプションがあります。取得したいユーザーエクスペリエンスに応じて、両方を使用するのが好きです。

1.CakePHPの方法

を使用public $helpers = array('Js');してコントローラーにJSHelperを含め、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>2番目のバージョンは、タグにajaxコードを手動で入力することによって行われます。このソリューションはあなたにもっと自由を与え、あなたがより複雑なことをすることを可能にします、しかしコードはそれほどきれいではありません!

次のJQueryコードは、button / 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検証を無効にすることができます。UsersControllerに、次を追加します。

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 に答える