如何在symfony2表单集合中自定义数据原型?

发布于 2025-01-03 01:14:27 字数 782 浏览 1 评论 0原文

我的表单中有一组隐藏字段。

<ul id="user_roles">
  <li><hidden field value="role1"></li>
  <li><hidden field value="role2"></li>
  (...)
</ul>

我使用 jQuery(和数据原型)来添加新角色。

问题是我想渲染这样的东西:

<ul id="user_roles">
  <li>role1 <hidden field value="role1"></li>
  <li>role2 <hidden field value="role2"></li>
  (...)
</ul>

初始渲染没有问题:我只是输入:

{% for role in roles %}
 <li> {{ role }} {{ form_row(role) }} </li>
{% endfor %}

但是默认的数据原型只会渲染 {{ form_row (角色)}}(隐藏字段)。

我应该在哪里更改默认数据原型?

form_div_layout.html 中没有我可以自定义的 {% block prototype %}...

I've got a collection of hidden fields in my form.

<ul id="user_roles">
  <li><hidden field value="role1"></li>
  <li><hidden field value="role2"></li>
  (...)
</ul>

I use jQuery (and data-prototype) to add new roles.

The problem is that I would like to render something like this:

<ul id="user_roles">
  <li>role1 <hidden field value="role1"></li>
  <li>role2 <hidden field value="role2"></li>
  (...)
</ul>

No problem with the initial rendering: i just put:

{% for role in roles %}
 <li> {{ role }} {{ form_row(role) }} </li>
{% endfor %}

But the default data-prototype will render only {{ form_row(role) }} (a hidden field).

Where am I supposed to change the default data-prototype?

There is no {% block prototype %} in form_div_layout.html that i could customize....

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

终陌 2025-01-10 01:14:27

集合小部件定义如下:

{% block collection_widget %}
{% spaceless %}
    {% if prototype is defined %}
        {% set attr = attr|merge({'data-prototype': form_row(prototype) }) %}
    {% endif %}
    {{ block('form_widget') }}
{% endspaceless %}
{% endblock collection_widget %}

因此您可以覆盖它来控制渲染原型的方式。

The collection widget is defined as follows:

{% block collection_widget %}
{% spaceless %}
    {% if prototype is defined %}
        {% set attr = attr|merge({'data-prototype': form_row(prototype) }) %}
    {% endif %}
    {{ block('form_widget') }}
{% endspaceless %}
{% endblock collection_widget %}

So you can override this to gain control on how you want to rendre the prototype.

标点 2025-01-10 01:14:27

您还可以通过调用 Roles.vars.prototype 从模板内部访问原型,并稍后在 JS 中使用它。如果你想将它放入 div 的 data-prototype 属性中(因为它通常呈现),你必须记住转义它:

<div data-prototype="{{ form_row(roles.vars.prototype) | escape }}">
  {% for role in roles %}
    <li> {{ role }} {{ form_row(role) }} </li>
  {% endfor %}
</div>

You can also access prototype from inside template by calling roles.vars.prototype and use it later in your JS. If you want to put it into data-prototype attribute of div (as it is normally rendered) you have to remember to escape it:

<div data-prototype="{{ form_row(roles.vars.prototype) | escape }}">
  {% for role in roles %}
    <li> {{ role }} {{ form_row(role) }} </li>
  {% endfor %}
</div>
倚栏听风 2025-01-10 01:14:27

文档中推荐的方法 允许您在应用程序内轻松地独立定制每个集合,所有这些都在同一个文件中。

  • 创建文件prototype_layout.html.twig

    {% block _myform_mycollection_entry_row %}
        
    {{ form_row(form.title) }}
    ;
    {{ form_row(form.author) }}
    ;
    {% 末端嵌段 %}

块的名称很重要。如果您的父表单名为 MyformType,则第一部分将为 _myform;如果拥有该集合的表单字段名为 _mycollection,则第二部分将为 _mycollection。第三部分必须始终为 _entry_row 才能使其正常工作。

例如,如果您有一个 UserType 表单,其中包含 'books 的集合' 块名称可能是 _user_books_entry_row

为了确保名称正确,请添加一个子表单(通过单击“添加”按钮使用 javascript 添加子表单)并检查相应选择 html 的 id元素使用浏览器的检查器工具。

如果它看起来像 user_books_0_title,那么块名称将为 _user_books_entry_row

  • config.yml 的 twig 部分声明此文件作为全局表单主题< /代码>:

    <前><代码>树枝:
    表单主题:
    - 'AppBundle:Form:prototype_layout.html.twig' #如果您将文件保存在其他地方,请调整此路径

  • 您还可以直接在表单视图中使用该文件:

{% use "AppBundle:Form:prototype_layout.html.twig" %}

The method recommended in the docs allows you to easily customize each collection independently inside your app, all within the same file.

  • Create a file prototype_layout.html.twig:

    {% block _myform_mycollection_entry_row %}
        <div class="row">
            <div class="col-sm-6">{{ form_row(form.title) }}</div>
            <div class="col-sm-6">{{ form_row(form.author) }}</div>
        </div>
    {% endblock %}
    

The name of the block is important. The first part will be _myform if your parent form is called MyformType and the second part _mycollection if your form field owning the collection is called so. The third part must always be _entry_row in order for this to work.

For example, if you have a UserType form with a collection of 'books' the block name might be _user_books_entry_row

To make sure you got the name right, add a subform (by clicking the add button adding subforms with javascript) and inspect the id of the corresponding select html element using the inspector tool of your browser.

If it looks like user_books_0_title, then the block name will be _user_books_entry_row

  • Declare this file as a global form theme in the twig section of config.yml:

    twig:
        form_themes:
            - 'AppBundle:Form:prototype_layout.html.twig' #adapt this path if you saved your file elsewhere
    
  • You can also use the file directly in your form view:

{% use "AppBundle:Form:prototype_layout.html.twig" %}

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文