2016-09-09 5 views
-2

Я есть шаблон скелет symfony3/прутикпеременные {% set%} в «блоке» файла скелета не распознаются и не могут использоваться при расширении файла?

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 

жалуется на скелет сам.

Этот массив 'test' определен в скелете. Afaict читает документы на «block», «extends» & «set» и не может понять, в чем проблема.

Что нужно изменить, чтобы устранить эту ошибку?

+0

ли вам еще нужна помощь с этим john_a? –

ответ

-2

Изменение этого в файле стр.1/skeleton.twig:

{% for sec in test %} 

Тогда он будет работать. Я попробовал. Убедитесь, что вы понимаете, почему!

+1

Это не работает: [twigfiddle] (http://twigfiddle.com/5v0dk9) – DarkBee

+0

@DarkBee ничего себе, есть что-то вроде twigfiddle. Приятно знать: D –

+0

Привет @DarkBee и @dragoste да, вы правы. Я только пытался заставить OP сделать какую-то работу **, а не за ** вы **, чтобы выполнять свою работу. Итак, благодарю вас за голоса! Он уже прокомментировал свои ошибки, о переменных за пределами блока, что является проблемой. Но он не допустил других своих ошибок, например, на Линии 20 скрытый абзац абзаца. ОП даже не приложил усилий, чтобы попробовать '{{dump (test)}}', чтобы посмотреть, что это показывает, и выяснить из моего ответа, что я пытался заставить его сделать. –

2

blocks в twig имеют свой собственный переменный объем.
Переменные, созданные внутри блока, не могут быть доступны за его пределами.

Имо вы должны проверить, только если переменная существует, и в противном случае создать значение по умолчанию:

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', 
      ], 
    ); 
+0

> Переменные, созданные внутри блока, не могут быть доступны за его пределами. Я читал, что блоки имеют доступ к внешним областям. Который теперь я понимаю, означает прямо противоположное направление того, что я предполагал. : -/ > Imo вы должны только проверить, существует ли переменная, и в противном случае создать значение по умолчанию Это работает. Данные 'addl' все еще могут находиться.twig 'extends' - просто не в блоке. IIUC, компиляция twig заботится о порядке, обрабатывает расширяющий шаблон и задает параметр var in-scope, переопределяя значение «если не определено» родителем. Спасибо! – unknown

+0

final, http://twigfiddle.com/5v0dk9/2 – unknown

 Смежные вопросы

  • Нет связанных вопросов^_^