forms - 将数组/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 数组构建表单集合,以便在两个方向上正确解析选择的值?
此外,还有一个多选的解决方法,但我不应该使用多选。
如果由于语言障碍而有任何问题,我深表歉意。如果我无论如何都能改进/澄清/重组问题,请告诉我。
解决方案
推荐阅读
- react-native - 领域同步不适用于本机反应中的嵌入式对象
- or-tools - OR-Tools:有利润的 TSP
- performance - 滑动窗口:有效计算累积最大值
- r - VS Code Jupyter Notebook 在运行 R 代码时抛出错误
- c++ - My code is showing 'true' as output instead of 'False'
- firebase - 如何通过 Firebase CLI 从同一台机器上的 2 个不同帐户部署云功能?
- java - 确保首先调用 FirebaseApp.initializeApp(Context) 的问题
- python - 在 n_jobs sklearn 中指定核心
- nestjs - 模型“订单”的基础表不存在。错误代码:P1014(棱镜)
- keras - 每次迭代时 keras CustomDataGenerator 的输出