3

我正在构建一个 codeigniter/php web 应用程序。我试图在加载视图时将 JSON 对象从控制器传递到视图,以使 javascript 可以访问它。

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 之后),因此它具有诸如 { 和引号之类的字符作为其中的一部分,当我将其分配给 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 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如果不存在结果,则可以使用相等运算符进行验证,您可以安全地将其表达到视图中的 JS,就像您可以传达 JSON 一样。

例如:

$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 字符串的变量在对其进行操作之前实际上不为空。您也可以将其设置为整数,重点是使其易于区分。

从外观上看,如果事件确实存在,您至少将拥有事件数据和创建它的人作为成员。您可能需要做更多的完整性检查,我不确定您的模型中有什么。

只需确保 PHP 变量在您的 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 回答