我正在使用CodeIgniter并在网站上有一个菜单,需要从数据库中读取城市列表。如果只是在一两页上,这很简单 - 我加载模型并从控制器调用一个函数,并将数据传递给视图。
但如果我想在每个页面上使用它,那意味着我必须将相同的代码复制到每个控制器函数并将数据传递到视图中。 (注意,我正在使用包含菜单的单独“标题”视图。)
在每个页面加载时自动加载某些数据并将其提供给我的视图的最佳方法是什么?
答案 0 :(得分:10)
创建一个新的根控制器类,如MY_Controller
。
您可以在此处阅读:https://www.codeigniter.com/user_guide/general/core_classes.html
然后让所有控制器扩展该类。
在MY_Controller
中添加一个函数,如下所示:
function show_view_with_menu($view_name, $data) {
$menu_data = $this->menu_model->get_menu(); // load your menu data from the db
$this->load->view('header', $menu_data); // display your header by giving it the menu
$this->load->view($view_name, $data); // the actual view you wanna load
$this->load->view('footer'); // footer, if you have one
}
每当您正常加载视图时,请执行以下操作:
$this->show_view_with_menu('view_for_this_controller', $data);
答案 1 :(得分:0)
您定义了自己的Application_Controller
,其范围为CI_Controller
。然后,您自己的所有控制器都会扩展您的Application_Controller
而不是CI_Controller
。
在__construct()
的{{1}}中,您将介绍以前在任何地方复制和粘贴的代码。
答案 2 :(得分:0)
我的解决方案只是创建一个处理这些东西的显示类。简化版本:
class Display
{
public function load_pages($name, $data = array()) {
$CI =& get_instance();
// Top and header templates
$CI->load->view('header.php', $data);
// Default to loading the one template file
$CI->load->view($name, $data);
// Footer template
$CI->load->view('footer.php');
}
}
我有更好的东西,例如设置默认值(页面标题,元标记)和加载js / css等。它就像一个快捷方式,必须复制/粘贴我加载的常规模板,但也允许我在需要时定义一个自定义模板设置,不像你有这样做,自动扩展你的控制器类。
我没有必要,但您也可以在此类中指定不同的功能来加载网站的不同部分,例如load_admin_pages()
或其他部分。在我的情况下,我只是通过设置一个前缀参数来处理它,这个参数被添加到文件路径中,并且得到了我当前项目所需的内容。