繁体   English   中英

Symfony Form Collection主题设置但提供一些数据

[英]Symfony Form Collection Theming but feed some data

Symfony 3.3

我有一个航程实体形式

航海实体中有一个集合,名为城市,是实体城市的集合。 带有城市名称的集合的表单也是如此。

用户首先使用该表单并创建一个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实例时,它已经包含了一些城市。 我该如何渲染它们? 如何从主题中访问城市变量。

我的部分解决方案:我想从主题文件中提取“ container-cities”块到呈现的html,在该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的字段)

我的问题

  • 如何访问主题内的城市并使用宏对其进行渲染?

要么

  • 由于form.cities似乎不是实际的City实体集合,因此如何访问渲染表单的城市项目,并摆脱该错误?

谢谢

我终于解决了,就是这么简单:

我只是在表单主题中使用了它:

{% for city in form %}
{{ proto.city(city, city.vars.value.id, city.vars.value.name, city.vars.value.zip) }}
{% endfor %}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM