2

我正在努力在 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()每个控制器的构造函数。我想要的是全局调用而不是每个控制器的构造函数。

4

4 回答 4

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. 例如:

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...
}
于 2013-03-22T06:24:49.303 回答
0

另一种方式是,

您可以在库中定义它。您可以创建一个库并在库中定义此函数,然后在应用程序的任何位置调用它。不要忘记在 AutoLoad 中加载库。

于 2013-03-22T06:15:54.403 回答
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');
于 2013-03-22T06:24:48.610 回答
0

我有一个使用钩子的解决方案。1.启用配置中的钩子 2.将其设置为 hooks.php

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


        //my method name


    }
}
于 2013-03-28T10:54:14.963 回答