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
相关产品推荐
相关产品推荐

