2012-02-05 23 views
0

私はAJAXを使用してフォームをPOST経由で送信するPHPアプリケーションを作成しています。 javascriptを使用できない場合は、通常通りHTML/PHP経由でフォームを送信します。php-interface forとajaxコール

私が本当にやりたいことは、JSONやXMLをAJAX呼び出しに戻すことです。フォーム処理ロジックを2回書くか全く自分自身を繰り返す必要はありません。

私は、AJAX呼び出しとPHPスクリプトの両方で使用できる単一のインターフェイスとしてフォーム処理ロジックを記述する最良の方法を判断しようとしています。

私は2つのオプションを思いつきましたが、どちらもハックのようです。私は、よりクリーンな、より良い、より正確なソリューションを提供することができますか、どちらが優先されるかを判断するために私の2つのソリューションを評価することができます。

フォーム: form.php プロセッサ: process.php

AJAX: JSをインターセプトバックJSにJSONの結果を返すprocess.phpし、form.phpに投稿をクリックし提出します。 JSは結果的にJSON結果を使用してHTMLを更新します。

PHP:特定の変数は、POSTデータに渡された場合、HTMLを出力するprocess.phpする

オプション1つの form.phpポスト。例えば

if ($_POST['output'] == 'html') { 
    //output as html 
} else { 
    //output JSON 
} 

次いで( 'process.php')を含んでなるintermediate.phpするオプション2つの form.phpポスト、JSON出力を捕捉し、必要に応じてHTMLを表示するためにJSON出力を使用します。例えば

ob_start(); 
include('process.php'); 
$json = json_decode(ob_get_contents()); 
ob_end_clean(); 
//use json to create HTML to display to waiting user here 

これらのオプションはどちらも少しハッキリです。 obestartを使用するときれいに何かをやっているように感じることはありませんが、process.phpを別の方法で書く必要はありません。外部Webサービスをよりよくエミュレートします。これは問題ではありませんがprocess.phpは完全に私のコントロール下にあるからです。

思考?

おかげでいつものように、 アーロン

答えて

1

私はオプション1を選択します.Yiiのような一般的なフレームワークと同様です。典型的なワークフローは、この1のようなものです:

if (isAjaxRequest()) { 
    // Ouput JSON and finish script 
    die(json_encode($output)); 
} 
else { 
    // This is not AJAX request, proceed 
} 

そしてisAjaxRequestは次のとおりです。

// Taken from Yii framework method 
function isAjaxRequest() { 
    return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH']==='XMLHttpRequest'; 
} 

あなたはブラウザがHTTP_X_REQUESTED_WITHヘッダを送信しますので、要求がAJAX経由であることを示すために、特定の変数を設定する必要はありませんそれが設定されているかどうかを確認するだけです。

+0

ありがとうございます。私はこれを答えとして受け入れ、それが私が行った選択です。 – Alpaus

0

たぶん、オプション1の線に沿って何か?

ajaxスクリプトが起動する直前に、javascriptを使用してHTMLからJSONにフォーム変数を変更してから、PHPスクリプトが正しくキャプチャできますか?

ajaxスクリプトが失敗すると、変数は決して変更されません。

あなたも、私はMVCフレームワークを使用することをお勧めしたいのフォームJSON_process.phpにアクションまたはその

0

のようなものを変更するためにはJavaScriptを使用することができます。コントローラで、必要なすべてのデータを設定します。次に、JSON(データの単純なjson_encodeを行うことができる)とHTML用の2つのビューテンプレートを設定します。その後、オプション1のように出力パラメータに基づいてビューを設定することができます。