Codeigniter 站点范围的视图

Posted

技术标签:

【中文标题】Codeigniter 站点范围的视图【英文标题】:Codeigniter site wide views 【发布时间】:2012-06-26 13:53:32 【问题描述】:

我需要在我的 codeigniter 站点的侧边栏中实现广告。

广告是动态的并从数据库中检索。我当前的设置是我有主模板文件,我将主视图文件的名称作为变量传递给,如下所示:

$data['main_content'] = 'some_view_file';
$this->load->view('template_file', $data);

我想到了以下步骤:

    在我的MY_Controller 中创建一个函数get_ads() 并检索所有广告并将其返回 在我的每个控制器方法中,我访问上面创建的函数并将其传递给模板

$data['ads'] = $this->get_ads();
$data['main_content'] = 'some_view_file';
$this->load->view('template_file', $data);

但上述方法的问题是,在加载视图之前,我需要在所有方法中设置$data['ads'] = $this->get_ads();

处理上述问题的更好方法是什么?

【问题讨论】:

【参考方案1】:

创建一个名为 Ads.php 的 CodeIgniter 库

class Ads


    private $CI;

    public function __construct()
    
        $this->CI = & get_instance();
    

    public function my_ads()
    
        // get the ads from database //
        return $this->CI->db->select('field1, field2, field3')->from('ads_table')->get()->result();
    


自动加载库(因为您需要所有视图中的广告)。转到 ./application/config/autoload.php

/*
  | -------------------------------------------------------------------
  |  Auto-load Libraries
  | -------------------------------------------------------------------
  | These are the classes located in the system/libraries folder
  | or in your application/libraries folder.
  |
  | Prototype:
  |
  | $autoload['libraries'] = array('database', 'session', 'xmlrpc');
 */

$autoload['libraries'] = array('ads');

现在您可以使用整个 CI 系统检索数据

$ads = $this->ads->my_ads();

希望这对您有所帮助。谢谢!!

【讨论】:

【参考方案2】:

MY_Controller中添加一个变量:

class MY_Controller extends CI_Controller 

      public $data;

      public function __construct() 
          $this->data['ads'] = $this->get_ads();      
          //etc.
      
    //etc.

在每个控制器中更新$data 变量并像这样调用视图:

$this->data['main_content'] = 'some_view_file';
$this->load->view('template_file', $this->data);

【讨论】:

我还在$data 变量中分配了标题、消息和其他值。如果我使用$this->data,当我没有在某些方法中分配某些值时,我会想到一些问题。以前分配的值可能会传递给视图文件?相反,如果我可以在我的MY_Controller 中使用$this->ads 变量并直接在视图文件中访问$this->ads 变量,那是不是很糟糕? 不赋值时问题出在哪里?如果您没有在控制器中分配标题并且没有在视图中调用它,则没有问题。如果可以简化事情,您可以直接在视图中使用$this->ads 变量。以后会更难维护,因为所有视图的数据都来自$data 变量,而且这条数据更难追踪。

以上是关于Codeigniter 站点范围的视图的主要内容,如果未能解决你的问题,请参考以下文章

Codeigniter:从视图中调用视图时的变量范围。奇怪的

从 codeigniter 中的视图调用模型是不是不好?

nginx配置CI重写规则,codeigniter

Codeigniter:php 在视图中不起作用!

CodeIgniter:将最后一个活动存储到数据库中

使用 codeigniter ci_marchant_Lib 库的 PayPal 定期付款