首页 文章

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

提问于
浏览
0

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

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

2 回答

  • 0

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

    在application / 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_Controller,就像这样 .

    class Frontpage extends MY_Controller
    
  • 0

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

相关问题