3

我的Product实体具有以下结构:

private $id;

private $title;

/**
 * @ManyToOne(targetEntity="Category")
 * @JoinColumn(name="cat_id", referencedColumnName="id")
 */
private $category;

Category有嵌套结构。每一层嵌套都显示在 5 个单独的字段中:

在此处输入图像描述

在类表单代码中,我是这样解决的:

$builder
->add('cat_1', 'entity', array(
    ...
    'query_builder' => function() { return someSelectLogic1(); }
))
->add('cat_2', 'entity', array(
    ...
    'query_builder' => function() { return someSelectLogic2(); }
))
->add('cat_3', 'entity', array(
    ...
    'query_builder' => function() { return someSelectLogic3(); }
))
->add('cat_4', 'entity', array(
    ...
    'query_builder' => function() { return someSelectLogic4(); }
))
->add('cat_5', 'entity', array(
    ...
    'query_builder' => function() { return someSelectLogic5(); }
))

现在我需要知道最后一回合填充了哪个字段,并在实体属性中传递该字段的值。

在所有我不喜欢的地方:

  • 确定最后填写哪个类别的字段的复杂逻辑

  • 这些字段中的每一个都不与实体绑定'mapped' => false

1)组织我的表单代码的正确方法是什么?

2)有没有办法将这些字段放入一个单独的类中,该类将处理确定最终选择哪个类别的逻辑?

4

1 回答 1

3

我建议如下:

1)创建一个新的自定义表单字段类型并将所有这些都entity放在那里。

这个过程与普通的表单类型创建没有太大区别。只需将这些字段包含在它自己的字段中,buildForm()这应该可以解决问题。文档

2)用属性“ => ”标记所有这些entity字段。property_pathfalse

显然,您不会将这些值存储在模型中。

3) 添加另外两个字段:chosenlastOne

现在,这可能很棘手:我要么设置chosentext类型(基本上是泛型类型),要么也使用entity。如果你去,entity你需要包括所有实体字段的所有可能答案。至于lastOne设置它,text因为它将反映最后选择的字段(按名称)。

无论哪种方式,这两个字段都是不可见的。不要忘记设置为property_path字段。falselastOne

4)最后,添加ValueTransformerdocs)它将包含“查看”最后选择哪个字段的逻辑。

现在,我只处理过一次并且还不太了解它,所以你最好的选择是使用官方文档中的示例进行反复试验,不幸的是。

基本上你应该做的是在 value-transformer 中读取 field 的值lastOne。这将为您提供最后选择的字段的名称。然后,使用该值,读取实际选择的最后一个值。最后,将该值(对象,如果您选择entity类型,否则为 ID)设置为chosen字段。

那基本上应该做的事情。

至于 JS,我不知道你是否使用任何框架,但我会假设 jQuery。您需要将lastOne字段设置为表单中的选择项。

$(function(){
    $('#myform').find('select').on('change', function(){
        var $this = $(this);
        $this.closest('form').find('#__ID_OF_YOUR_LASTONE_FIELD').val($this.attr('name'));
    });
});

很抱歉,我现在无法为您提供代码示例PHP。这里有点晚了,明天会尽力进一步更新这个答案。

于 2013-03-11T01:43:09.180 回答