因此,我试图将变量从Symfony 4.3项目中的控制器传递给表单...我试图设置选项解析器,传递数组...我仍然没有运气,'option“ 0”没有存在....'
在configureOptions中将变量定义为setDefaults,然后setRequired从createForm(ThingType :: class,$ thing,array('my_option'=> $ myOption))中的控制器传递一个array()类型
从控制器:
$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',
]);
}
Run Code Online (Sandbox Code Playgroud)
因此,只需尝试将pieceId传递给其自己的querybuilder的表单,以便它使用我需要的内容填充select。
相反,错误“选项“ 0”(或“ 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,
]);
}
Run Code Online (Sandbox Code Playgroud)
从那里,变量被传递到子表单,而无需更改代码(错误仅在上游)。
儿童形式:
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']);
}
}
Run Code Online (Sandbox Code Playgroud)
public function findByPieceAndReturnOrdered($pieceId)
{
return $this->createQueryBuilder('i')
->andWhere('i.Piece = :val')
->setParameter('val', $pieceId)
->orderBy('i.ordering', 'ASC')
->getQuery()
->getResult()
;
}
Run Code Online (Sandbox Code Playgroud)
所以我最终像一个非常懒的人一样在表单类型中编写了一个专用的查询函数,这使得我的表单最终得以呈现。
'query_builder' => function (ImageRepository $er) use ($test){
return $er->createQueryBuilder('u')
->andWhere('u.Piece = :val')
->setParameter('val', $test)
->orderBy('u.ordering', 'ASC')
;
Run Code Online (Sandbox Code Playgroud)
只需删除 getQuery() 和 getResult() 即可。儿童形式喜欢在没有辅助轮的情况下进行查询。
谢谢
归档时间: |
|
查看次数: |
80 次 |
最近记录: |