【问题标题】:Symfony3 Variable does not exist in including templateSymfony3 变量在包含模板中不存在
【发布时间】:2017-01-08 10:33:09
【问题描述】:

我收到以下错误:变量“文件”不存在。

包含的模板 Contractor:file.html.twig 如下所示:

{{ dump(file) }}

主模板 form.html.twig 如下所示:

{% extends '::base.html.twig' %}
{% form_theme form 'NaSoftEdmBundle:Form:fields.html.twig' %}

...

{% block files %}
  {% for file in form.files %}
     {{ include('NaSoftEdmBundle:Contractor:file.html.twig', {'file': file}) }}
  {% endfor %}
{% endblock %}

控制器:

public function editAction(Request $request, Contractor $contractor)
{
    ...
    return $this->render('NaSoftEdmBundle:Contractor:form.html.twig', array(
        'form' => $form->createView(),
    ));
}

但是当我尝试在主模板文件 (form.html.twig) 中显示一个变量时,该变量变为可用:

{% for file in form.files %}
   {{ dump(file) }} {# it work! #}
{% endfor %}


ContractorFile {#499 ▼
 -id: 154
 -uploadedFile: null
 -name: "57c6d217d9a92.jpg"
 -origName: "1471590585502.jpg"
 -path: "/contractor/docs/files/2/335"
 -size: 153536
 -mimeType: "image/jpeg"
 -updateDate: DateTime {#496 ▶}
 -contractor: Contractor {#370 ▶}
}

命令php app/console cache:clear 没有帮助

【问题讨论】:

    标签: php twig symfony


    【解决方案1】:

    将变量传递给 Twig include 命令的正确方法是:

    {% include 'NaSoftEdmBundle:Contractor:file.html.twig' with {'file': file} %}
    

    正如@walther 在 cmets 中指出的那样,实际上不需要传递变量,因为包含的模板可以访问活动上下文的变量,即您可以简单地编写:

    {% include 'NaSoftEdmBundle:Contractor:file.html.twig' %}
    

    并且将使用file 变量。

    如果你想分配一个新变量,你仍然必须使用with 语法,例如

    {% include 'NaSoftEdmBundle:Contractor:files.html.twig' with {'files': form.files} %}
    

    http://twig.sensiolabs.org/doc/tags/include.html

    【讨论】:

    • 哎呀!感谢您指出我的错误。修正了答案。
    • 没问题。顺便说一句,在这种情况下,仅仅包括文件就足够了吗?根据文档,包含的文件应该可以访问当前上下文的变量。目前无法测试,所以不确定。
    • 你再次正确 :-) 我现在测试了它。我扩展了我的答案以提供所有可用的选项。
    • 本文档指导我:symfony.com/doc/current/… 仍然无法工作(我无法将任何变量发送到 file.html.twig
    • 由于某种原因它不能在 Twig 中使用继承变量
    【解决方案2】:

    问题是我在开始循环“for”之前为属性data-prototype包含了相同的模板:

    data-prototype="{% filter escape %} 
         {% include 'NaSoftEdmBundle: Contractor: file.html.twig' with { '_form':form.files.vars.prototype} %}
    {% endfilter %}"
    

    我已经为属性“data-prototype”创建了新模板并且它有效。

    data-prototype="{% filter escape %} 
         {% include 'NaSoftEdmBundle: Contractor: filePrototype.html.twig' with { 'file':_form.files.vars.prototype} %}
    {% endfilter %}"
    

    这已实现自定义模板集合

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-21
      • 1970-01-01
      • 2011-03-09
      • 1970-01-01
      • 2013-04-05
      • 2015-11-18
      • 2013-11-08
      • 1970-01-01
      相关资源
      最近更新 更多