我在网上读到了TWIG模板中的自定义全局变量,是的,我发现只有静态变量。
我的问题是,我想创建一些全局变量,这些变量将包含来自我的 Settings.php 的数据(+还加入控制器以加载此数据)。因此,我的 :: base.html.twig 中的内容如下所示:
<title>{% block page_name %}settings.page_name{% endblock %}</title>
例如我的 AcmeContactBundle:默认:index.html.twig 如下所示:
{% extends '::base.html.twig' %}
{% block page_name %}{{ parent() }} - Contact me{% endblock %}
因此,如果我使用$settings->setPageName('My web')
,我的标题将包含以下格式:我的网络 - 与我联系 ContactBundle 。
所以,我需要的是是如何在TWIG或类似的东西中创建任何某种类型的全局变量,其中每个特殊变量都将包含来自任何具有变量{{1}的控制器的信息解析我的 :: base.html.twig 模板(就像带有渲染模板及其变量的普通控制器一样)。有没有最好的解决方案呢?
答案 0 :(得分: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 }
现在你可以省略基础tempalate中的静态{% set page_name ...
,因为该变量将作为全局aka提供。在所有模板中。