2016-09-09 1 views
-2

J'ai un modèle de squelette symfony3/brindilleLes variables {% set%} dans un 'bloc' d'un fichier squelette ne sont pas reconnues et ne peuvent pas être utilisées lors de l'extension du fichier?

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> 

Je crée alors un modèle de mise en page qui étend le squelette avec des données « réelles »

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

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

Mais quand je produis/publier la page, les incendies Symfony une erreur

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

se plaindre du squelette lui-même.

Ce tableau 'test' est défini dans le squelette. Afaict de lire les documents sur 'bloc', 'étend' & 'set', et ne peut pas comprendre exactement quel est le problème.

Que dois-je changer pour éliminer cette erreur?

+0

Avez-vous encore besoin d'aide avec ce john_a? –

Répondre

-2

modifier dans le fichier page1/skeleton.twig:

{% for sec in test %} 

Ensuite, il fonctionnera. Je l'ai essayé. Assurez-vous de comprendre pourquoi!

+1

Cela ne fonctionne pas: [twigfiddle] (http://twigfiddle.com/5v0dk9) – DarkBee

+0

@DarkBee wow, il y a quelque chose comme twigfiddle. Bon à savoir: D –

+0

Bonjour @DarkBee et @dragoste oui vous avez raison. J'essayais seulement de faire en sorte que le PO fasse du ** travail **, pas que ** vous ** fassiez son travail. Alors, merci pour les votes vers le bas! Il a déjà commenté ses erreurs, sur les variables en dehors du bloc qui est un problème. Mais il n'avait pas admis ses autres erreurs, par exemple sur la ligne 20 l'étiquette de paragraphe non fermée. L'OP n'a même pas fait un effort pour essayer un '{{dump (test)}}' pour voir ce que cela montre, et comprendre de ma réponse ce que j'essayais de lui faire faire. –

2

blocks dans twig ont leur propre portée variable.
Les variables créées à l'intérieur d'un bloc ne sont pas accessibles en dehors de celui-ci.

Imo vous devez tester seulement si existe et sinon créer la variable la valeur par défaut:

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

> Les variables créées à l'intérieur d'un bloc ne sont pas accessibles en dehors de celui-ci. Je lisais que les blocs ont accès aux portées externes. Ce que je comprends maintenant signifie exactement la direction opposée de ce que je supposais. : -/ > Imo vous devriez seulement tester si la variable existe et sinon créer la valeur par défaut Cela fonctionne. Les données 'addl' peuvent toujours être dans.twig 'extends' - mais pas dans un 'block'. IIUC, la compilation twig prend en charge l'ordre, traite le modèle d'extension et définit la variable var dans l'étendue, en remplaçant la valeur par défaut "si non définie" du parent. Merci! – unknown

+0

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