首页 > 解决方案 > 将数组/json数据转换为表单集合

问题描述

我正在尝试仅基于数组类型的数据创建一个表单集合。用户应该能够同时查看、编辑、添加和删除多条记录。我之前做过这样的集合,基于:https://symfony.com/doc/current/form/form_collections.html,但仅适用于具有 OneToMany 关系的表单,其中 data_class 存在于嵌套表单中,也就是说 - 数据是映射到实体。

目前,问题有所不同。在我的数据库中,我有一个 id 数组,即[1,2]- 在我的表单/实体中,它对应于一个字段ordChangeAnnul

我的表格是:

->add('ordChangeAnnul', CollectionType::class, [
    'entry_type' => OrdChangeAnnulType::class,
    'entry_options' => array('label' => false),
    'required' => false,
    'error_bubbling' => false,
    'empty_data' => null,
    'allow_add'    => true,
    'allow_delete' => true,
    'label' => false,
])

嵌套形式:

class OrdChangeAnnulType extends AbstractType {

    public function __construct(EntityManagerInterface $entityManager)
    {
        $this->entityManager = $entityManager;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('ord_year', ChoiceType::class, [
                'mapped'=>false,
                'label' => 'Rok wydania',
                'choices' => $this->entityManager->getRepository('App:ContentsOrdinances')->getYears(),
                'placeholder' => 'Wybierz z listy'
            ])
            ->add('ord', EntityType::class, [
                'mapped' => false,
                'label' => 'Zmienianie zarządzenie',
                'class' => ContentsOrdinances::class,
                'query_builder'=> function(EntityRepository $er) {
                    return $er->createQueryBuilder('c');
                },
                'choice_label' => 'ordNumber',
                'placeholder' => 'Wybierz z listy',
                'invalid_message' => 'Nie ma takiej wartości.',
            ])
        ;
    }
}

我想要实现的是,OrdChangeAnnulType每个 id 有一个表单,并根据收到的 id 将该表单中的字段(select 的值)处理为我的实体的值,反之亦然 - 也就是说,处理所有表单集合到一个 id 数组。

到目前为止,我所做的尝试可能会详细说明情况。我尝试使用 ModelTransformer 通过以下方式更改数据:

    $builder->get('ordChangeAnnul')
    ->addModelTransformer(new CallbackTransformer(
        function($asArray) {
            $repository = $this->em->getRepository(ContentsOrdinances::class);
            $data = $repository->getByIds($asArray);
            $return = [];
            foreach($data as $item) {
                $return[] = ['ord_year' => $item->getOrdDate()->format('Y'), 'ord' => $item];
            }
            $return = new ArrayCollection($return);
            return $return;
        },
        function($asOrdinances) {
            $arr = [];
            dd($asOrdinances);
            if($asOrdinances != null)
                foreach($asOrdinances as $ordinance){
                    $arr[] = $ordinance['ord']->getId();
                }
            return $arr;
        }
    ));

也就是说,我尝试根据实体 ID 获取实体集合,然后使用年份和实体/其 ID 填充嵌套表单。相反,我想获取表单中的所有 id 并形成一个数组,然后将结果发送到数据库。

但是,我的尝试不起作用。在视图中,它没有将“选择”字段设置为适当的值,它们保持默认值。手动选择新值也会产生奇怪的结果,因为当我转储它们时,初始转换中设置的值似乎没有被覆盖。

最后一个问题是:在我的情况下,如何以这种方式基于 id 数组构建表单集合,以便在两个方向上正确解析选择的值?

此外,还有一个多选的解决方法,但我不应该使用多选。

如果由于语言障碍而有任何问题,我深表歉意。如果我无论如何都能改进/澄清/重组问题,请告诉我。

标签: formssymfonytransformationsymfony5

解决方案


推荐阅读