-2

symfony3/twig スケルトン テンプレートがあります

page1/skeleton.twig
    {# set default values #}
    {% block content %}
    {% set test = {
            sec1: {
                title:   "null",
                content: 'null'
            },
      }
    %}
    {% endblock %}
    <ul>
19        {% for sec in test[0:] %}
        <li>
            <p>{{ sec.title }}</p>
            <div>
                <p>{{ sec.content }}</p>
            </div>
        </li>
     {% endfor %}
    </ul>

次に、スケルトンを「実際の」データで拡張するレイアウト テンプレートを作成します。

page1/layout.html.twig
    {% extends 'page1/skeleton.html.twig' %}

    {% block content %}
    {% set test = {
        sec1: {
            title:   "title1",
            content: 'content2'
        },
        sec2: {
            title:   "title2",
            content: 'content2'
        }
    %}
    {% endblock %}

しかし、ページを生成/公開すると、Symfony がエラーを発生させます

Variable "test" does not exist in :page1:skeleton.html.twig at line 19
500 Internal Server Error - Twig_Error_Runtime

スケルトン自体について不平を言う。

その「テスト」配列はスケルトンで定義されています。「block」、「extends」、「set」に関するドキュメントを読んでいて、正確に何が問題なのか理解できません。

このエラーを解消するには、何を変更する必要がありますか?

4

2 に答える 2

2

blocksintwigには独自の変数スコープがあります。
ブロック内で作成された変数は、ブロック外からアクセスできません。

Imo変数が存在するかどうかのみをテストし、そうでない場合はデフォルト値を作成する必要があります:

skeleton.twig

    {% if not test  is defined %}
        {% 
            set test = {
                sec1: {
                    title:   "null",
                    content: 'null'
                },
            }
        %}
    {% endif %}
    <ul>
    {% for sec in test[0:] %}
        <li>
            <p{{ sec.title }}</p>
            <div>
                <p>{{ sec.content }}</p>
            </div>
        </li>
    {% endfor %}
    </ul>

controller.php

<?php
    echo $twig->render('page/page.twig', array(
           'foo' => [
               'title' => 'title1',
               'content' => content1',
            ],
    );
于 2016-09-09T05:44:23.027 に答える
-2

ファイル page1/skeleton.twig でこれを変更します。

{% for sec in test %}

それはうまくいくでしょう。私はそれを試してみました。その理由を必ず理解してください!

于 2016-09-09T05:00:58.933 に答える