2012-01-07 12 views
0

ajax(jqueryを使用)経由でフォームを開き、ページ全体を再読み込みせずに保存したい。私は、ページを編集するためにリダイレクトの代わりにテキスト応答(例えば、 "OK!")を得るために、コードを変更する必要がありますか?Symfony:レコードを追加した後の応答を変更する

これは私のJSです:

$("#newcatlink").click(function() { 
    $.ajax({ 
    'url': "category/new", 
    'success': function(data, textStatus, jqXHR) { 
      $("#mdialog").html(data); 
      $("#_form_jqhide").hide(); 
      $("#mdialog").dialog({ 
       modal: true, 
       width: 500, 
       resizable: false, 
       buttons: { 
        Save: function() { 
         $.ajax({ 
          'type': 'POST', 
          'url': 'category/create', 
          'data': $("#categoryform").serialize(), 
          'success': function(data, textStatus, jqXHR) { 
           alert(data); 
          } 
         }); 
        }, 
        Cancel: function() { 
         $(this).dialog("close"); 
        } 
       } 
      }); 
     } 
    }); 
}); 

私はこのようなのactions.class.phpでPROCESSFORMアクションを変更:

... 
if ($form->isValid()) 
{ 
    $Category = $form->save(); 

     if($request->isXmlHttpRequest()) { 
      return $this->renderText("ok!"); 
     } else { 
      $this->redirect('category/edit?id='.$Category->getId()); 
     } 
} 

が、それは何も変更didntの。これを行う方法?

編集8/1/12:

私はblowskiとsakfa答えに応じて私のコードに変更を加えましたが、私は別の問題を取得します。フォームのエラーをキャッチする方法?私はprocessFormにelseを追加し、期待どおりに動作しますが、エラーメッセージ/ code /何かを返すことはできません。エラーが存在するだけです。ここ

コードである:http://pastebin.com/ppbPM88G これは1つの必須フィールド空でフォームを送信した後、サーバ答えは:

{ "haserrors":真、 "エラー":[]}

+0

古いSFバージョンの問題は、(あなたが使用しているバージョンあなたが私に教えていませんでし)とすることができますか? '$ this-> renderText( 'ok!')'を返す直前にdie( 'here') 'ステートメントを入れて、そのブランチに入っていることを確認します。 –

+0

が死んでいる場合は、「ここ」が期待通りに表示されます。ダイがなければ、編集ページにリダイレクトされます。 – WombaT

+0

なぜリダイレクトを継続して実行しているのか考えられません。アクションクラスの他の場所にはリダイレクトはありません。通常このために私は 'if(!$ request-> isXmlHttpRequest()){$ this-> redirect()}'を使い、テキストのレンダリングをパブリックメソッドに入れます。 –

答えて

1

私たちの会話に基づいて、私は何が起こっているかを見ることができます。私があなたのコメントを理解していれば、それはページ全体をリダイレクトするのではなく、元のフォームをダイアログボックス内で再レンダリングするだけです。

ユーザーがフォームを送信した後、有効な場合はリダイレクトされます。ただし、リダイレクトをバイパスしているため、代わりに$this->setTemplate('new')ビットのコードが表示されるので、もう一度newフォームが表示され、完了したフォームのデータが入力されます。

、それを回避するアクションを作成するには、このようなものを使用するには:

if($request->isXmlHttpRequest()) { 
    $this->renderText(json_encode(array('valid' => $form->isValid()))); 
} else { 
    $this->setTemplate('new'); 
} 

ます。また、それはJSONレスポンスを期待していますように指定するには、あなたのAjaxリクエストを変更したいと思います。フォームが有効な場合は、ダイアログボックスを閉じます(または保存後に実行したいもの)。あなたがアクションでないreturn $this->renderText("ok!")processFormのメソッドを入れている

executeCreateが好き):ここでの会話に基づいて

+0

答えに感謝、私は少し私の質問を費やした。答えは – WombaT

2

。戻り行と条件チェックをexecuteXXXメソッドに移動します。

編集2012-01-08

彼らが今どんな使用のためではないですので、私はあなたが効果的にそこに私の変化を取り入れたオリジナルのコードを編集したことから、コードの私の古いスニペットを削除しました。新しい質問に対するとして

