Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用symfony 2/twig块内部的变量_Symfony_Twig - Fatal编程技术网

使用symfony 2/twig块内部的变量

使用symfony 2/twig块内部的变量,symfony,twig,Symfony,Twig,我有这个 base.html.twig <html> {% block template_scope_vars %} {% endblock %} <head></head> <body> {% block content %} {% endblock %} </body> </html> extends base... {%block template_scope_vars %}

我有这个


base.html.twig

<html>
  {% block template_scope_vars %}
  {% endblock %}
  <head></head>
  <body>
    {% block content %}
    {% endblock %}
  </body>
</html>
extends base...
{%block template_scope_vars %}
   {% set test= "bippo" %}
{%endblock%}

{%block content %}
   {{ test }}
{% endblock %}
<div id="menu"> //this is like a sidebar menu
                    <div class="menuitem  {% block foo %}{% endblock %}">
                    <a href="{{ path('MyBundle_my_routing_name_foo' }}">Foo</a>
                </div>
                    <div class="menuitem  {% block bar %}{% endblock %}">
                    <a href="{{ path('MyBundle_my_routing_name_bar' }}">Bar</a>
                </div>
<div>
{% block content %}
{% endblock %}
{% extends "MyBundle::base.html.twig" %}

{% block foo %}active{% endblock %}

{% block content %}
Some content specific for foo
{% endblock %}
{% extends "MyBundle::base.html.twig" %}

{% block bar%}active{% endblock %}

{% block content %}
Some content specific for bar
{% endblock %}
<div id="menu"> //this is like a sidebar menu
    <div class="menuitem{{ active == 'foo' ? ' active' : '' }}">
        <a href="{{ path('MyBundle_my_routing_name_foo') }}">Foo</a>
    </div>
    <div class="menuitem{{ active == 'bar' ? ' active' : '' }}">
        <a href="{{ path('MyBundle_my_routing_name_bar') }}">Bar</a>
    </div>
<div>
{% block content %}
{% endblock %}
{% extends "MyBundle:Whatever:base.html.twig" %}

{% block content %}
    {{ content }}
{% endblock %}
错误

/**
 * @Route("/foo", defaults={"param" = null}, name="foo")
 * @Route("/foo/{param}", name="foo_with_param")
 * @Template()
 */
public function fooAction($param)
{
    // This would really be getting data from the Model
    if ($param == 'something') {
        $content = 'Some content';
        $active = 'foo';
    } else {
        $content = 'Different content';
        $active = 'bar';
    }

    return array(
        'content'=> $content,
        'active' => $active,
    );
}
变量“test”不存在


好的,请不要告诉我,我不必为此使用块,用例显然比这个简单的例子更难。其想法是,
test
也可以在
base.html.twig
中获得,以及我将来可能使用的它的任何子模板

对于我拥有的特殊用例,我可以使用它。可惜的是,没有更整洁的解决方案。我能想到的所有其他解决方案都需要为每组模板范围变量创建一个新文件。哪个平原很烂


base.html.twig

<html>
  {% block template_scope_vars %}
  {% endblock %}
  <head></head>
  <body>
    {% block content %}
    {% endblock %}
  </body>
</html>
extends base...
{%block template_scope_vars %}
   {% set test= "bippo" %}
{%endblock%}

{%block content %}
   {{ test }}
{% endblock %}
<div id="menu"> //this is like a sidebar menu
                    <div class="menuitem  {% block foo %}{% endblock %}">
                    <a href="{{ path('MyBundle_my_routing_name_foo' }}">Foo</a>
                </div>
                    <div class="menuitem  {% block bar %}{% endblock %}">
                    <a href="{{ path('MyBundle_my_routing_name_bar' }}">Bar</a>
                </div>
<div>
{% block content %}
{% endblock %}
{% extends "MyBundle::base.html.twig" %}

{% block foo %}active{% endblock %}

{% block content %}
Some content specific for foo
{% endblock %}
{% extends "MyBundle::base.html.twig" %}

{% block bar%}active{% endblock %}

{% block content %}
Some content specific for bar
{% endblock %}
<div id="menu"> //this is like a sidebar menu
    <div class="menuitem{{ active == 'foo' ? ' active' : '' }}">
        <a href="{{ path('MyBundle_my_routing_name_foo') }}">Foo</a>
    </div>
    <div class="menuitem{{ active == 'bar' ? ' active' : '' }}">
        <a href="{{ path('MyBundle_my_routing_name_bar') }}">Bar</a>
    </div>
<div>
{% block content %}
{% endblock %}
{% extends "MyBundle:Whatever:base.html.twig" %}

{% block content %}
    {{ content }}
{% endblock %}
bar.html.twig

<html>
  {% block template_scope_vars %}
  {% endblock %}
  <head></head>
  <body>
    {% block content %}
    {% endblock %}
  </body>
</html>
extends base...
{%block template_scope_vars %}
   {% set test= "bippo" %}
{%endblock%}

