16

在 Smarty 你可以做

{$var = 'bla' scope=parent}

在树枝上可以吗?

不建议使用块。我知道。我需要变量。

4

8 回答 8

16

如果您不想使用default()过滤器(即,当您想在整个父模板和子模板中多次使用该变量时),您实际上可以在父模板中定义一个包含整个页面的块,然后嵌套您的其中的其他块:

{# base.twig #}

{# Default page properties.  You can override these in the `page` block of your child templates. #}
{% set page = page | default({}) | merge({
    "title"       : "My Default Title",
    "description" : "Default description"
}) %}

{% block page %}
    <!DOCTYPE html>
    <html lang="en">
        <head>
            <meta charset="utf-8">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <meta name="description" content="{{ page.description }}"> 
            <title>{{ page.title }}</title>

            ...

        </head>
        <body>
            {% block content %}{% endblock %}
        </body>
    </html>
{% endblock %}

然后,您可以通过设置值然后调用来覆盖子模板page中块中的变量:pageparent()

{# child.twig #}

{% extends "base.twig" %}

{% block page %}
    {# By putting this in a special block, we ensure that it will be set AFTER the default values are set in the parent template, 
    but BEFORE the page itself is rendered. #}

    {% set page = page | merge({
        "title"       : "Child Page",
        "description" : "Welcome to the child page!"
    }) %}    

    {{ parent() }}
{% endblock %}

{% block content %}
    ...
{% endblock %}

请注意,在父模板中,我们page在块之外定义变量page,而在子模板中,我们在块page定义它。

因此,Twig 将执行以下操作:

  1. 渲染child.twig时,将从 顶部开始,为变量base.twig设置默认值。page
  2. 当涉及page 时,它将看到child.twig覆盖该块。因此,它将改为运行该page块。child.twig
  3. page块中child.twig,它将为page变量设置新值。然后它会调用parent(),告诉它返回base.twig并渲染父page块。
  4. 然后它将继续呈现页面,替换中定义的任何其他块child.twig(在我的示例中,它将呈现content块)。

在此处查看一个工作示例。请注意,当您开始添加多层继承(例如,孙模板)时,这可能会变得更加复杂。

于 2015-09-18T00:56:33.303 回答
14

基地.twig

<title>{{ title|default('example.com') }} - My cool site</title>

孩子.twig

{% set title = 'ChildTitle' %}
于 2014-01-27T03:19:38.543 回答
8

如果您只是想让一个变量从子模板中“可覆盖”,您可以在父模板中设置您的变量,如下所示:

{% set title = (title|default('My Page')) %}

所以你可以设置这样的情况......

基地.twig

<html>
  <head>
    <title>{{title}}</title>
  </head>
  <body>
    {% block content %}
    {% end block %}
  </body>
</html>

父母.twig

{% extends 'base.twig' %}

{% set title = (title|default('My Page')) %}

孩子.twig

{% extends 'parent.twig' %} 

{% set title='My Subpage' %}   

{% block content %}
  This is the Sub-page.
{% end block %}

最终结果将是:

<html>
  <head>
    <title>My Subpage</title>
  </head>
  <body>
    This is the Sub-page.
  </body>
</html>

我认为这适用于大多数情况。与其强迫父变量被子变量覆盖,父变量“让”变量被子变量覆盖。您还可以在父级中定义不同的行为,例如连接而不是覆盖。

于 2016-03-05T05:57:54.713 回答
7

@n3xus 给出了一个很好的答案,它实际上也帮助了我(谢谢),但您可能还想从文档中查看这个页面:Twig docs

一个特别好的功能是能够设置一大块 text/html:

{% set title %}
    <i class="icon-user"></i>
    {{ user.username | capitalize }}
    <small>{{ user.email | lower }}</small>
{% endset %}

使从子模板生成非常具体的内容变得容易。

于 2014-05-02T20:54:33.850 回答
2

您可以在子页面中使用以下内容:

{% set title = 'your desired title' %}
于 2014-11-14T10:58:05.743 回答
1

我刚刚发现了一个很好的方法来做这样的事情:

父母.twig

{% set subvar = block('subvar') %}

{# somewhere later #}

{{ subvar }}

孩子.twig

{% block subvar %}
    anything you want
{% endblock %}

如果您的子模板未定义 block subvar,则变量 inparent.twig将为空。

于 2015-07-22T12:06:57.347 回答
0

另一种方法是在您的应用程序中全局查看 twig 配置。例如在 Silex 中:

$app['twig']->addGlobal('someuser', $user);

然后,您可以在所有模板中访问该变量:

Hello, {{someuser.name}}
于 2013-11-08T10:09:35.210 回答
-1

使用带有嵌入的设置 标签

例子:

父母.树枝

{%  block child %}

{% endblock %}

I say: {{ var }}

child.twig

 {% embed "parent.twig" %}
     {% block child %}
 I child, but i not to fail set    
         {% endblock %}
    {%  set var='bla' %}

 {% endembed %}
于 2013-11-08T09:03:08.980 回答