2013-03-22 71 views
2

我很努力在Codeigniter(2.0)中應用會話基準時區。什麼是應用多時區的最佳方式?

場景:

一旦用戶登錄我使用緯度/經度來檢測時區ID並將其設置爲一個會話變量,然後調用set_timezone系統()到每個控制器的構造函數。

防爆一個輔助文件,該文件是自動加載:

function set_timezone($timeZoneId='') 
{ 
    if($timeZoneId!="") 
    { 
    date_default_timezone_set($timeZoneId); 
    mysql_query("SET SESSION time_zone = '".$timeZoneId."'"); 
    } 
} 

我的問題是,我不想叫set_timezone()在每一個控制器的構造函數。我想要的是全局調用,而不是每個控制器的構造函數。

+1

可能創建新庫,然後通過自動加載autoload.php它? – Nikitas 2013-03-22 06:14:47

回答

0

我有使用掛鉤的解決方案。 1.啓用鉤在配置 2.設置成hooks.php

class HookMyHandler { 
    function post_controller_constructor() { 
     $this->ci = & get_instance(); 


     //my method name 


    } 
} 
0

另一種方法是,

您可以在庫中定義它。您可以創建庫並在庫中定義此函數,並在應用程序中的任何位置調用它。不要忘記在AutoLoad中加載庫。

0

正如塔斯說autoload.php

$autoload['libraries'] = array('Timezoneconvert'); 
+0

我不認爲這會執行代碼。它只會使該功能可供使用。 – Mischa 2013-03-22 06:35:25

+0

我已經通過使用鉤子獲得解決方案。 – azeem 2013-03-28 10:50:59

4

創建一個庫文件如下面,包括在autoload.phpb

class Timezoneconvert 
    { 
     function set_timezone($timeZoneId='') { 
      $this->obj =& get_instance(); 
      $this->obj->load->database(); 
      if($timeZoneId!="") 
      date_default_timezone_set($timeZoneId); 
      $this->obj->db->query("SET SESSION time_zone = '".$timeZoneId."'"); 
      } 
    } 
    } 

庫文件,您應該創建一個名爲MY_Controller,所有的家長控制你的其他控制器擴展。在該類的構造函數中,可以調用set_timezone。通過此解決方案,時區將自動設置在所有子控制器中。

MY_Controller應存放在application/core,應該是這個樣子:

class MY_Controller extends CI_Controller 
{ 
    function __construct() 
    { 
    parent::__construct(); 
    $this->set_timezone(); 
    } 

    function set_timezone($timeZoneId='') 
    { 
    // Your code 
    } 
} 

現在所有的其他控制器應擴大MY_Controller而不是CI_Controller。例如: -

class WelcomeController extends MY_Controller 
{ 
    function __construct() 
    { 
    // This will call the constructor of MY_Controller, 
    // which in turn sets the timezone: 
    parent::__construct(); 
    } 

    // Rest of your functions... 
} 
相關問題