【问题标题】:Set multiple on EntityType per Entity instance在每个实体实例的 EntityType 上设置多个
【发布时间】:2017-04-27 11:03:54
【问题描述】:

根据我的问题域,我需要一个 EntityType 混合 RadioButtonsCheckBoxes

每个Selection 都有一个multiple 属性设置为truefalse,因为它需要checkboxradio

Product Selections:

[X] Selection 1
[ ] Selection 2
( ) Selection 3
(o) Selection 4
[X] Selection 5

Selection 是一个实体,一个Product 可以有多个Selections。

产品类型

class ProductType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('selections', SelectionListType::class);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => Product::class
        ));
    }
}

class SelectionListType extends AbstractType
{
    public function configureOptions(OptionsResolver $resolver)
    {

        $resolver->setDefaults(array(
            'class'         => Selection::class,
            'expanded'      => true,
            'multiple'      => ???????????
        ));
    }

    public function getParent()
    {
        return EntityType::class;
    }
}

我尝试使用Form Type Extension,但没有成功:class

EntityTypeExtension extends AbstractTypeExtension
{
    public function getExtendedType()
    {
        return EntityType::class;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefined(array('multiple'));
    }

    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        if (isset($options['multiple'])) {
            $parentData = $form->getParent()->getData();

            $multiple = null;
            if (null !== $parentData) {
                $accessor = PropertyAccess::createPropertyAccessor();
                $multiple = $accessor->getValue($parentData, $options['multiple']);
            }

            $view->vars['multiple'] = $multiple;
        }
    }
}

我应该如何实现这个?

【问题讨论】:

  • selections 应该是一个CollectionTypeentry_type 设置为SelectionListType
  • @JakubMatczak 这将产生所有选择列表的集合。如果您仍然认为这可能是一个解决方案,请说明
  • 我可能误解了您的问题,现在我不确定您要做什么。当您有一些单选按钮和一些复选框时,我不知道它是如何工作的。看起来您的实体代表表单类型的属性而不是其值,我不知道复选框/单选值与实体的关系。
  • 每个Product 可以有多个Selections,可以是复选框或单选。 Selection 是一个实体,具有一些属性:字符串 title 和布尔值 multiple。这有什么不清楚的地方?
  • 选择了Selection是什么意思?它是如何反映在实体中的?

标签: symfony symfony-forms


【解决方案1】:

根据您的问题和 cmets,我认为最好的解决方案是将其拆分为两个 EntityTypes - 一个将 multiple 设置为 false,另一个设置为 true

然后使用DataTransformerSelection 集合拆分为两个数组并将它们放入适当的EntityTypes。您还需要将来自这些EntityTypes 的数据合并到反向数据转换器中的一个集合中,并将其放入您的Product 实体中。

最好在单独的FormType 中执行此操作,以使其透明地工作。

【讨论】:

  • Tnx 的想法,但如果你添加一些 sn-ps 来表示实际的实现会很有帮助。提前感谢您的时间
  • 每个人都只是给出理论上的答案,但你在任何地方都找不到例子。你能用一些实际的代码来演示一下吗?
猜你喜欢
  • 2016-06-19
  • 1970-01-01
  • 2011-07-07
  • 2011-12-29
  • 2019-07-09
  • 2023-03-17
  • 1970-01-01
  • 2011-02-18
  • 1970-01-01
相关资源
最近更新 更多