0

エコーでクライアントに応答できないため、本当に困っています。

次のデータを JSON で応答する必要があります。

header("Content-type: application/json");
$response = array();
$response['username'] = $user;
$response['password'] = $pass;
json_encode($response);

ただし、次のような HTML ファイルを介して行う必要があります。

Template::set('response', json_encode($response));

その理由は、私のフレームワークは常に次のようなページ出力を必要とするからです。

Template::set('response', array()); 

それ以外の場合は、それ自体を実行しようとします。(エラー ページまたは null html 応答のいずれか)

そのため、JSON ヘッダーとエコーで応答できません。私は基本的に回避策を見つけようとしていました。これを達成する方法がない場合は、ヘッダーで応答するようにフレームワークを少し調整しますが、可能であれば少し回避策を使用することを好みます。

Ps。ちなみに、これが私のjQueryの実行方法です。ここで問題はないと思いますが、間違っているかもしれないので、こちらもご覧ください。

$("#doLogin").click(function(e) {
    e.preventDefault();  // prevent normal form submit
    $("#login-result").html('<img src="<%THEME%>images/loading.gif">');
    var formData = $("#loginForm").serialize();
    $.post("?page=login", formData, function(response)
    {
        alert(response.username);
        $("#login-result").html(response.username);
    },'json');
});
4

2 に答える 2

1

フレームワークのコードを変更するか、それに対応する必要があります。

ビジネスロジックと出力を分離することをお勧めします。リクエストを処理するときは、エコーを実行するのではなく、出力を準備して、出力変数をテンプレートに渡す必要があります。テンプレートは、渡した変数にのみ依存して、ビジネス ロジックから独立して実行する必要があります。これにより、コードが読みやすくなり、簡単に変更できるようになります。

現在の問題の解決策については、配列を渡すオプションを追加してテンプレート フレームワークを拡張すると、フレームワークはそれを json オブジェクトとしてレンダリングします。これにより、ビジネス ロジックとビューが分離されたままになり、ニーズに対するシンプルなソリューションが提供されます。

于 2013-02-03T16:52:09.327 に答える
0

次のようにして、フレームワークがやろうとしていることを回避できます。

header('Content-type: application/json');
echo json_encode($json);
exit;

ただし、フレームワークに組み込みの JSON を発行する機能がない場合は、かなり驚かれることでしょう。

于 2013-02-03T18:26:46.623 に答える