在加载之前尝试更改CodeIgniter会话变量,只处理重新加载?

时间:2014-12-03 14:35:52

标签: php codeigniter session cookies session-variables

好的,我们给了一个用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应用程序的标题视图的顶部,据我们所知,它是在所有模板上调用的第一个文件。

我们应该采用另一种文件/方式吗?我们不是专家,甚至不是CodeIgniter的新手,所以不知道从哪里开始。我们尝试将此代码放在其他视图甚至控制器中,但它会中断或者不起作用。

2 个答案:

答案 0 :(得分:0)

您可以尝试创建一个扩展CI_Controller的自定义控制器,并根据cookie / session选择合适的语言。

在应用程序/核心文件夹

中创建一个名为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_Controller。

class Frontpage extends MY_Controller

答案 1 :(得分:0)

有时在codeigniter中,Cookie不在同一页面上。