0

我在网上阅读了有关 TWIG 模板中自定义全局变量的信息,是的,我发现那里只有静态变量。

我的问题是,我想创建一些全局变量,这些变量将包含来自我的数据Settings.php(+ 也加入控制器以加载这些数据)。所以它会在我的::base.html.twig中看起来像这样:

<title>{% block page_name %}settings.page_name{% endblock %}</title>

例如,我的AcmeContactBundle:Default:index.html.twig看起来像:

{% extends '::base.html.twig' %}

{% block page_name %}{{ parent() }} - Contact me{% endblock %}

因此,如果我使用$settings->setPageName('My web')我的标题将有这种形式:我的 Web -在我的ContactBundle中联系我。

所以,我需要的是如何在 TWIG 或类似的东西中创建任何某种全局变量,其中每个这个特殊变量都将具有来自任何控制器的信息,这些控制器将在我的::base.html.twig$settings模板中解析变量(比如带有渲染模板及其变量的普通控制器)。有没有最好的有效想法来解决这个问题?

4

1 回答 1

2

只需在基本模板中定义一个变量(::base.html.twig在您的情况下):

{% set page_name = 'AwesomeCompany - ' %}

<title>{{ page_name }}</title>

然后在扩展基本模板的模板中,您只需要覆盖变量或向其中添加一些内容。

{% set page_name = page_name ~ 'Home' %} 

...无需覆盖或创建块。


使用树枝扩展/全局变量

为了从您的实体存储库中获取价值,您可以...

创建一个 Twig 扩展:

// src/Acme/DemoBundle/Twig/AcmeExtension.php
namespace Acme\DemoBundle\Twig;

use Doctrine\Common\Persistence\ObjectManager;

class AcmeExtension extends \Twig_Extension
{
    protected $em;

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

    public function getGlobals()
    {
        return array(
            'page_name'=> $this->em->getRepository('AcmeBundle:Entity')->findOneBy(array('..'))->getPageName();
        );
    }

    public function getName()
    {
        return 'acme_extension';
    }
}

然后将您的扩展注册为服务并注入存储库

# app/config/config.yml ... or load from a bundle-extension
services:
    acme.twig.acme_extension:
        class: Acme\DemoBundle\Twig\AcmeExtension
        arguments: [ "@doctrine.orm.entity_manager" ]
        tags:
            - { name: twig.extension }

现在您可以{% set page_name ...在基本模板中省略静态变量,因为该变量将作为全局变量提供。在您的所有模板中。

于 2013-10-11T12:10:26.830 回答