Symfony 2中一个属性实体的一组字段

时间:2013-03-10 19:29:32

标签: forms symfony

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

private $id;

private $title;

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

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

enter image description here

在类表单代码中,我以这种方式解决它:

$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)是否有办法将这些字段放入一个单独的类中,该类将处理最终确定选择哪个类别的逻辑?

1 个答案:

答案 0 :(得分:3)

我建议如下:

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

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

2)用属性“entity => property_path”标记所有false个字段。

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

3)再添加两个字段:chosenlastOne

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

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

4)最后,添加ValueTransformerdocs),其中包含“查看”最后选择的字段的逻辑。

现在,我只处理了一次并且还没有完全理解它,所以你最好的选择是试用官方文档的例子,不幸的是

基本上你应该做的是在值变换器中读取字段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的代码示例。这里有点晚了,明天会尽力进一步更新这个答案。