Php 如何在Codeigniter中有效地处理菜单模板?

Php 如何在Codeigniter中有效地处理菜单模板?,php,codeigniter,templates,Php,Codeigniter,Templates,我正在寻找更好的方法来处理我的模板。 现在,我的模板如下所示: function show_pageA() { /* */ /* */ /* */ /*

我正在寻找更好的方法来处理我的模板。 现在,我的模板如下所示:

function show_pageA() {
    /*                                           */
    /*                                           */
    /*                                           */
    /*                                           */
    /*                                           */
    /* 10 lines menu related codes here          */
    /* mainly to get variables from databas      */
    /*                                           */
    /*                                           */
    /*                                           */
    /*                                           */

    $data['menu'] = array of variables pulled from previous line        
    $data['main_content'] = 'pageA';                
    $this->load->view('template',$data);
}

function show_pageB() {
    /*                                           */
    /*                                           */
    /*                                           */
    /*                                           */
    /*                                           */
    /* 10 lines menu related codes here          */
    /* mainly to get variables from databas      */
    /*                                           */
    /*                                           */
    /*                                           */
    /*                                           */

    $data['menu'] = array of variables pulled from previous line        
    $data['main_content'] = 'pageB';                
    $this->load->view('template',$data);
}
view/template.php

$this->load->view('includes/menu', $menu);  
$this->load->view('includes/content', $main_content);   
我的模板中的菜单使用了数据库中的几个变量

我的控制器看起来像这样:

function show_pageA() {
    /*                                           */
    /*                                           */
    /*                                           */
    /*                                           */
    /*                                           */
    /* 10 lines menu related codes here          */
    /* mainly to get variables from databas      */
    /*                                           */
    /*                                           */
    /*                                           */
    /*                                           */

    $data['menu'] = array of variables pulled from previous line        
    $data['main_content'] = 'pageA';                
    $this->load->view('template',$data);
}

function show_pageB() {
    /*                                           */
    /*                                           */
    /*                                           */
    /*                                           */
    /*                                           */
    /* 10 lines menu related codes here          */
    /* mainly to get variables from databas      */
    /*                                           */
    /*                                           */
    /*                                           */
    /*                                           */

    $data['menu'] = array of variables pulled from previous line        
    $data['main_content'] = 'pageB';                
    $this->load->view('template',$data);
}
正如您所看到的,每个页面函数都有10行与菜单相关的代码,这对我来说似乎是多余的

在练习MVC时,有人能给我一个更好的方法吗


谢谢,

我会做两件不同的事情来补救这种情况

  • 我会将这10行代码打包成一个,因为正如您所说,它与数据库交互。可以创建一个
    菜单\u model
    ,它有一个
    get()
    函数,用于返回需要加载到视图中的项目数组。然后在每个控制器中调用它将非常简单

    $data['menu'] = $this->menu_model->get();  //assuming you autoload this model
    
  • 但不要停止,因为这仍然是每个控制器功能中的重复代码行。让我们在控制器的构造函数中执行此操作,以便在我们生成的所有视图中全局加载这些选项

  • 假设你是php5

    然后,您的控制器函数将如下所示

    function show_pageA() {       
        $data['main_content'] = 'pageA';                
        $this->load->view('template',$data);
    }
    

    (另外,如果此“菜单”逻辑跨越多个控制器,我建议滚动包含此逻辑的自定义
    MY_Controller.php
    ,这样您就不会在每个控制器构造函数中重复自己)

    而不是在模板和部分时使用Codeigniter视图,您应该考虑使用模板库。你可能会发现周围有很多有用的东西,它们大多处理面包屑导航、查看片段和其他你想做的很棒的事情

    我在我的Codeigniter项目中使用Phil Sturgeon的模板库,因为它很轻而且可以正常工作:

    Colin Williams模板库是另一个流行的模板库:http://williamsconcepts.com/ci/codeigniter/libraries/template/

    一些人似乎喜欢使用直观模板库:

    当你说“菜单”时,你指的是导航吗?