2011-01-29 96 views
1

我正在關注the Nettuts tutorial以使用CodeIgniter實現Basecamp樣式的子域。CodeIgniter視圖中的全局變量

根據調用子域,數據庫中的子域表返回與該子域對應的擴展名。所以說對於stackoverflow.mywebsite.com,它將返回擴展名sf,並且在這個擴展的基礎上,整個網站使用的圖像文件夾和CSS文件將會改變;例如,images_sf,style_sf.css等。

現在,在M,V或C的任何位置獲取此擴展的最佳方法是什麼?

選項:

  1. 餅乾
  2. 動態設置CI配置變量
  3. MY_Controller設置此變量,並通過$this->訪問該變量的任何地方。
  4. 將該變量從每個控制器發送到模型,助手,視圖或庫。

我錯過了其他選擇嗎?另外,哪一個最好,假設這將在整個代碼中大量使用?

感謝

回答

4

就個人而言,我會給你延長每個站點基本控制器,並且只使用$this->load->vars($data);加載你需要的全局設置信息。

在特定的基礎控制器的構造函數中,只需將數據加載到全局視圖中即可。

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

然後在由該控制器(或主控制器)裝入所有的視圖可以在視圖中直接利用可變$some_var

+0

是不是通過php DEFINE設置它們是最好的方式?我相信一旦設定,它們在腳本執行過程中永遠不會改變。 – 2011-01-31 00:28:33

+0

您的問題可能有點誤導,因爲您在標題中詢問CodeIgniter視圖,但在詢問如何將信息加載到M,V和C中的所有問題中。此方法會將這些變量全局加載到加載的視圖中由這個控制器。 – jondavidjohn 2011-01-31 01:26:53

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->前綴你將會使用......最好的方式來處理那些遍佈你的應用程序的東西。