4

私は使用CakePHPしていますが、これはこのフレームワークでの最初のプロジェクトです。UsersController入力の値をのcheck_username()アクションに送信します。そして idnaを持つ要素を によって返された文字列で埋めcheck_username()ます。これまでのところ、私がやったことは次のとおりです。

//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';
}

しかし、これは機能していません。機能するように変更する理由または方法を知っている人はいますか?

4

3 に答える 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';
}

また、今後はこのようなコード構成を使用しないようにしてください。

于 2013-09-29T20:48:29.560 に答える
2

CakePHP には、aJax 関数の作成を支援する JS ヘルパーがあります。唯一の問題は、頭に 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';  
}
于 2013-10-03T11:35:00.113 に答える