应用多个时区的最佳方法是什么?



我正在努力在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

    }
}

相关内容

  • 没有找到相关文章

最新更新