16

Smarty でできること

{$var = 'bla' scope=parent}

Twigで可能ですか?

ブロックの使用を提案しないでください。知っている。変数が必要です。

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

base.twig

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

子小枝

{% set title = 'ChildTitle' %}
于 2014-01-27T03:19:38.543 に答える
7

@n3xus は素晴らしい回答をくれました。実際に私も助けてくれました (ありがとう)。ドキュメントからこのページを参照することもできます: Twig docs

特に優れた機能の 1 つは、text/html のチャンクを設定する機能です。

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

子テンプレートから特定のコンテンツを簡単に生成できます。

于 2014-05-02T20:54:33.850 に答える
1

私が発見したこのようなことをする素晴らしい方法:

親.小枝

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

{# somewhere later #}

{{ subvar }}

子小枝

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

子テンプレートで block が定義されていない場合subvar、変数 inparent.twigは空になります。

于 2015-07-22T12:06:57.347 に答える
-1

埋め込みでset タグを使用する

例:

親の小枝:

{%  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 に答える