:あなたは非常に多くの問題を抱えている理由のフォームを扱うとき

基本的にsymfony1 APIは吸うが、thatsの。

まず、このapiは検証時にAJAXフォームの提出を処理するようには設計されていないことが必要です.SFFormは内部的にエラーを保存してHTMLとしてレンダリングできるためですいくつかのシリアライズ可能な形式(json_encodesがうまくいくfieldname => errorMessageの配列のような)でエラーを返すルーチン(私が知る限り)はありません。私はあなたの場所に何をするのか、あなたのコードで開始する

た:

まず:あなたはdoSomeMagicToGetFormErrorsAsAnJsonEncodedArrayにPOSTリクエスト今

public function exucuteAjaxFormSubmission(sfWebRequest $request) 
{ 
    //this action handles ONLY ajax so we can safely set appropriate headers 
    $this->getResponse()->setContentType('text/json'); 

    $form = new form(); 
    $form->bind($request->getPostParameters()); 

    if ($form->isValid()) { 
     //do your logic for positive form submission, i.e. create or update record in db 
     return json_encode('ok'); //notify client that everything went ok 
    } else { 
     return $this->doSomeMagicToGetFormErrorsAsAnJsonEncodedArray(); 
    } 
} 

を行うと仮定すると、ちょうどAjaxの提出処理のために別のアクションを作成しますpart:json形式でフォームエラーを取得したいそのために、フォームクラスに簡単なメソッドを追加します(これは検証ロジックに対する 'インターフェース'なので)。

いくつかの理論:sfValidatorErrorSchemaと呼ばれる構造で、内部sfForm店舗の検証エラー。 sfValidatorErrorSchemaは、エラーを2つのリスト、つまりnamedErrorsglobalErrorsに格納します。エラーは「フィールドのバリデータ」nameフィールド上(つまり、必要な文字列のバリデータのために投げたものです。グローバル・エラーは、フォーム全体(すなわちグローバルpostValidatorsのために投げたものです)という名前。それぞれのエラーがバリデータを怒らによってスローsfValidatorErrorオブジェクトです。

警告:実際には、この構造は、再帰的ですが、機能以下、この場合には埋め込みフォームを使用する場合にのみ、あなたがそれを見ることができます..私はあなたが組み込み使用しないことを望むsfValidatorErrorSchemaがsfValidatorErrorない、別のsfValidatorErrorSchemaを含めることができる状況を含めるように変更する必要がありますsymfonyにおいて、これはプレーンなフォームAPIよりもさらに。

しかし、十分な話を、吸うので、あなただけのコードをしたい場合フォームは、これらのメタをコピー&ペーストフォームのクラスへのODS:

class myForm extends sfForm { 
    (...) 

    /** a helper method to convert error schema to an array */ 
    public function getSerializableErrors() 
    { 
     $result = array(); 
     foreach ($this->getErrorSchema()->getNamedErrors() as $fieldName => $error) { 
      $result[$fieldName] = $error->getMessage(); 
     } 
     foreach ($this->getErrorSchema()->getGlobalErrors() as $error) { 
      $result['_globals'][] = $error->getMessage(); 
     } 

     return $result; 
    } 

    /** screw array, just give me ready to send json! */ 
    public function getJsonEncodedErrors() 
    { 
     return json_encode($this->getSerializableErrors()); 
    } 
} 

は今だけ getJsonEncodedErrosから doSomeMagicToGetFormErrorsAsAnJsonEncodedArrayを変更すると、あなたは、検証の基本的なAjaxフォームの投稿で行われている - あなたは適切にあなたのロジックを実装するために、今の十分な知識を持っている必要があります。私は現在symfonyの1.4バージョンでこれをテストしているので、何がうまくいかない場合は、それはそれはまだ、カテゴリ/編集ページにリダイレクトされ

+0

ありがとう。私は私の質問に別の関連する問題を追加しました – WombaT

+0

編集したバージョンを読んでください、あなたの新しい問題の答えが含まれています –

+0

あなたに大きな感謝! Eveyrthingはうまくいきます!どうもありがとうございました! – WombaT

関連する問題