CodeIgniter 3 全局变量问题:通知变量仅后台首页可用
后台全局通知变量配置问题
我开发的后台仪表盘头部在所有页面都显示,最初在Admin控制器的index方法中添加了通知相关变量:
class Admin_controller extends Admin_Core_Controller { public function __construct() { parent::__construct(); } public function index() { $data['notification_count'] = $this->order_admin_model->get_all_notifications_count(); $data['notification'] = $this->order_admin_model->get_all_notifications(); $this->load->view('admin/includes/_header', $data); $this->load->view('admin/index'); $this->load->view('admin/includes/_footer'); } }
但问题是这两个变量仅在后台首页(index)可用,打开其他页面时会出现“未定义变量”的错误,请问如何让这两个变量在所有后台页面全局可用?
$data['notification_count'] = $this->order_admin_model->get_all_notifications_count(); $data['notification'] = $this->order_admin_model->get_all_notifications();
解决方案:通过核心控制器注入全局变量
项目中有一个Admin_Core_Controller.php文件,它继承自Core_Controller,通过修改该控制器中的render方法,将通知变量全局注入到所有视图中:
class Admin_Core_Controller extends Core_Controller { public function __construct() { parent::__construct(); if (!is_admin()) { redirect(admin_url() . 'login'); exit(); } // 设置控制面板语言 $this->control_panel_lang = $this->selected_lang; if (!empty($this->session->userdata('mds_control_panel_lang'))) { $this->control_panel_lang = $this->session->userdata('mds_control_panel_lang'); // 加载语言翻译 $this->language_translations = $this->get_translation_array($this->control_panel_lang->id); } // 执行定时清理任务 if (check_cron_time_long() == true) { // 删除旧会话 $this->settings_model->delete_old_sessions(); // 更新定时任务最后执行时间 $this->db->where('id', 1)->update('general_settings', ['last_cron_update_long' => date('Y-m-d H:i:s')]); } } protected function render($view, $data = NULL) { // 全局注入通知变量 $data['notification_count'] = $this->order_admin_model->get_all_notifications_count(); $data['notification'] = $this->order_admin_model->get_all_notifications(); $this->load->view('admin/includes/_header', $data); $this->load->view($view, $data); $this->load->view('admin/includes/_footer'); } public function paginate($url, $total_rows) { // 初始化分页配置 $page = $this->security->xss_clean($this->input->get('page')); $per_page = $this->input->get('show', true); $page = clean_number($page); if (empty($page) || $page <= 0) { $page = 0; } if ($page != 0) { $page = $page - 1; } if (empty($per_page)) { $per_page = 15; } $config['num_links'] = 4; $config['base_url'] = $url; $config['total_rows'] = $total_rows; $config['per_page'] = $per_page; $config['reuse_query_string'] = true; $this->pagination->initialize($config); return array('per_page' => $per_page, 'offset' => $page * $per_page); } }
随后修改Admin_controller的index方法,直接使用核心控制器的render方法加载视图(无需重复加载头部和底部):
class Admin_controller extends Admin_Core_Controller { public function __construct() { parent::__construct(); } public function index() { $data['title'] = trans("admin_panel"); $data['order_count'] = $this->order_admin_model->get_all_orders_count(); $data['product_count'] = $this->product_admin_model->get_products_count(); $data['pending_product_count'] = $this->product_admin_model->get_pending_products_count(); $data['blog_posts_count'] = $this->blog_model->get_all_posts_count(); $data['members_count'] = $this->auth_model->get_users_count_by_role('member'); $data['latest_orders'] = $this->order_admin_model->get_orders_limited(15); $data['latest_pending_products'] = $this->product_admin_model->get_latest_pending_products(15); $data['latest_products'] = $this->product_admin_model->get_latest_products(15); $data['latest_reviews'] = $this->review_model->get_latest_reviews(15); $data['latest_comments'] = $this->comment_model->get_latest_comments(15); $data['latest_members'] = $this->auth_model->get_latest_members(6); $data['latest_transactions'] = $this->transaction_model->get_transactions_limited(15); $data['latest_promoted_transactions'] = $this->transaction_model->get_promoted_transactions_limited(15); $this->render('admin/index', $data); } }
修改完成后,后台所有页面都能正常获取通知变量,仪表盘也可以实现每秒自动刷新的需求。
内容的提问来源于stack exchange,提问作者Lucas
相关产品推荐
相关产品推荐

