当前位置: 首页 > 知识库问答 >
问题:

Symfony 2表单,嵌入集合中的嵌入集合

楚骞尧
2023-03-14

我有一个数据结构,其中一个主题有许多问题(一对多),一个问题有许多答案(一对多)。

我已经在主题表单中设置了问题作为嵌入式集合,由于有了烹饪书条目,我可以百分之百地解决所有问题。

当我试图开发它以在问题表单中嵌入一组答案表单时,我遇到了一个问题。

包含顶层原型表单的数据原型属性具有表单的全部深度,因此包括问题和答案的原型。但它对每个级别使用相同的占位符。

<div id="topic_questions___name__">
<div class="control-group">
    <label for="topic_questions___name___questionText" class="control-label">question</label>
    <div class="form-row-errors"></div>
    <div class="controls">
        <textarea id="topic_questions___name___questionText" name="topic[questions][__name__][questionText]" required="required" class="input-block-level"></textarea>
    </div>
</div>
<div class="control-group">
    <label class="control-label">answers</label>
    <div class="controls">
        <div id="topic_questions___name___answers"     data-prototype="&lt;div class=&quot;control-group&quot;&gt;&lt;label class=&quot;control-label&quot;&gt;__name__label__&lt;/label&gt;&lt;div class=&quot;controls&quot;&gt;&lt;div id=&quot;topic_questions___name___answers___name__&quot;&gt;&lt;div class=&quot;control-group&quot;&gt;&lt;label for=&quot;topic_questions___name___answers___name___answerText&quot; class=&quot;control-label&quot;&gt;option&lt;/label&gt;&lt;div class=&quot;form-row-errors&quot;&gt;&lt;/div&gt;&lt;div class=&quot;controls&quot;&gt;&lt;input type=&quot;text&quot; id=&quot;topic_questions___name___answers___name___answerText&quot; name=&quot;topic[questions][__name__][answers][__name__][answerText]&quot; required=&quot;required&quot; maxlength=&quot;255&quot; /&gt;&lt;/div&gt;&lt;/div&gt;&lt;input type=&quot;hidden&quot; id=&quot;topic_questions___name___answers___name___sortOrder&quot; name=&quot;topic[questions][__name__][answers][__name__][sortOrder]&quot; /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;"></div>
    </div>
</div>

你可以在底部看到一条很长的线,我想这就是原型(!)答案表。我无法只替换与问题相关的占位符,而不替换与答案相关的占位符。

做正常的事

var newForm = prototype.replace(/__name__/g, collectionHolder.children().length);

在创建问题表单的真实实例时,当然会将__name__的所有实例替换为相同的值,因此当为答案表单创建数据原型时,它已经替换了所有占位符。

这就是答案表单的数据原型,当我点击添加一个真正的问题表单时

<div class="control-group">
<label class="control-label">1label__</label>
<div class="controls">
    <div id="topic_questions_1_answers_1">
        <div class="control-group">
            <label for="topic_questions_1_answers_1_answerText" class="control-label">option</label>
            <div class="form-row-errors"></div>
            <div class="controls">
                <input type="text" id="topic_questions_1_answers_1_answerText" name="topic[questions][1][answers][1][answerText]" required="required" maxlength="255" />
            </div>
        </div>
    </div>
</div>

如您所见,占位符根本不起作用-在创建问题表单时,它已被替换为问题表单的计数。

使用Symfony提供的机制是否可以实现这种多深度嵌入式集合?

只要它尝试为每个“级别”使用相同的占位符,那么我就看不出如何使用。

共有1个答案

袁何平
2023-03-14

您是否至少使用Symfony 2.1?如果是这样,您可以使用属性“prototype\u name”更改标签:

http://symfony.com/doc/master/reference/forms/types/collection.html#prototype-名称

以您的形式:

->add('answers', 'collection', array(
    'type' => new AnswerType(),
    'allow_add' => true,
    'prototype_name' => 'another_name'
))
 类似资料:
  • 我有一个mongodb文档,我已经把它变成了一个表单。该文档有两个emebedOne文档,它们也是表单。正在验证主文档,但未验证嵌入文档。我正在使用自定义断言,但我认为这不重要。 文档 嵌入式类对此的自定义断言永远不会调用。 形式 处理程序 谢谢你的帮助。 科里

  • 问题内容: 我想知道是否有可能在另一个Embeddable中包含Embeddable的ElementCollection? 这是我的供应商实体的示例,该实体具有可嵌入类型的地址列表: 这是我的可嵌入地址,其中包含可嵌入电话的列表 这是嵌入式电话的定义 我目前正在使用JPA 2 + Hibernate 3.6.x对此进行测试 在地址中使用嵌入式电话在我的测试中导致错误。这是最底层的部分调试消息: 删

  • 我有一个实体根 集合项“col”本身具有嵌入对象 EMB“对象非常简单 我希望数据库表是这样的 表:根字段:ID 表:ROOT_COLS字段:ROOT_ID,EMB_FIELD 启动这个spring boot应用程序会给我一个ArrayIndexOutOfBoundsException 如何修复此问题? hibernate版本:5.0.12 null

  • 问题内容: 我在Scala和Java之间遇到编译问题。 我的Java代码需要一个 我的scala代码有一个 我收到编译错误: 似乎scala.collection.JavaConversions不适用于嵌套集合,即使Vector可以隐式转换为Iterable。除了遍历scala集合并手动进行转换之外,我还能做些什么使这些类型起作用? 问题答案: 应该弃用恕我直言。您最好使用来明确说明转换的时间和地

  • 只使用一个集合很好,但是我需要编辑外部窗体的原型,所以它为每一行呈现内部窗体的原型。 你知道我该怎么做吗?还有什么是最好的储蓄方式 编辑:现在我正在尝试呈现嵌套窗体的原型: 促销特征选择类型 第一级原型,工作很好。

  • 在工作中,我在Symfony 3.4/Doctrine/mySQL中有一个(旧的)项目,其中我使用了一组嵌入式表单。A类包含对象B(ManyToOne)的arrayCollection(原则一域一域)。 在创建或编辑时,对象A的输入形式允许使用“添加”按钮创建/修改/删除对象B的嵌入形式。它按预期工作。 原则级联(持久化/删除和孤儿删除)允许自动持久化对象A上的所有修改(包括新的/修改/删除嵌入的