0

動的ドキュメント プレビューアを作成しようとしています。ユーザーは、特定のドキュメント ヘッダー オプションを入力できます。アカウント情報に基づいて、動的ヘッダーを含むドキュメントが生成されます。最終的には完全な pdf をプレビューしたいのですが、現在はヘッダーだけに取り組んでいます。

私がやろうとしているのは、ユーザーが入力できるフォームを含むページを作成し、ボタンを押してヘッダーをプレビューすることです。

$.ajaxSetup({
type:       'POST',
timeout:    10000
});

$("#preview_header").click(function(){
    var full_url = //appropriate URL 

    var preview_data = {    
        "wsid":             "default",
        "page":             "default",
        "banner_area1":     "default",
        "banner_area2":     "default",
        "banner_area3":     "default",
        "uid":              "default",
        "fid":              "default",
        "cid":              "default",
        "assignment_type":  "default"
    };

    preview_data.wsid               = $("#worksheet_picker").val();
    preview_data.page               = $("#page_picker").val();
    preview_data.banner_area1       = $("#banner_area1").val();
    preview_data.banner_area2       = $("#banner_area2").val();
    preview_data.banner_area3       = $("#banner_area3").val();
    preview_data.uid                = $("#member_uid").val();
    preview_data.fid                = $("#family_id").val();
    preview_data.assignment_type    = 'family';
    preview_data.cid                = $("#class_id").val();

    var JSONText = JSON.stringify( preview_data );
    alert('Full JSON - ' + JSONText);

    $.ajax({
        async: true,
        url: full_url,
        data: { previewInfo : JSONText }, //Passes necessary form information
        dataType: 'json',
        success: function(output){
            var reply = output;
            if ( reply.status == "success" ){
                $("#preview").attr("src", reply.image );
            } else {
                alert('Failed to create image preview of the assignment.');
            } 
        } 
    });
});

私の知る限り、上記の方法はうまく機能しています。適切な Codeigniter ページにヒットし、ajax メソッドがハードコードされた画像を返すように設定されている場合、問題なく動作します。AJAX は適切にフォーマットされているように見えますが、念のため、フォームに対応する値を入力したときに出力されるものを次に示します。

Full JSON - {"wsid":"4","page":"1","banner_area1":"link1",
"banner_area2":"link2","banner_area3":"link3",
"uid":"1","fid":"1","assignment_type":"family"}

まず最初に、対応する ajax 応答のコントローラー メソッドで機能しているものから始めましょう。

$data = array(
'status'    => 'success',
'image'     => //static image link
);

$this->output->set_content_type('text/javascript;charset=UTF-8');
echo json_encode($data);

しかし、次のように変更しようとするたびに:

$preview_data = json_decode($this->input->post('previewInfo'));

//Got this one
mail('me@gmail.com', 'Start Email', 'Some email' ); 
//Empty email
mail('me@gmail.com', 'Dump Post', var_dump($_POST)); 
//Empty email
mail('me@gmail.com', 'Post data', var_dump($preview_data) );
//returns an email with 1 for body
mail('me@gmail.com', 'Post data', print_r($this->input->post()) ); 
//returns an email with 1 for body
mail('me@gmail.com', 'Post data', 
     print_r($this->input->post('previewInfo')) ); 
//returns an email with 1 for body
mail('me@gmail.com', 'Post data', print_r($preview_data) );

$data = array(
'status'    => 'success',
'image'     => //static image link
);

$this->output->set_content_type('text/javascript;charset=UTF-8');
echo json_encode($data);

変更されたものも静的データを返しません。そのため、post 配列が適切に初期化されていないように見えます。誰でもバグを見ますか?

4

2 に答える 2

0

post メソッドで Ajax リクエストを送信する場合は、オプションで を設定typeする必要があります。POST$.ajax

また、asyncデフォルトで true になっているので、設定する必要はありません。さらに、 and とは対照的に、 and.doneの使用を検討する必要があります。これらは間もなく非推奨になる予定です。.failsuccessfail

そのようです:

$.ajax({
    type: "POST",
    url: full_url,
    data: { previewInfo : JSONText }, //Passes necessary form information
    dataType: 'json'
}).done(function (output, textStatus, jqXHR) {
    var reply = output;
    if ( reply.status == "success" ){
        $("#preview").attr("src", reply.image );
    } else {
        alert('Failed to create image preview of the assignment.');
    } 
}).fail(function (jqXHR, textStatus, errorThrown) {
    // now you have the XHR, text status, and error to debug with
});
于 2012-07-17T19:21:52.190 に答える
0

この問題の解決につながる 2 つの問題がありました。

1)

Austin と Gavin が言ったように、var_dump と print_r はブラウザーに出力されるべきではありません。解決策は、Firefox 拡張機能/Chrome でデバッグすることでした。

2)

$preview_data = json_decode($this->input->post('previewInfo'));

に変更されました

$preview_data = json_decode($this->input->post('previewInfo'), true);

json_decode の 2 番目のオプション パラメータは、連想オブジェクトまたはもののリストを期待しているかどうかをメソッドに伝えることです。たまたま、私は読み込んでいて、連想配列が欲しかったのです。

于 2012-08-15T07:29:26.177 に答える