2013-03-22 78 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... 
} 
相关问题