You need to enable JavaScript to run this app. CodeIgniter动态模板下控制器向视图传值报未定义变量如何解决?
优惠活动
大模型
产品
解决方案
定价
更多

CodeIgniter动态模板下控制器向视图传值报未定义变量如何解决?

问题原因分析
  • 控制器执行逻辑顺序错误:触发addBook逻辑时,你仅将$data传入了单独加载的book视图,但后续代码仍会强制执行$this->load->view('index', $page_data)输出模板,$page_data未合并$data内的字段,因此嵌入在index模板内的book视图无法读取到$title、$category变量。
  • 前后端响应格式不匹配:前端使用AJAX提交表单,要求返回JSON格式,但你当前addBook逻辑返回的是HTML视图内容,会导致前端AJAX解析失败,无法正常处理返回结果。
解决方案

方案1:保留AJAX异步提交(无刷新更新页面,推荐)

步骤1:修改控制器addBook逻辑

将加载视图的代码替换为返回JSON响应,终止后续模板加载:

class AdminController extends CI_Controller
{
    public function book_controller($param1 = '')
    {
        $page_data['page_name']       = 'book';
        $page_data['page_title']      = 'Book';
        $page_data['page_function']   = __FUNCTION__;
        $page_data['page_breadcrumb'] = generate_breadcrumb(array('Book'));

        if ($param1 == 'addBook') {
            $data['title']     = $this->input->post('title');
            $data['category']  = $this->input->post('category');
            $this->md_book->addBook($data);

            // 构造JSON响应
            $resp = [
                'status' => 'success',
                'msg' => '书籍添加成功',
                'title' => $data['title'],
                'category' => $data['category']
            ];
            echo json_encode($resp);
            // 终止后续代码执行,避免输出index模板
            return;
        } else if ($param1 == 'updateBook') {
            //
        } else if ($param1 == 'deleteBook') {
            //
        } 

        $this->load->view('index', $page_data);
    }
}

步骤2:修改视图代码,新增内容展示容器

<div class="body">
    <?php echo form_open('admincontroller', array('id' => 'add-form', 'autocomplete' => "off")); ?>
    /** form add book */
    <?php echo form_close(); ?>

    <h2>Book Added! </h2>
    <!-- 新增容器,默认隐藏 -->
    <div id="added_book_info" style="display:none;">
        <?php echo $title ?? '' ?>
        <?php echo $category ?? '' ?>
    </div>
</div>

步骤3:修改AJAX成功回调,动态插入内容

success: function(resp) {
    if (resp['status'] == 'success') {
        $("#add-form")[0].reset();
        // 插入返回的书籍信息并展示
        $('#added_book_info').html(resp.title + '<br>' + resp.category).show();
    }
    return swal({
        html: true,
        timer: 1300,
        showConfirmButton: false,
        title: resp['msg'],
        type: resp['status'],
    });
}

方案2:同步提交表单(刷新页面展示内容)

如果你不需要异步提交,可以去掉前端AJAX逻辑,改用原生表单提交,修改控制器代码即可:

if ($param1 == 'addBook') {
    $data['title']     = $this->input->post('title');
    $data['category']  = $this->input->post('category');
    $this->md_book->addBook($data);
    // 将提交的字段合并到模板变量$page_data中
    $page_data = array_merge($page_data, $data);
}
// 统一加载index模板,此时嵌入的book视图可正常读取变量
$this->load->view('index', $page_data);

内容的提问来源于stack exchange,提问作者man99

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 12:24:01