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

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. config でフックを有効にします 2. hooks.php に設定します

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


        //my method name


    }
}
于 2013-03-28T10:54:14.963 に答える
0

もう一つの方法は、

ライブラリ内で定義できます。ライブラリを作成し、ライブラリ内でこの関数を定義して、アプリケーション内の任意の場所で呼び出すことができます。AutoLoad でライブラリをロードすることを忘れないでください。

于 2013-03-22T06:15:54.403 に答える