CodeIgniter视图中的全局变量

时间:2011-01-29 08:14:26

标签: codeigniter global-variables

我正在关注the Nettuts tutorial以使用CodeIgniter实现Basecamp样式的子域。

基于调用子域,数据库中的子域表返回与该子域对应的扩展名。因此,对于stackoverflow.mywebsite.com,它将返回扩展名sf,并且在整个网站上使用的图像文件夹和CSS文件将根据此扩展名进行更改;例如,images_sfstyle_sf.css

现在,在M,V或C的任何地方获取此扩展的最佳方法是什么?

选项:

  1. 缓存
  2. 动态设置CI配置变量
  3. MY_Controller中为此设置变量,并通过$this->随处访问该变量。
  4. 将每个控制器的变量发送给模型,助手,视图或库。
  5. 我是否错过了其他选择?另外,假设这将在整个代码中大量使用,哪一个最好?

    由于

2 个答案:

答案 0 :(得分:4)

就个人而言,我会为您扩展的每个站点创建一个基本控制器,只需使用$this->load->vars($data);加载您需要全局设置的信息。

在特定基础控制器的构造函数中,只需将数据加载到全局视图中,就像这样。

$data->some_var = "some value";
$this->load->vars($data);

然后在此控制器(或基本控制器)加载的所有视图中,您可以直接在视图中使用变量$some_var

答案 1 :(得分:2)

你最好的选择可能是选项3,把它放在你的基础控制器的构造函数中,可能是MY_controller或你扩展的任何控制器(现在CI_Controller与CI2.0正式版)

但是,如果你所做的只是获得扩展,那么可能没有理由拥有数据库表,因为你可以将它保存在配置文件中

我会做这样的事情......在MY_Controller.php中(这是CI 2.0语法)

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class MY_Controller extends CI_Controller {

      function __construct()
      {
           parent::__construct();

           $subdomain_arr = explode('.', $_SERVER['HTTP_HOST'], 2);  
           $subdomain_name = $subdomain_arr[0];  

           $this->load->config('sub_prefix');
           $pre_arr = $this->config->item('prefixes');

           /* Check to make sure the subdomain name is in the config array */
           $this->prefix = isset($pre_arr[$subdomain_name]) ? $pre_arr[$subdomain_name] : '';
      }

然后在配置文件(sub_prefix.php)

<?php if (! defined('BASEPATH')) exit('No direct script access');

    $config['prefixes'] = array('subdomain1' => 'sub1', 
                                'stackoverflow' => 'sf');

这样,每次页面加载时都不需要运行额外的查询以获得相对静态的内容...如果你到了需要除了前缀之外还需要更多信息的地方,那么用数据库

来做是有意义的

您现在可以在您将使用的任何视图,控制器或模型中使用$ this-&gt;前缀...这是在您的应用程序中大量使用的最佳方式。