Codeigniter - 如何将JSON作为参数传递到视图中

3
我是一名codeigniter/php网站应用程序开发人员。 我正在尝试在视图加载时以一种方式将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后被发送为字符串,并且其中包含了字符如{和引号,当我将其分配给一个变量时(some_data = "";)JavaScript不喜欢这样。我尝试使用htmlspecialchars也没有效果。
为了取得进展,我试着做了许多事情,最终在控制器中暂时替换了双引号: $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>
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>

谢谢Mohan,我正在按照你建议的正确顺序进行操作,当我写问题时,我将行剪切并粘贴到了错误的顺序中。JSON已经被正确创建,我的问题是如何将其分配给客户端(视图/ JavaScript)上的JavaScript变量。我已经更新了问题以反映这一点。 - user898836
你的代码运行得很好!看起来我在 <?php ?> 标签周围多了一个引号(由于某种原因)... 我已将你的答案标记为正确答案。 - user898836

2

如果你的模型设计得比较合理,那么这个过程不需要写很多代码就可以安全地完成。根据你所发布的JSON数据,我猜测你有一个包含事件信息的数据库,每个事件都存在或不存在。

如果$this->Some_model->get_some_data()返回一个经过类型检查的FALSENULL,那么你可以通过等式运算符在视图中向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字符串的变量在操作之前实际上不为null。您也可以将其设置为整数,重点是使其易于区分。

从外观来看,如果事件实际存在,则至少会有事件数据和创建者作为成员。您可能需要进行更多的健全性检查,我不确定您的模型中有什么。

只需确保PHP变量以语法正确的方式在JS中扩展,或者如果没有数据可供提供,则选择完全更改JS。


谢谢Tim,我的确正在处理事件。正如你怀疑的那样,JSON永远不会为NULL或空。控制器端的JSON很好。我的挑战在于将它分配给客户端(视图/ JavaScript)中的JavaScript变量,因为它包含像{或引号之类的字符(我得到未捕获的异常)。我已更新问题以反映这一点。 - user898836
@user898836 var my_json = <?php echo $data['somedata'];?>; some_data = $.parseJSON(my_json); 这段代码无法正常工作吗? - Tim Post
它经过轻微修改就可以工作了,<?php echo $data['some_data'];?>必须改为<?php echo $some_data;?>,我不需要使用parseJSON。再次感谢! - user898836

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>

谢谢 Cauliture。您是在建议我应该将您的代码放在 <?php ?> 中,而不是我的 <script type="text/javascript">some_data = "";</script> - user898836
不,它在视图文件中可能看起来很丑,但我认为它易于阅读和维护,并且对JavaScript的处理也很好。 - Cauliturtle
isIterable 条件不是必需的。https://stackoverflow.com/a/57439636/2943403 - mickmackusa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接