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

时间:2011-02-06 02:22:17

标签: php codeigniter templates

我正在寻找一种更好的方法来处理我的模板。 现在,我的模板看起来像这样:

查看/的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时有更好的方法吗?

谢谢,

2 个答案:

答案 0 :(得分:4)

我会采取两种不同的方法来解决这种情况。

  1. 我会将这10行代码打包成Model,因为正如你所说,它与数据库交互。也许创建一个Menu_model,其get()函数返回您需要加载到视图中的项目数组。然后在每个控制器中调用它就像

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

  3. 假设你是php5'd

    function __construct() {
        parent::__construct();
    
        //get menu data
        $global_data['menu'] = $this->menu_model->get();
    
        //load into all views loaded by this controller
        $this->load->vars($global_data);
    }
    

    然后,您的控制器功能将如下所示。

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

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

答案 1 :(得分:1)

在使用模板和部分时,不应使用Codeigniter视图,而应考虑使用模板库。你可能会发现有很多有用的东西,他们都主要处理面包屑导航,查看局部和你想要做的其他很棒的东西。

我在我的Codeigniter项目中使用了Phil Sturgeon的模板库,因为它很轻巧而且很有效:http://philsturgeon.co.uk/code/codeigniter-template

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

有些人似乎喜欢使用Ocular模板库:https://github.com/lonnieezell/Ocular-Template-Library