php - 在 Symfony2 中自定义选择/实体字段的呈现

标签 php symfony rendering customization

我想要一个 <select>在其 <option> 上使用附加数据呈现的元素秒。举例来说,我想要一个服务选择器(非多个实体字段)在选择更改时重置另一个输入值。我对使用 JS 数据结构不感兴趣,我需要呈现的字段如下所示:

<select name="...">
    <option value="1" data-price="90">Service 1</option>
    <option value="2" data-price="40">Service 2</option>
</select>

我会采用两种不同的解决方案,并且很高兴看到这两种解决方案的答案。

  1. 我将通过使用 form 开始组装上述 HTML 代码,在 Twig 中手动呈现该字段。我传递给 Twig 的变量。我有两个问题来解决这个问题。 A) 我找不到一个安全的方法来告诉应该命名的文件,即我如何获得 name Symfony 通过使用变量 form.service 期望的属性(服务是 FormType 中字段的名称)。 [请给我一些技巧,这些技巧基于观察字段当前由 Symfony 命名的方式来连接一些值;应该依赖接口(interface)而不是逆向工程。] B) 我不知道如何访问选择列表,即由 entity 组装的数组场的query_builder选项。 [因为我正在寻找通用解决方案,所以我不愿意将这些项目复制到 Controller 中的 Twig 参数中——只是为了避免此类建议。]
  2. 我会按照食谱的表单样式章节中的建议覆盖相关字段 block 的呈现,但这样做存在三个问题。 A) 我找不到应该覆盖哪些 block (因此我找不到示例)。 B) 我会将参数从表单生成器传递到 block ,让它知道额外的 data-要渲染属性,但我不知道该怎么做。最后 C) 在我不需要偏离标准呈现的情况下(例如,当字段是多个时)我不知道如何回退到默认呈现。

所以这些实际上是 5 个问题(1A、1B、2A、2B、2C),但我认为它们对其他人一起回答更有用,因为它们都解决了我认为关于选择字段渲染的未记录点。

最佳答案

1. 手动渲染。如果是单独的字段表单,而不是在那里重复某些内容,则更好,因为它需要更少的工作时间。

A) 获取您可以使用 form.service.vars.full_name

的字段名称

B) 选择列表 - form.service.vars.choices。它是一个 ChoiceView 数组,获取实体只需访问公共(public) data 属性。

{% for choice in form.service.vars.choices %}
    {% set service_entity = choice.data %}
{% endfor %}

2. 通过覆盖模板。如果你喜欢暴力获取必须覆盖的 block 的名称。

A) 您只能将 widgetlabelerrors block 覆盖为 documentation说。您可以通过小部件名称 ( documentation ) 指定 block 。有点像

{% block _form_service_widget %}
    {% if expanded %}
        {{ block('choice_widget_expanded') }}
    {% else %}
        {{ block('my_service_widget') }}
    {% endif %}
{% endblock %}

{% block my_service_widget %}
{% spaceless %}
    <select {{ block('widget_attributes') }}{% if multiple %} multiple="multiple"{% endif %}>
        {% if empty_value is not none %}
            <option value="">{{ empty_value|trans({}, translation_domain) }}</option>
        {% endif %}
        {% set options = choices %}
        {{ block('my_service_options') }}
    </select>
{% endspaceless %}
{% endblock my_service_widget %}

{% block my_service_options %}
{% spaceless %}
    {% for group_label, choice in options %}
        {# here you can access choice #}
        <option value="{{ choice.value }}"{% if choice is selectedchoice(value) %} selected="selected"{% endif %}>{{ choice.label|trans({}, translation_domain) }}</option>
    {% endfor %}
{% endspaceless %}
{% endblock my_service_options %}

关于php - 在 Symfony2 中自定义选择/实体字段的呈现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15684751/

相关文章:

php - 修复尝试从数据库检索数据时 php 中的显示格式

javascript - 单击按钮时 jQuery 返回 PHP 脚本

php - 如何在自动建议中避免与 MySQl 重复

php - Swiftmailer:无法连接 TLS 加密

Golang 模板不渲染 html

javascript - 选择下拉列表时生成更多 MYSQL 数据库结果

bash - symfony 服务器 :start command throwing an error

php - Symfony 2 - 实体必须被管理或安排删除以进行单次计算

java - Swing 无法正确渲染我的 JPanel

Android Studio 呈现交互式内容的错误