4

私のサイトには Js ヘルパーを利用した基本的な ajax フォームがありますが、正常に動作しますが、検証エラーが発生すると、更新コールバックが成功 div 内のページ全体を複製します。

成功 div:

<div id="success"></div>

送信ボタン:

echo $this->Js->submit('Send', array(
    'before'=>$this->Js->get('#sending')->effect('fadeIn'),
    'success'=>$this->Js->get('#sending')->effect('fadeOut'),
    'update'=>'#success',
    'class'=>'btn btn-primary'
));

Javascript:

$(document).ready(function(){

    $('#postkey, #gender, #hair, #location, #message').blur(function(){
        $.post(
            '/Cake_ajax/Posts/validate_form',
            { field: $(this).attr('id'), value: $(this).val() }
            //handleNameValidation
        );
    });

});

コントローラーでフォーム機能を検証します。

public function validate_form(){
    if($this->RequestHandler->isAjax()){
        $this->request->data['Post'][$this->request['data']['field']] = $this->request['data']['value'];
        $this->Post->set($this->request->data);
        if($this->Post->validates()){
            $this->autorender = FALSE; // don't render a view
            $this->set('error','');
        }else{
          $this->layout ="ajax";
            $this->autoRender = FALSE;
            $error = $this->validateErrors($this->Post);
            $this->set('error',$this->Post->validationErrors[$this->request['data']['field']][0]);  
        }
    }
}

これが続行するのに十分な情報かどうかはわかりません。さらにコードを投稿する必要がある場合は、お知らせください。

ありがとう。

4

6 に答える 6

4

I just tested your application by using your zip file.

What I observed is that this is not the whole page that is put inside your #success div, but only the content of the Posts/add.ctp view. So basically this means the RequestHandler does its job correctly, meaning the layout that is used is the 'ajax' layout. To get rid of anything else that the form, the add.ctp page should not contain anything else that the form. In your case Posts/add.ctp contains navigation links, and that's why they get duplicated.

That said, what the submit button does currently is getting the content of Posts/add.ctp view and insert it in your empty #success div. But you never remove the form that was already on the page. What you could do is updating the content of a div that contains your first form, or even the content of the whole Posts/add.ctp view.

In your case, simply updating the #content instead of the #success div could maybe suit your needs:

echo $this->Js->submit('Send', array(
  'before'=>$this->Js->get('#sending')->effect('fadeIn'),
  'success'=>$this->Js->get('#sending')->effect('fadeOut'),
  'update'=>'#content',
  'class'=>'btn btn-primary',
  'controller'=>'posts',
  'action'=>'add'
));
于 2012-05-04T13:30:03.600 に答える
1

私は同じ問題に遭遇しました。nIcO は解決策を提供しているように見えますが、私の場合は、Drawrdesign が必要とする成功メッセージがまだレンダリングされていないため、役に立ちませんでした。

それで、私はあなたのzipファイルを見て、解決策を見つけました。2 つの ajax 呼び出しが定義されています。1) .blur と 2) .bind です。1) フィールドの検証に使用され、AJAX を介して PostsController の validate_form() 関数にデータを送信します。2) は、送信ボタンのクリック イベントを監視するために使用され、PostsController の add() 関数にデータを送信します。

この問題は、2) で [送信] ボタンをクリックしたために発生します。したがって、PostsController の add() 関数を見ているは​​ずです。1) 関数の validate_form() で、次の行を追加しました。

$this->autoRender = FALSE; 

そして、これが解決策です。CakePHP がビューを自動的にレンダリングする場所では、AJAX のために、それが発生することを望まないからです。したがって、ケース 1) が完了したら、ケース 2) の add() 関数に次のように追加する必要があります。

public function add() {
// Ajax post
if(!empty($this->request->data)) {
    // ...
    $this->autoRender = FALSE; // ** NEW LINE **
        if($this->Post->save($this->request->data)) {
            // ...     
        } 
        // ...
    } 
    // ...
} 

そのため、div="#success" で add.ctp の (自動) レンダリングが停止し、「sending..」と「succes.ctp」の他のメッセージが引き続き表示されます。

PS。@Drawrdesign さん、たまたま andrewperk の説明ビデオに従いましたか?

于 2012-07-10T15:49:14.680 に答える
0
public function admin_edit_comment() {
    $this->layout = 'ajax';
    $this->autoRender = false;
    if ($this->request->is('ajax')) {
        if ($this->FaComment->save($this->request->data, false)) {
            $response['status'] = 'success';
            $response['action'] = 'edit_comment';
            $response['data'] = $this->request->data['FaComment'];
            $response['message'] = __d('vanderdeals', 'Comment saved successfully');


    } else {
            $response['status'] = 'error';
            $response['model'] = 'FaComment';
            $response['message'] = __d('vanderdeals', 'Internal server error occurred. Please try again later.');
        }

        echo json_encode($response);
    }
}
于 2015-03-09T09:14:56.450 に答える
0

こんにちは、まず、cake 2 lib を使用していて、おそらく動作する 1.3 コードを使用しているようですが、部分的に非推奨になっているため、移行ガイドを確認する必要があるかもしれません。コンソール ツールは、コードを 2.0/2.1 にアップグレードすることもできます。

次に、ビューと空のレイアウトをレンダリングしたいですか? $errors は Views/Posts/validate_form.ctp で定義されています。$errors を設定していて、ビューをレンダリングしていません。自動レンダリングの false への設定を削除し、コントローラー アクションの上部に配置します。

$this->layout = 'ajax';
Configure::write("debug",0);

何かいい?

于 2012-05-04T13:33:21.023 に答える
0

Ajax リクエスト処理で、レイアウトを ajax に設定します。そのため、エラー メッセージはデフォルト レイアウトではなく、ajax レイアウトでレンダリングされます。

更新しました

public function validate_form(){
if($this->RequestHandler->isAjax()){
    $this->request->data['Post'][$this->request['data']['field']] = $this->request['data']['value'];
    $this->Post->set($this->request->data);
    if($this->Post->validates()){            
        $this->autoRender = FALSE; // don't render a view
        $this->set('error','');
    }else{
        $this->layout ="ajax";
        $this->autoRender = FALSE; 
        $error = $this->validateErrors($this->Post);
        $this->set('error',$this->Post->validationErrors[$this->request['data']['field']][0]);  
    }
}

}

于 2012-04-28T07:20:51.593 に答える