考虑以下架构
entityA
{
entityB [12]
}
entityB
{
entityC[]
}
entityC
{
name, defaultValue
}
当创建一个entityA的新对象时,我想列出数据库中的每个entityC,以便能够选择它们并自定义defaultValue,如下所示:
CHECKBOX [x] LABEL name1, INPUT defaultValue1
CHECKBOX [ ] LABEL name2, INPUT defaultValue2
CHECKBOX [x] LABEL name3, INPUT defaultValue3
CHECKBOX [x] LABEL name4, INPUT defaultValue4
etc
...的目的是根据上述选择,在此新的entityA的12个entityB对象的每一个中自动生成entityC对象
->add('categories', CollectionType::class, [
"mapped" => false,
'entry_type' => SharedCategoryType::class
])
使用类别(entityC)作为实体类型不起作用,因为我也想公开默认值。这是SharedCategoryType
class SharedCategoryType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('enabled', CheckboxType::class, [
"mapped" => false
])
->add('name' , TextType::class) //not a label but not important for now
->add('defaultValue' , MoneyType::class);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Category::class,
]);
}
}
使用此代码,映射无法正常工作,但我不知道缺少什么...
编辑:我的第一次尝试是这样的:
->add('budgets', EntityType::class, [
"class" => Category::class,
"mapped" => false,
"multiple" => true,
"expanded" => true
}
但是我不能修改defaultValue字段。它会根据名称自动创建标签(使用我可能定义的__toString方法),但是我找不到如何向暴露的字段中添加defaultValue
答案 0 :(得分:0)
如果创建相关实体,则可以使用表单事件,例如
public function buildForm(FormBuilderInterface $builder, array $options)
{
...
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event)
{
/** @var ResultModel $model */
$model = $event->getData();
$form = $event->getForm();
if (!$model->getExecutive()) {
$form->add('executive', EntityType::class, [
'class' => BundesligaExecutive::class,
'placeholder' => 'bundesliga.executive.choose',
'help' => 'bundesliga.executive.help',
]);
}
...
}
在这里找到更多详细信息https://symfony.com/doc/current/form/dynamic_form_modification.html
顺便说一句,使用selectBox而不是复选框可能是一个更好的主意