3

私はcodeigniter/phpWebアプリケーションを構築しています。ビューがロードされたときに、JavaScriptからアクセスできるように、JSONオブジェクトをコントローラーからビューに渡そうとしています。

JSONは次のようになります。

{
    "event": {
        "id": "1",
        "name": "Some name",
        "description": "Some description",
        "address": "1 Main st."
    },
    "members": {
        "others": [
            {
                "id": "26",
                "name": "Brad Black"
            },
            {
                "id": "27",
                "name": "Bill Blue"
            }
        ],
        "current": {
            "id": "1",
            "name": "Jill White"
        }
    }
}

コントローラコードは次のようになります。

public function index()
{
    $some_data = $this->Some_model->get_some_data();

    $some_data = json_encode($some_data);

    $data = array (
            'some_data' => $some_data
    );

    $this->load->view('some_view',$data);
}

ビュー(some_view)コードは次のようになります。

<script src="path/to/scripts/some_script.js" type="text/javascript"></script>

<script type="text/javascript">

    some_data = "<?php echo $some_data?>";

</script>

<div class="main">
</div>

javascript(some_script)コードは次のようになります。

var some_data;

$(document).ready(function(){

    some_data = $.parseJSON(some_data);
});

課題は、JSONオブジェクトが(json_encodeの後に)文字列として送信されるため、{などの文字が含まれ、その一部として引用符が含まれていることです。これは、JavaScriptがvar(some_data = "")に割り当てるときに気に入らないものです。 ;)。私も使ってみましたが、うまくいきません。

私はうまくいかなかったたくさんのことをやってみました、進歩を遂げるために私は一時的にコントローラーの"を置き換えることになりました$ data ['some_data'] = str_replace('"'、" ""、$ some_data);

public function index()
{
    $some_data = $this->Some_model->get_some_data();

    $some_data = json_encode($some_data);

    $data = array (
            'some_data' => str_replace('"', "&quot;", $some_data);
    );

    $this->load->view('some_view',$data);
}

そして、javascript内の「backto」を置換しますsome_data = some_data.replace(/ "/ g、'"');

var some_data;

$(document).ready(function(){

    event_data = event_data.replace(/&quot;/g, '"');
    some_data = $.parseJSON(some_data);
});

これはちょっと醜いです、そして私はより良い解決策を探しています。

どんなポインタでも大歓迎です。

アップデート! 問題は解決しました。余分な引用符が問題を引き起こしているようです。

解決策はmohan.gadeの答えと一致しています:

コントローラ:

public function index()
{
    $some_data = $this->Some_model->get_some_data();

    $some_data = json_encode($some_data);

    $data = array (
            'some_data' => $some_data;
    );

    $this->load->view('some_view',$data);
}

意見:

    some_data = <?php echo $some_data?>;

</script>
4

3 に答える 3

2

JSON値がビューに渡されませんでした。次のコードを修正してみてください。

public function index()
{
    $some_data = $this->Some_model->get_some_data();
    $some_data = json_encode($some_data);
    $data = array (
            'some_data' => $some_data
    );
        $this->load->view('some_view',$data);

}



//in view file 
   <script type="text/javascript">
     var jsonData = <?php echo $some_data; ?>
   </script>
于 2012-12-05T04:24:59.237 に答える
2

これは、モデルにある程度の健全性があれば、多くのコードなしで安全に実行できます。あなたが投稿したJSONは、イベントを含むデータベースがあり、イベントが存在するか存在しないかのどちらかであると私に信じさせます。

$this->Some_model->get_some_data()型付きを返す場合、FALSEまたはNULL結果が存在しない場合に等式演算子で検証できる場合は、JSONを伝達するのと同じ方法で、ビュー内のJSにこれを安全に表現できます。

例えば:

$some_data = $this->Some_model->get_some_data();
if ($some_data === NULL) {
     $data['somedata'] = 'null';
} else {
     // We trust our model, pass it along.
     $data['somedata'] = json_encode($some_data);
}
$this->load->view('some_view', $data);

次に、JSで、生のJSON文字列を含む変数が実際にnullでないことを確認してから、操作します。整数として設定することもできます。ポイントは、区別しやすくすることです。

見た目からすると、イベントが実際に存在する場合は、少なくともイベントデータとそれを作成した人がメンバーとして存在します。それよりも多くの健全性チェックを行う必要があるかもしれません。モデルに何が含まれているかわかりません。

PHP変数がJS内で構文的に正しい方法で展開されていることを確認するか、またはJSをフィードするデータが存在しない場合は、JSを完全に変更することを選択してください。

于 2012-12-05T04:43:20.707 に答える
0

json_encodeはnull、空の変数が渡された場合に返されるため"、ビューコードでそれをエスケープする必要はありません。代わりに、変数が配列であるか、別のコードを生成するために渡すオブジェクトであるかを確認する必要があります。

あなたの例:

if( is_array( $_var_value ) || is_object( $_var_value) ){
    echo 'var ' . $_var_name . ' = ' . json_encode( $_var_value ) . ";";
}else{ // if( is_string( $_var_value ) ){
    echo 'var ' . $_var_name . ' = "' .  $_var_value  . '";';
}

あなたの場合のために更新

 <script type="text/javascript">
     <?php if( is_array( $_var_value ) || is_object( $_var_value) ){ ?>
     var some_data = <?php echo json_encode($some_data); ?>;
     <?php }else{ ?>
     var some_data = "<?php echo $some_data; ?>";
     <?php } ?>
 </script>
于 2012-12-05T02:52:43.580 に答える