{%block content %}
   {{ test }}
{% endblock %}
<div id="menu"> //this is like a sidebar menu
                    <div class="menuitem  {% block foo %}{% endblock %}">
                    <a href="{{ path('MyBundle_my_routing_name_foo' }}">Foo</a>
                </div>
                    <div class="menuitem  {% block bar %}{% endblock %}">
                    <a href="{{ path('MyBundle_my_routing_name_bar' }}">Bar</a>
                </div>
<div>
{% block content %}
{% endblock %}
{% extends "MyBundle::base.html.twig" %}

{% block foo %}active{% endblock %}

{% block content %}
Some content specific for foo
{% endblock %}
{% extends "MyBundle::base.html.twig" %}

{% block bar%}active{% endblock %}

{% block content %}
Some content specific for bar
{% endblock %}
<div id="menu"> //this is like a sidebar menu
    <div class="menuitem{{ active == 'foo' ? ' active' : '' }}">
        <a href="{{ path('MyBundle_my_routing_name_foo') }}">Foo</a>
    </div>
    <div class="menuitem{{ active == 'bar' ? ' active' : '' }}">
        <a href="{{ path('MyBundle_my_routing_name_bar') }}">Bar</a>
    </div>
<div>
{% block content %}
{% endblock %}
{% extends "MyBundle:Whatever:base.html.twig" %}

{% block content %}
    {{ content }}
{% endblock %}
然后你为背景设置css,例如

CSS


base.html.twig

<html>
  {% block template_scope_vars %}
  {% endblock %}
  <head></head>
  <body>
    {% block content %}
    {% endblock %}
  </body>
</html>
extends base...
{%block template_scope_vars %}
   {% set test= "bippo" %}
{%endblock%}

{%block content %}
   {{ test }}
{% endblock %}
<div id="menu"> //this is like a sidebar menu
                    <div class="menuitem  {% block foo %}{% endblock %}">
                    <a href="{{ path('MyBundle_my_routing_name_foo' }}">Foo</a>
                </div>
                    <div class="menuitem  {% block bar %}{% endblock %}">
                    <a href="{{ path('MyBundle_my_routing_name_bar' }}">Bar</a>
                </div>
<div>
{% block content %}
{% endblock %}
{% extends "MyBundle::base.html.twig" %}

{% block foo %}active{% endblock %}

{% block content %}
Some content specific for foo
{% endblock %}
{% extends "MyBundle::base.html.twig" %}

{% block bar%}active{% endblock %}

{% block content %}
Some content specific for bar
{% endblock %}
<div id="menu"> //this is like a sidebar menu
    <div class="menuitem{{ active == 'foo' ? ' active' : '' }}">
        <a href="{{ path('MyBundle_my_routing_name_foo') }}">Foo</a>
    </div>
    <div class="menuitem{{ active == 'bar' ? ' active' : '' }}">
        <a href="{{ path('MyBundle_my_routing_name_bar') }}">Bar</a>
    </div>
<div>
{% block content %}
{% endblock %}
{% extends "MyBundle:Whatever:base.html.twig" %}

{% block content %}
    {{ content }}
{% endblock %}
控制器

/**
 * @Route("/foo", defaults={"param" = null}, name="foo")
 * @Route("/foo/{param}", name="foo_with_param")
 * @Template()
 */
public function fooAction($param)
{
    // This would really be getting data from the Model
    if ($param == 'something') {
        $content = 'Some content';
        $active = 'foo';
    } else {
        $content = 'Different content';
        $active = 'bar';
    }

    return array(
        'content'=> $content,
        'active' => $active,
    );
}

呈现foo.html.twig时,base.html.twig将获得变量“active”。

无法按您希望的方式工作。区块几乎是独立的。@Cerad很好,这让时间很糟糕。有类似的东西我可以用吗?或者一些解决方法?将变量作为一个细枝全局变量注入,就像用原子弹射击鸽子一样。此外,它不能解决基本的用例,在这些用例中,你只需要做一点点逻辑。嗯,这是一个很大的缺点,它使得这个模板机制比JSF弱很多java@Cerad看看这个:也许我可以创建一个新的小树枝,在这里我只写
{%set test=“foobar”%}{%include'user.html.twig%}
读取文档,这应该可以。但是我必须创建一个新文件stupid@Toskan哪一部分?注释?无论如何,这都在symfony文档中。我不会通过发布链接来侮辱你的智慧。您可能应该在
base.html.twig
的顶部设置一次
active
(以防未通过),例如:
{%set active=active | default(false)%}
,然后您可以稍微缩短其他代码
{{active=='foo'?'active':'}}
如果您得到几个返回语句,例如,在持久化后或在检查失败后重定向,您最终将复制粘贴这个返回数组。@Toskan我想您没有得到它。您必须将数据发送到模板。这就是MVC的全部要点。请随意解释为什么必须将此数据发送到模板。当模板不更改时,这是否会更改?需要控制吗?不,这是模板样式,没有别的。模板样式不应该是控制器的一部分。@Toskan您说的是DRY,然后您说要为每个活动菜单项创建几乎相同的新模板文件?那完全是疯了。foo.html.twig、bar.html.twig、baz.html.twig等。菜单只需要一个twig模板,甚至只需要一个控制器,告诉模板要突出显示哪个菜单项(在将传递给它的所有其他数据中)。