CodeIgniter 如何在 Twig 模板中访问会话变量

4

有人可以帮我吗?我是CodeIgniter和Twig的新手。我在我的控制器中声明了以下内容:

$datasession = array(
'nick' => $sess_nick,
'login_ok' => true
);

$this->session->set_userdata($datasession);

redirect('app'); //app is a controller that render the template view.

那么问题就是:我该如何从twig模板中获取那些变量呢? 我尝试使用了以下代码:
{{ session.userdata.nick }}

但是它显示为空字符串。

提前感谢您的帮助。

4个回答

0

我正在使用CodeIgniter 3RC3和Twig-Codeigniter库(感谢Erik和Bennet!)。

为了在twig中方便地访问会话,我在/application/libraries/Twig.php文件的__construct()方法中添加了一行代码:

public function __construct()
{
    $this->_ci = & get_instance();
    $this->_ci->config->load(self::TWIG_CONFIG_FILE); // load config file

    // set include path for twig
    ini_set('include_path', ini_get('include_path') . PATH_SEPARATOR . APPPATH . 'third_party/Twig/lib/Twig');
    require_once (string)'Autoloader.php';

    // register autoloader
    Twig_Autoloader::register();
    log_message('debug', 'twig autoloader loaded');

    // init paths
    $this->template_dir = $this->_ci->config->item('template_dir');
    $this->cache_dir = $this->_ci->config->item('cache_dir');

    // load environment
    $loader = new Twig_Loader_Filesystem($this->template_dir, $this->cache_dir);
    $this->_twig_env = new Twig_Environment($loader, array(
                                            'cache' => $this->cache_dir,
                                            'auto_reload' => TRUE));

    // ADD SESSION TO TWIG - JZ
    $this->_twig_env->addGlobal('session', $this->_ci->session);
    // SESSION IS NOW AVAILABLE IN TWIG TEMPLATES!

    $this->ci_function_init();

}

现在我们已经将会话加载到twig实例中,我们可以像这样在twig模板中访问会话变量(例如CI的{{link1:userdata}}):

<span>__ci_last_regenerate: {{ session.userdata.__ci_last_regenerate }}</span>


这也适用于CodeIgniter 3.0+的发布版本。 - zigmoo

0

我成功地使用了这段代码,在Twig中使用了会话变量:

在控制器中:

$datasession = array(
    'language' => "PHP",
    'framework' => "CodeIgniter"
);

$this->session->set_userdata($datasession);
$this->twig->addGlobal("session", $this->session);

在模板中:

{{ session.language }} 
{{ session.framework }} 

我正在使用https://github.com/kenjis/codeigniter-ss-twig


0
要在您的Twig模板中添加会话变量,您需要在Twig库或控制器中添加以下行。
$datasession = array(
    'nick' => $sess_nick,
    'login_ok' => true
);
$this->session->set_userdata($datasession);
$this->_twig->addGlobal("session", $this->CI->session);

然后在你的Twig模板中,你可以像这样打印会话

{{ session.userdata.nick }}

在CodeIgniter中,用户存储的会话通常在userdata数组中。否则,您可以简单地调用会话变量和名称。

{{ session.nick }}

源代码:http://llanalewis.blogspot.co.uk/2013/08/codeigniter-add-session-in-twig.html


致命错误:在C:\ AppServ \ www \ curso \ ApplicationCI \ application \ controllers \ putocontrolador.php的第151行中调用未定义的方法Twig :: addGlobal()。 - Jamaldo
我检查了位于libraries文件夹中的Twig.php文件,发现没有名为addGlobal的方法。现在我该怎么办? - Jamaldo
你能检查一下 Twig 是否安装并正确使用吗?请查看此指南:http://llanalewis.blogspot.co.uk/2013/08/adding-template-engine-twig-on.html - Latheesan
P.S. Twig::addGlobal() 方法是存在的。但我认为你需要获取它的实例。另请参阅 http://twig.sensiolabs.org/doc/advanced.html#globals - Latheesan
@Latheesan,请使用CI 3完成此工作,我已经尝试过了,但没有显示任何内容!! - Salih K

0

好的,感谢Latheesan Kanes提供的帮助。你的指导非常有帮助。我想分享一下我解决这个问题的方法。

正如Latheesan所提到的,我们必须使用addGlobal()方法(我将此方法添加到了我的Twig库文件夹中)

如下所示:

$this->_twig->addGlobal("session", $this->CI->session);

但不要忘记先加载Session库。这样。

$this->CI->load->library('session');

这样,你就可以在所有的Twig视图中全局使用你的会话了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接