Php 使用MVC Codeigniter分离页眉和页脚

Php 使用MVC Codeigniter分离页眉和页脚,php,codeigniter,templates,Php,Codeigniter,Templates,我正在寻找一种简单的方法,使相同的页眉和页脚显示所有的时间,同时能够切换出主内容区。我不知道如何用MVC实现这一点。只需为页眉和页脚创建一个视图,并在每页的顶部和底部显示它们。或者,创建一个模板视图并加载它,然后获取其他视图并将它们注入模板的内容区域。无论哪种方式都会让你达到你想要的目的。如果希望自动执行,可以在控制器的构造函数中创建模板视图,并将其保存到控制器类的成员。然后使用它,例如,$this->template将成为模板视图。尝试模块分离:您可以创建主视图 views/master.ph

我正在寻找一种简单的方法,使相同的页眉和页脚显示所有的时间,同时能够切换出主内容区。我不知道如何用MVC实现这一点。

只需为页眉和页脚创建一个视图,并在每页的顶部和底部显示它们。或者,创建一个模板视图并加载它,然后获取其他视图并将它们注入模板的内容区域。无论哪种方式都会让你达到你想要的目的。如果希望自动执行,可以在控制器的构造函数中创建模板视图,并将其保存到控制器类的成员。然后使用它,例如,$this->template将成为模板视图。

尝试模块分离:

您可以创建主视图

views/master.php

$this->load->view('header');
echo $content;
$this->load->view('footer');
class MY_Controller extends Controller
{
    public function __construct()
    {
        parent::__construct();
    }

    public function master_view($content_view, $data)
    {
        $data['content'] = $this->load->view($content_view, $data, true);
        $this->load->view('master', $data);
    }
}
class Items extends MY_Controller
{
    public function __construct()
    {
        parent::__construct();
    }

    public function index()
    {
        $data['items'] = $this->item_model->get_items();
        $this->master_view('items/index', $data);
    }
}
然后使用渲染主视图的方法创建基本控制器。子视图的内容将被加载并传递给主视图

库/MY_Controller.php

$this->load->view('header');
echo $content;
$this->load->view('footer');
class MY_Controller extends Controller
{
    public function __construct()
    {
        parent::__construct();
    }

    public function master_view($content_view, $data)
    {
        $data['content'] = $this->load->view($content_view, $data, true);
        $this->load->view('master', $data);
    }
}
class Items extends MY_Controller
{
    public function __construct()
    {
        parent::__construct();
    }

    public function index()
    {
        $data['items'] = $this->item_model->get_items();
        $this->master_view('items/index', $data);
    }
}
然后扩展这个基本控制器,并从动作方法调用基本控制器的方法

controllers/items.php

$this->load->view('header');
echo $content;
$this->load->view('footer');
class MY_Controller extends Controller
{
    public function __construct()
    {
        parent::__construct();
    }

    public function master_view($content_view, $data)
    {
        $data['content'] = $this->load->view($content_view, $data, true);
        $this->load->view('master', $data);
    }
}
class Items extends MY_Controller
{
    public function __construct()
    {
        parent::__construct();
    }

    public function index()
    {
        $data['items'] = $this->item_model->get_items();
        $this->master_view('items/index', $data);
    }
}

它往往比在每个视图中加载页眉和页脚更干燥。

与上面类似,我这样做:

$this->data['content']='your_content_view';
$this->load->vars($this->data);
$this->load->view('template');
然后在模板视图中:

$this->load->view('header');
$this->load->view($content);
$this->load->view('footer');
视图可以加载其他视图,因此模板视图加载页眉视图,然后加载内容中指定的视图,然后加载页脚视图


使用这个想法,你可以将侧边栏视图加载到内容中,等等。

你是说我必须在每个视图的顶部添加侧边栏视图吗?如果你挠头思考WTF,那是浪费!!!那么恭喜你!!你已经从MVC大学毕业了!MVC旨在使站点可维护,不易构建。有意地需要更长的时间来创建所有内容。如果启用缓存,它将被CI缓存。但是,它将在每次加载新页面时处理该文件,因为每个页面都算作自己的东西。我不会担心,除非“header”指的是大量的边栏和数据库调用的繁重过程。在这一点上。救命啊!或者把CI缓存的核心撕下来,在一个具体的实例上使用它。由于浏览器和ISP会缓存图像,所以图像不会。这不属于CI的管辖范围。不管缓存如何,每次页面加载都会下载动态文本。如果您担心这个问题,可以使用memcached,它可以让您在内存中存储整个变量和字符串。然后,您可以在memcache中“标记”页眉/页脚,因为它不会改变,而且加载速度会非常快。但是你仍然需要将它发送给用户。这是值得详细讨论的。请随时查找我并给我发送电子邮件,我将与您详细讨论。
items/index
items控制器中的index()函数正确吗?我很困惑,这将是一个递归调用。