我正在努力在Codeigniter(2.0)中应用会话基础时区。
场景:
一旦用户登录系统,我使用lat/lon来检测时区ID并将其设置为会话变量,然后在每个控制器的构造函数中调用set_timezone()。
设置一个自动加载的辅助文件:
function set_timezone($timeZoneId='')
{
if($timeZoneId!="")
{
date_default_timezone_set($timeZoneId);
mysql_query("SET SESSION time_zone = '".$timeZoneId."'");
}
}
我的问题是我不想调用set_timezone()
在每个控制器的构造函数。我想要的是全局调用,而不是每个控制器的构造函数
您应该创建一个名为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...
}
另一种方式是
可以在Library中定义。您可以创建一个库,并在库中定义这个函数,然后在应用程序的任何地方调用它。不要忘记在AutoLoad中加载库。
正如Nikitas所说,创建一个像下面这样的库文件,并将库文件包含在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."'");
}
}
}
在autoload.php $autoload['libraries'] = array('Timezoneconvert');
我有一个解决方案,使用挂钩。1.在配置中启用钩子2.设置为hooks.php
class HookMyHandler {
function post_controller_constructor() {
$this->ci = & get_instance();
//my method name
}
}