包括CodeIgniter站点的多个标头


Including multiple headers across CodeIgniter site

我正在做一个相当大的CodeIgniter项目。书多得我数不清。现在,我有几个不同的头,这取决于用户访问的页面,也取决于用户是否登录。例如,如果用户没有登录(没有存储会话变量),那么我想显示header1,其中显示了一些基本的东西,如"注册,登录"。如果用户已经登录,我想显示不同的菜单项,如"注销"。这是一个非常基本的例子。这些变化可能相当广泛,所以对我来说,在一个头文件中包含控制流逻辑是没有意义的。

我正在寻找一种方法来包括适当的头,而不必在我的控制器中的每个方法中编写$this->load->view('header')。看起来另一种选择是在所有视图中写入这一行。为了使其动态,我创建了一个MY_Controller文件,并在其中包含如下内容:

public function get_header()
{
    if ($this->session->userdata('user_id')) {
        $this->load->view('headers/logged-header');
    } else {
        $this->load->view('headers/header-home');
    }
}

然后我将<?php MY_CONTROLLER::get_header(); ?>包含在我需要它的地方(即方法或视图内)

是否有一种方法来"钩"这个在某种程度上,我可以简单地写这段代码一次,然后应用程序处理它每次它加载我的一个方法调用一个页面?

这是一个非常典型的需求,可以通过使用面向对象来轻松处理,CI在其所有控制器中都使用了面向对象。
因为你所有的自定义控制器都必须继承CI_Controller,你可以只写一个继承CI_Controllerbase控制器(类),它做一些非常基本的事情,比如:

  • 在其__construct中执行一些所有子类可能需要的基本操作(例如:auto login logic,你可以把get_header放在这里)
  • 提供methods的所有子类可能需要像右检查分页小部件生成器

可能最简单的方法是在所有控制器的构造函数方法中调用该函数。这样它每次都会被类中的每个方法调用。只要确保先调用父构造函数。