我的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)是否有办法将这些字段放入一个单独的类中,该类将处理最终确定选择哪个类别的逻辑?
答案 0 :(得分:3)
我建议如下:
1)创建一个新的自定义表单字段类型,并将所有entity
放在那里。
此过程与表单类型的普通创建没有太大区别。只需将这些字段包含在它自己的buildForm()
中,这应该可以解决问题。 Docs
2)用属性“entity
=> property_path
”标记所有false
个字段。
显然,您不会将这些值存储在模型中。
3)再添加两个字段:chosen
和lastOne
。
现在,这可能很棘手:我要么将chosen
设置为text
类型(基本上是泛型类型),要么也会使用entity
。如果您选择entity
,则需要包含所有实体字段的所有可能答案。至于lastOne
将其设置为text
,因为它会反映最后选择的字段(按名称)。
无论哪种方式,这两个字段都是不可见的。不要忘记为property_path
字段设置false
到lastOne
。
4)最后,添加ValueTransformer
(docs),其中包含“查看”最后选择的字段的逻辑。
现在,我只处理了一次并且还没有完全理解它,所以你最好的选择是试用官方文档的例子,不幸的是。
基本上你应该做的是在值变换器中读取字段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
的代码示例。这里有点晚了,明天会尽力进一步更新这个答案。