Php 在加载之前尝试更改CodeIgniter会话变量,仅在重新加载时工作?

Php 在加载之前尝试更改CodeIgniter会话变量,仅在重新加载时工作?,php,codeigniter,session,cookies,session-variables,Php,Codeigniter,Session,Cookies,Session Variables,好的,我们得到了一个使用CodeIgniter编写的应用程序,它支持多种语言 我们遇到的问题是,语言选择发生在CodeIgniter之外的一个Joomla网站上,应用程序可以从该网站访问。但是,我们需要将游戏从Joomla安装中分离出来,而这次是在wordpress中处理语言选择。我们已经在wordpress中为所选语言设置了一个cookie(cookie名称为lang,值为ru或en(俄语和英语)),总体思路是用户流如下所示: 访客访问WORDPRESS网站(其中设置了cookie)->点击进

好的,我们得到了一个使用CodeIgniter编写的应用程序,它支持多种语言

我们遇到的问题是,语言选择发生在CodeIgniter之外的一个Joomla网站上,应用程序可以从该网站访问。但是,我们需要将游戏从Joomla安装中分离出来,而这次是在wordpress中处理语言选择。我们已经在wordpress中为所选语言设置了一个cookie(cookie名称为lang,值为ru或en(俄语和英语)),总体思路是用户流如下所示:

访客访问WORDPRESS网站(其中设置了cookie)->点击进入游戏(Codeigniter必须检查cookie并设置会话变量)

因此,给定上述流程,从wordpress端写入cookie,因此CodeIgniter应用程序可以访问该cookie以分别设置语言。成功做到这一点的代码如下:

if (!isset($_COOKIE["lang"])) {
    $this->session->set_userdata('lang', 'en');
} else {
    if ($_COOKIE["lang"] == "en") $this->session->set_userdata('lang', 'en');
    if ($_COOKIE["lang"] == "ru") $this->session->set_userdata('lang', 'ru');
}
这可以很好地工作,但是它不会在第一次加载时显示所选语言,而是仅在我们重新加载时显示。然而,这段代码被放置在CodeIgniter应用程序的header视图的顶部,在所有内容都回显到浏览器之前,据我们所知,这是在所有模板上调用的第一个文件


是否有其他文件/方法可以这样做?我们不是专家,甚至不是CodeIgniter的新手,所以不知道从哪里开始。我们尝试将此代码放置在其他视图甚至控制器中,但它要么中断,要么根本不起作用。

您可以尝试创建一个扩展CI_控制器的自定义控制器,并将您根据cookie/会话选择适当语言的逻辑放在那里

在应用程序/core文件夹中创建一个名为MY_Controller.php的新文件

class MY_Controller extends CI_Controller 
{

    function __construct() 
    {
        parent::__construct();

        //get the language from the cookie if its set and use it on the view
        if (!isset($_COOKIE["lang"])) 
        {
            $this->session->set_userdata('lang', 'en');
        } 
        else 
        {
            if ($_COOKIE["lang"] == "en") $this->session->set_userdata('lang', 'en');
            if ($_COOKIE["lang"] == "ru") $this->session->set_userdata('lang', 'ru');
        }
    }
}
然后在应用程序上创建的每个控制器上扩展MY_控制器,如下所示

class Frontpage extends MY_Controller

Cookie有时在codeigniter中的同一页面上不可用。

我们知道Cookie可用,它会很好地响应:)我们刚刚尝试了这个,但语法不同,尽管我尝试了调整,但它会给我一个500内部服务器错误。codeigniter verions是sady 1.7.1,因此控制器使用“Game extends Controller”而不是CI_Controller,其构造函数函数名是类“Game”的名称,在构造函数中而不是父::_construct(),它们有“parent::Controller();”。不确定这对上面的示例有何影响,但我尝试的任何操作都会导致500服务器错误!500服务器错误很可能是由于服务器配置错误或htaccess文件出现故障造成的。您是否在应用程序上使用.htaccess文件?尝试禁用它(通过重命名),看看你得到了什么。不,一点也不。我认为这与这个旧的codeigniter版本的不同代码风格有关。非常感谢,伙计!这终于奏效了。我们需要将自定义控制器放在/application/libraries中,并扩展控制器而不是CI_控制器,任何扩展此控制器的控制器都需要调用parent::MY_controller(),而不是construct。为了使CodeIgniter版本1.7.1适用,需要进行所有这些更改,因此,如果其他人有此问题,这是正确的解决方案,请记住,您需要这些详细信息,因为旧版本的文档很少D