【问题标题】:codeigniter footer hook or extending CI_Controllercodeigniter 页脚挂钩或扩展 CI_Controller
【发布时间】:2013-12-21 10:33:18
【问题描述】:

我正在使用 Codeigniter 构建我的页面,但遇到了一个小问题,我正在使用模板浏览我的页面。这些模板包含页眉、main_content 和页脚。到现在为止还可以,但后来我意识到,我想将一些数据放入需要从数据库加载的页脚中。类似于搜索次数最多的 10 个字词。

我正在寻找一种合适的方法来做这件事,我在两个选项之间做出了决定。我可以将我的 CI_Controller 扩展到 application/core/ 中的 MY_Controller 中,或者我可以创建一个挂钩来准备要传递给每个控制器的数据。

还有其他可能更好的选择吗?

【问题讨论】:

  • 取决于您从数据库中带来的数据,它将被预加载或最近 10 个搜索最多的词(如果已加载),它们只是将数据添加到页脚部分的模板中
  • 如何加载模板(页眉、内容、页脚)?如果它来自图书馆,那么您可以轻松完成。
  • 我还需要从列表中搜索数据库中的索引,以便为列表项创建适当的锚。
  • @kumar_v 我有多个模板可供选择,但每个模板都包含页眉、内容和页脚。我这样做:$data['main_content']="home_page"; $this->load->view('templates/default', $data);
  • 请参考我在 SO 中的回答。 stackoverflow.com/a/20608610/270037

标签: codeigniter footer


【解决方案1】:

我在一个名为_load_view 的MY_Controller 中有一个函数。确保在控制器中扩展父控制器。我拥有的函数如下所示......这是在application > core > MY_Controller.php

public function _load_view($page,$data = null) {
    $data['view'] = $page; // used for a css document based on the view you're on

    $this->load->view('header/header',$data); // header contains all the meta tags/header js/css
    $this->load->view('navigation',$data); // simply just contains the navigation (only did this for ease of updating the navigation)
    $this->load->view($page,$data); // this loads your content page that would be the template that you insert all your data from your controller into
    $this->load->view('footer/footer',$data); // finally load the footer, containing js, and all that fun stuff.    
}

注意:页脚视图文件和头文件将放在views文件夹内的页眉和页脚目录中。

在你的默认控制器中确保你有以下程度的东西......

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); // makes it so that there is no way that someone can access this file

class Home extends MY_Controller {
    public function index() {
        $data = array();
        $this->_load_view('view_file',$data); // references the function you created in the parent class.
    }
 }

就数据库查询而言,我建议在_load_view() 函数中执行此操作。这样可以确保数据在每个页面上都可用,并且可以防止您一遍又一遍地重写代码。我认为它是帮助程序的方式是您需要全面访问的功能。在模型中进行查询,然后在控制器中加载函数。

这可确保您在每个页面上都加载了页眉、导航和页脚,并且它们是一致的。传入 $data 数组是可选的,因为如果数据未通过,它将默认为 null,并且它将在所有模板中可用。顺序也很重要。希望这可以帮助!如果您有任何问题,请告诉我,我会相应地更新我的答案!

【讨论】:

  • 这是一个很好的实现,我尝试使用它并且它可以工作,但我仍然需要调用我的方法来加载我加载视图的每个控制器中的页脚的所有数据。是否有类似在 MY_Controller 的构造函数中加载视图的所有数据,然后使用变量?那太棒了,我会尝试的 :) 如果它不起作用,我会将您的答案标记为正确的 :) 现在非常感谢。
  • 全局数据可以在_load_view()中完成。只要您扩展 MY_Controller,就可以将其视为控制器本身的任何普通函数。在 MY_Controller 中,我会确保您加载 CI 实例。只要您将它作为 $data 变量索引传递给 _load_view() 方法,它就应该可以工作。希望这是有道理的。这是一个关于思想的回合,哈哈。
  • 好的,这就是我所做的。我在 MY_Controller 中定义了一个全局变量,然后用 MY_Controller 中的一些数据填充它。现在,当我使用 MY_Controller 扩展任何控制器并编写类似 $this-&gt;data 的内容时,我不必在任何地方调用任何其他方法,因为一切都已经在构造函数中完成了:)
  • 也可以。只要您将数据公开。我只会在该方法中完成工作,因为无论如何您都会在加载视图时调用它。因此,无论您如何加载它,视图都可以使用它,如果您不需要专门从控制器传递任何数据,那么您仍然拥有全局数据,因为参数中的默认 $data = null .因此,不需要在控制器中包含数据的那一行,仅以它为例。全局变量也与我的方法具有相同的效果。
【解决方案2】:

您知道您可以在控制器中调用数据库查询并放入 $data 吗? 例如$data['footer'] = ....

然后在这种情况下你正在加载的视图模板/默认你回显 $footer

【讨论】:

  • 您的意思是在所有控制器及其功能中?
  • 这正是我想要避免的:)
  • 你可以把它放在一个会话中
  • 我没想到,这是个好主意。但我不知道要不要放这么多数据。
猜你喜欢
  • 2011-11-29
  • 2012-07-27
  • 1970-01-01
  • 2016-10-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多