【问题标题】:How to handle menu template effectively in Codeigniter?如何在 Codeigniter 中有效处理菜单模板?
【发布时间】:2011-02-06 02:22:17
【问题描述】:

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

查看/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 时,谁能给我建议一个更好的方法?

谢谢,

【问题讨论】:

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

标签: php codeigniter templates


【解决方案1】:

我会采取 2 种不同的措施来解决这种情况。

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

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

假设你是 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,这样您就不会在每个控制器构造函数中重复自己)

【讨论】:

    【解决方案2】:

    当涉及到模板和部分时,您应该考虑使用模板库,而不是使用 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

    【讨论】:

      猜你喜欢
      • 2010-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-10
      • 1970-01-01
      相关资源
      最近更新 更多