Symfony 3.3
我有一个我的Voyage实体的形式
Voyage实体中有一个Collection,名为cities,实体City的集合。 具有Collection命名城市的表单也是如此。
用户首先使用表单并创建一个Voyage实例并添加一些城市,我设法自定义原型并在用户点击“添加城市”按钮时通过javascript渲染。
表单以这种方式呈现给有趣的部分(没有html的已清理版本):
{% extends "@User/layout.html.twig" %}
{% form_theme form.cities '@Prototype/city.html.twig' %}
{% block content %}
{{ form_start(form) }}
{{ form_errors(form) }}
{{ form_row(form.cities) }}
{{ form_rest(form) }}
{{ form_end(form) }}
{% endblock content %}
'form.cities'的主题:
{% block collection_widget %}
{% import '@Prototype/prototype.city.twig' as proto %}
{% spaceless %}
<div class="collection">
{% if prototype is defined %}
{% set attr = attr|merge({'data-prototype': proto.city(prototype)|escape }) %}
{% endif %}
<div {{ block('widget_container_attributes') }}></div>
<div id="container-cities">
{# Here I will add the cities via javascript when user add one #}
</div>
</div>
{% endspaceless %}
{% endblock collection_widget %}
此主题中使用的宏文件,并作为proto导入:
{% macro city(widget, id, name, zip) %}
{% spaceless %}
<div
class="added-city border-gray"
data-id="{{id|default('__id__')}}"
id="{{name|default('__name__')}}">
{{name|default('__city_name__')}} ({{zip|default('__zip__')}})
{{ form_errors(widget) }}
{{ form_widget(widget) }}
</div>
{% endspaceless %}
{% endmacro %}
我的一般问题:当用户想要编辑其Voyage实例时,它已经有一些城市。我该如何渲染它们?如何从主题中访问cities变量。
我的部分解决方案:我想从主题文件中提取'container-cities'块到初始呈现表单的呈现的html,以及我可以访问变量的地方:
{% import '@Prototype/prototype.city.twig' as proto %}
{% for city in form.cities %}
{{ proto.city(city, city.name) }}
{% endfor %}
但它给了我这个错误:
Neither the property "name" nor one of the methods "name()", "getname()"/"isname()"/"hasname()" or "__call()" exist and have public access in class "Symfony\Component\Form\FormView".
(在city.id上没有失败,可能是因为其他一些名为id的字段)
我的问题:
或
由于
答案 0 :(得分:0)
我终于解决了它,就这么简单:
我刚用形式主题:
{% for city in form %}
{{ proto.city(city, city.vars.value.id, city.vars.value.name, city.vars.value.zip) }}
{% endfor %}