申し訳ありませんが、あなたのコードは私には奇妙に見えます:ログインフォームがあり、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レイアウトを追加することを忘れないでください。
お役に立てば幸いです。