所以我试图在一个 Symfony 4.3 项目中将一个变量从我的 Controller 传递给一个表单......我试图设置选项解析器,传递数组......我仍然没有运气,'选项“0”没有存在....'
将 configureOptions 中的变量定义为 setDefaults 和 setRequired
在 createForm(ThingType::class, $thing, array ('my_option' => $myOption) 中从 Controller 传递一个数组 () 类型
从 Controller :$form = $this->createForm(PieceEditType::class, $piece, ['pieceId'=> $piece->getId()]);
从形式方面:
* @param FormBuilderInterface $builder
* @param array $options
*
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$pieceId = $options['pieceId'];
$builder
->add('full', FileType::class, [
'data_class' => null
])
->add('ordering', EntityType::class, [
'class' =>Image::class,
'choice_label' => 'ordering',
'query_builder' => function (ImageRepository $er){
return $er->findByPieceAndReturnOrdered($pieceId);
}
])
;
}
/**
* @param OptionsResolver $resolver
* {@inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => Image::class,
'pieceId' => null,
));
$resolver->setRequired([
'pieceId',
]);
}
所以只是试图将一个pieceId传递给它自己的查询构建器的表单,这样它就会用我需要的东西来填充选择。
相反,错误 'The option "0"(or "pieceId") 不存在。定义的选项是等等'
最佳答案
所以我最终把它弄直了。两件事情 :
class PieceEditType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$pieceId = $options['pieceId'];
$builder
->add('images', CollectionType::class, [
'entry_type'=> ImagesEditType::class,
'allow_add' =>true,
'allow_delete' => true,
'by_reference' =>false,
'entry_options' => ['pieceId' => $pieceId,'label'=>false],
])
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Piece::class,
'pieceId'=> null,
]);
}
从那里,变量被传递给子窗体而代码没有改变(错误就在上游)。
child 表格:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$test = $options['pieceId'];
$builder
->add('ordering', EntityType::class, [
'class' =>Image::class,
'choice_label' => 'ordering',
'query_builder' => function (ImageRepository $er) use ($test){
return $er->findByPieceAndReturnOrdered($test);
}
])
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(
['data_class' => Image::class,
'pieceId' => null,
]
); $definedOptions = $resolver->getDefinedOptions();
dump($definedOptions);
$resolver->setDefined('pieceId');
$resolver->setRequired(['pieceId']);
}
}
public function findByPieceAndReturnOrdered($pieceId)
{
return $this->createQueryBuilder('i')
->andWhere('i.Piece = :val')
->setParameter('val', $pieceId)
->orderBy('i.ordering', 'ASC')
->getQuery()
->getResult()
;
}
所以我最终写了一个专门的查询函数,就在 formtype 中,就像一个非常懒惰的人,它让我的表单最终被渲染。
'query_builder' => function (ImageRepository $er) use ($test){
return $er->createQueryBuilder('u')
->andWhere('u.Piece = :val')
->setParameter('val', $test)
->orderBy('u.ordering', 'ASC')
;
只需删除 getQuery() 和 getResult() 即可。 child 形式喜欢他没有训练轮的查询。
谢谢
关于symfony - 为什么我似乎无法将变量从 Controller 传递到 symfony 4 中的表单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57166481/