是否可以为 $builder symfony 中使用 EventListener symfony 添加的字段赋值?
is it possible to assign a value to a field added with EventListener symfony in $builder symfony?
我想知道是否可以自动为添加的字段赋值:
- 日期时间
- 实体
感谢您的帮助
public function buildForm(FormBuilderInterface $builder, array $options)
{
$user = $options['user']; // entity User
$player = $options['player']; // entity Player
$today = new DateTime('now');
$builder
->add('fieldA')
->add('fieldB')
->add('fieldC');
$builder
->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) use ($user, $player, $today) {
$form = $event->getForm();
$datas = $event->getData();
$form->add('today');
$form->add('user');
$form->add('player');
//dd($form); ok = 3 fields added
$datas['dateDuJour'] = $today;
$datas['user'] = $user;
$datas['player'] = $player;
//dd($datas); ok = 3 assigned values
$form->setData($datas);
question 1 : how to insert the data in the form
question 2 : pb from entity (object) to string
//dd($form, $datas);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Evaluation::class,
'user' => null,
'player' => null
]);
}
}
我考虑过插入类型为隐藏的 3 个字段并使用 Data Transformer
不知最佳做法是什么?
如果你有一个具体的例子
据我所知,您有一些表单,并且您希望在提交时将 3 个数据插入表单。
根据您的数据库配置,您可以采用 3 种不同的方式:
最好的方法是使用映射
您的评价有这 3 个字段:
- 日期
- 用户
- 玩家
然后只需将它们作为隐藏字段添加到原始构建器中,并使用您拥有的默认值:
$builder->add('token', HiddenType::class, [
'data' => $today,
])->add('user', HiddenType::class, [
'data' => $user,
])->add('player', HiddenType::class, [
'data' => $player,
]);
因为它们是隐藏的,所以安全检查不会自动让用户更改这些值,而且这些字段将被隐藏
它要求您的实体中存在这三个字段
第二种是使用未映射的隐藏字段。与之前相同,但添加 'mapped'` => false
。然后你在你的控制器中,你将拥有价值并根据需要使用它们。
第三个是不要在你的表单(我最喜欢的)中使用它们,而是在你的控制器中使用它们
public function addEvaluation(Request $request, EvaluationManager $evaluationManager): Response
{
$evaluation = new Evaluation();
$form = $this->createForm(EvaluationType::class, $evaluation);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$evaluation->setTime(new DateTime('now'))
->setUser($user)
->setPlayer($player);
$evaluationManager->save($evaluation);
return $this->redirectToRoute('evaluation_add');
}
return $this->render('/evaluation_add.twig', [
'form' => $form,
]);
}
我想知道是否可以自动为添加的字段赋值:
- 日期时间
- 实体
感谢您的帮助
public function buildForm(FormBuilderInterface $builder, array $options)
{
$user = $options['user']; // entity User
$player = $options['player']; // entity Player
$today = new DateTime('now');
$builder
->add('fieldA')
->add('fieldB')
->add('fieldC');
$builder
->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) use ($user, $player, $today) {
$form = $event->getForm();
$datas = $event->getData();
$form->add('today');
$form->add('user');
$form->add('player');
//dd($form); ok = 3 fields added
$datas['dateDuJour'] = $today;
$datas['user'] = $user;
$datas['player'] = $player;
//dd($datas); ok = 3 assigned values
$form->setData($datas);
question 1 : how to insert the data in the form
question 2 : pb from entity (object) to string
//dd($form, $datas);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Evaluation::class,
'user' => null,
'player' => null
]);
}
}
我考虑过插入类型为隐藏的 3 个字段并使用 Data Transformer
不知最佳做法是什么?
如果你有一个具体的例子
据我所知,您有一些表单,并且您希望在提交时将 3 个数据插入表单。
根据您的数据库配置,您可以采用 3 种不同的方式:
最好的方法是使用映射
您的评价有这 3 个字段:
- 日期
- 用户
- 玩家
然后只需将它们作为隐藏字段添加到原始构建器中,并使用您拥有的默认值:
$builder->add('token', HiddenType::class, [
'data' => $today,
])->add('user', HiddenType::class, [
'data' => $user,
])->add('player', HiddenType::class, [
'data' => $player,
]);
因为它们是隐藏的,所以安全检查不会自动让用户更改这些值,而且这些字段将被隐藏 它要求您的实体中存在这三个字段
第二种是使用未映射的隐藏字段。与之前相同,但添加 'mapped'` => false
。然后你在你的控制器中,你将拥有价值并根据需要使用它们。
第三个是不要在你的表单(我最喜欢的)中使用它们,而是在你的控制器中使用它们
public function addEvaluation(Request $request, EvaluationManager $evaluationManager): Response
{
$evaluation = new Evaluation();
$form = $this->createForm(EvaluationType::class, $evaluation);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$evaluation->setTime(new DateTime('now'))
->setUser($user)
->setPlayer($player);
$evaluationManager->save($evaluation);
return $this->redirectToRoute('evaluation_add');
}
return $this->render('/evaluation_add.twig', [
'form' => $form,
]);
}