You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 23:35:18