访问Twig的Cookies?

时间:2014-04-07 19:48:44

标签: codeigniter cookies twig

我在基本控制器中有这样的代码:

$this->eu_cookie_preference = $this->input->cookie('eu-cookie-preference');

并且在我的每个控制器函数中,我将此变量传递给这样的树枝:

$this->twig->display('account/my_details.twig', array(
    'title' => 'Website | My Details',
    'lang' => $this->lang,
    'eu_cookie_preference' => $this->eu_cookie_preference,
));

在Base Twig中我使用这个变量来做各种事情。 有没有办法从Twig访问$ this-> eu_cookie_preference变量而不必在每个控制器函数中明确地将它传递给每个Twig?

我遇到类似会话变量的问题,因为我必须将它们传递给每个树枝才能访问它们。

1 个答案:

答案 0 :(得分:2)

答案

您可以使用Twigs addGlobal函数来执行此操作。 See manual

// Add static text
$twig->addGlobal('text', 'Hello World');
// Add array
$twig->addGlobal('arr', array(1, 2, 3));
// Add objects
$twig->addGlobal('obj', $obj);

你可以像普通的vars一样使用这些全局变量:

This is a Text: "{{ text }}", 
item in an array {{ arr[0] }}, 
obj value {{ obj.publicAttr }} or 
obj function {{ obj.toHTML5('<img src="" />') }}

其他信息

这样你也可以实现延迟加载。如果从数据库加载会话数据,那么在每个模板中都不会使用它来构建这样的类:

class OnDemand {
    private $cache;
    private $function;

    function __construct($function) {
        $this->function = $function;
    }

    private function cache() {
        if($this->cache == null) {
            $function = $this->function;
            $this->cache = $function();
        }
    }

    function __toString() {
        $this->cache();
        return (string) $this->cache;
    }

    function __get($key) {
        $this->cache();
        return $this->cache[$key];
    }

    function __isset($key) {   
        $this->cache();
        return isset($this->cache[$key]);
    }
}

并传递如下值:

$twig->addGlobal('aDataArray', new OnDemand(function(){
    // load database data
    $data = DB::loadData(...);
    return $data;
}));

只有在树枝中调用变量时才会调用该函数。

{{ aDataArray.user.name }}