我正在努力在Codeigniter(2.0)中应用会话基准时区。
情景:
用户登录系统后,我使用lat / lon检测时区ID并将其设置为会话变量,然后将set_timezone()调用到每个控制器的构造函数中。
Ex一个自动加载的帮助文件:
function set_timezone($timeZoneId='')
{
if($timeZoneId!="")
{
date_default_timezone_set($timeZoneId);
mysql_query("SET SESSION time_zone = '".$timeZoneId."'");
}
}
我的问题是我不想将set_timezone()
调用到每个控制器的构造函数中。我想要的是全局调用而不是每个控制器的构造函数。
答案 0 :(得分:4)
您应该创建一个名为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
。 E.g:
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...
}
答案 1 :(得分:0)
另一种方式是,
您可以在Library中定义它。您可以创建库并在库中定义此函数,并在应用程序中的任何位置调用它。不要忘记在AutoLoad中加载库。
答案 2 :(得分:0)
正如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');
答案 3 :(得分:0)
我通过使用钩子获得了解决方案。 1.启用配置中的挂钩 2.将它设置为hooks.php
class HookMyHandler {
function post_controller_constructor() {
$this->ci = & get_instance();
//my method name
}
}