【问题标题】:CodeIgniter - JSON transit between Controler and ViewCodeIgniter - 控制器和视图之间的 JSON 传输
【发布时间】:2016-08-18 12:23:31
【问题描述】:

这是我在这里的第一个问题。我浏览了许多其他网站、教程和问题,但无法找到我的问题的答案,最终我决定发布它,希望找到解决方案并希望帮助其他面临同样困难的人。

就是这样:我目前正在尝试使用我的一个控制器在数据库查询后创建的 JSON。在我的第一个视图中使用表单后,我获得了创建 JSON 所需的数据(见下文)。在第一个视图中提交表单使控制器加载第二个视图,在加载后,由于加载时传递的数据,控制器需要向其发送 JSON。

不幸的是,我在第二个视图中似乎无法获得 JSON。我尝试构建一个示例 JSON 并且它可以工作(两个警报都会出现),但是一旦我尝试从输入中获取它,它就不会。

以前有人遇到过同样的问题吗?有什么我做错了吗?感谢您的帮助!

我的控制器: (Recherche.php)

class Recherche extends CI_Controller {
    public function __construct() {
        parent::__construct();
        $this->load->model('Recherche_Model');
    }

    public function rechercheJardins() {
            $data['liste'] = $this->Recherche_Model->get();
            $this->load->view('my_view', $data);
     }

    public function sendJson() {
        $array = $this->input->post('liste');
        $liste = $this->jardinToArray($array);
        echo json_encode($liste);
    }
}

我在这里简化了 rechercheJardins 方法,因为我知道它可以完成工作并返回正确的数据。 jardinToArray 方法只是将我的数据转换为一个数组(显然......)并且也可以正常工作。

我的 JS 脚本: (my_script.js)

jQuery(document).ready(function () {
    jQuery.ajax({
        type: 'post',
        url: 'http://localhost/garden/Recherche/sendJson',
        dataType: 'json',
        success: function (data, statut) {
            alert('Success');
            alert(data);
        }
    });
});

我的第一眼:

<div id="recherche-accueil">
    <?php
    $formRecherche = form_open('Recherche/rechercheJardins');
    $formRecherche.= form_input('ville', null, 'placeholder="Où souhaitez-vous aller ?"');
    $formRecherche.= form_date('arrivee', null, 'placeholder="Date d\'arrivée"');
    $formRecherche.= form_date('depart', null, 'placeholder="Date de départ"');
    $formRecherche.= form_submit('rechercher', 'Rechercher');
    $formRecherche .= form_close();
    echo $formRecherche;
    ?>
</div>

我的第二个视图头:(因为我现在只是想提醒结果)(my_view.php)

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
?>
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title>Project garden</title>
        <?php 
        echo '<link rel="stylesheet" href="' . base_url('public/css/style.css') . '">';
        echo '<script type="text/javascript" src="' . base_url('public/js/jquery-3.1.0.js') . '"></script>';
        echo '<script type="text/javascript" src="' . base_url('public/js/my_script.js') . '"></script>'
        ?>

    </head>

编辑: 经过多次试验,似乎问题肯定来自“$array = $this->input->post('liste');” sendJson 方法中的行。我试图用它应该返回的样本来替换它,看看它是否有效并且确实有效。 虽然我似乎无法弄清楚为什么......

【问题讨论】:

  • 提示:使用 console.log() 检查通过 ajax 请求的内容。 (它出现在控制台浏览器中,按f12打开它)
  • 好吧,它似乎什么都没有,因为它甚至没有出现成功子句的第一个警报,而它是纯文本。
  • console.log 输出什么?
  • 绝对没有。
  • 尝试直接访问网址,显示什么?

标签: javascript php json ajax codeigniter


【解决方案1】:

提交的表单(第一个视图)没有名称为 'liste' 的字段,因此 $this-&gt;input-&gt;post('liste')(在您的控制器的 public function sendJson() 中)返回 null。


更新:

您也不需要两个视图文件。 Javascripts 和表单可以在同一个文件中:

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Project garden</title>
    <?php 
        echo '<link rel="stylesheet" href="' . base_url('public/css/style.css') . '">';
        echo '<script type="text/javascript" src="' . base_url('public/js/jquery-3.1.0.js') . '"></script>';
        echo '<script type="text/javascript" src="' . base_url('public/js/my_script.js') . '"></script>'
        ?>
</head>

<body>
<div id="recherche-accueil">
    <?php
    $formRecherche = form_open('Recherche/rechercheJardins');
    $formRecherche.= form_input('ville', null, 'placeholder="Où souhaitez-vous aller ?"');
    $formRecherche.= form_date('arrivee', null, 'placeholder="Date d\'arrivée"');
    $formRecherche.= form_date('depart', null, 'placeholder="Date de départ"');
    $formRecherche.= form_submit('rechercher', 'Rechercher');
    $formRecherche .= form_close();
    echo $formRecherche;
    ?>
</div>
</body>
</html>

然后,编辑您的主 js 脚本,以便发送发布的数据(阅读此答案:Submitting HTML form using Jquery AJAX)。

另一种选择:

如果您只想将数据从控制器传递到表单,则不需要通过 ajax 进行。您可以直接将其传递给视图。

【讨论】:

  • 当然,但它不是由控制器在第一页和第二页之间构建和发送的吗? (rechercheJardin 方法)
  • 在你的 ajax 中你没有发布任何值来接收 $this->input->post('liste');这个这个帖子请求所以首先你应该在你的ajax中添加参数。
  • 好吧,但是既然我是从 php 得到所说的数据,我怎么能把它放在我的 ajax 中呢?我需要在加载视图之前立即发布吗?但是两次发送相同的数据......? (对不起,如果我的问题听起来很愚蠢,我只是不明白其中的逻辑)
  • 对 ajax 调用的回复方法不需要加载视图(这就是您在 function sendJson() 中编程的方式)。您也不需要发送两次数据,只需将发布的数据处理到function sendJson()即可。
  • 我认为您的代码还有另一个错误。您不需要两个视图文件;一个就够了。看看更新的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
  • 2014-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多