【发布时间】:2020-09-02 23:46:53
【问题描述】:
我正在尝试让“替换”集合正常工作,但似乎无法将数据传递到表单中。流程中没有相关的实体,只有我从外部流程传入的数据。提交后,我必须验证并应用系统中的更改。
我的控制器截图
/**
* @Route("/reassignment", name="digitalMarket_category_reassignment")
* @param ArrayCollection $deletedSubcategories Subcategories being deleted from other request
* @param Request $request
* @param NotificationGenerator $ng
* @return Response
*/
public function subcategoryReassignment( $deletedSubcategories, Request $request, NotificationGenerator $ng)
{
$form = $this->createForm(SubcategoryReplacementType::class, ['replacements'=>[
['name'=>'offer','handle'=>'handle']
]]);
$form->handleRequest($request);
if( $form->isSubmitted() && $form->isValid() ){
dd($form->getData());
}
return $this->render('marketplace/category/replacement.html.twig', [
'form' => $form->createView()
]);
}
SubcategoryReplacementType.php
<?php
namespace App\Form\DigitalMarket;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class SubcategoryReplacementType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('replacements',CollectionType::class,[
'entry_type' => SubcategoryDeleteType::class,
'mapped' => false,
]);
}
public function configureOptions(OptionsResolver $resolver)
{
// $resolver->setDefaults();
}
}
SubcategoryDeleteType.php
<?php
namespace App\Form\DigitalMarket;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class SubcategoryDeleteType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name',TextType::class,[
'label' => 'Name',
'required'=>true,
'mapped' => false,
])
->add('handle',TextType::class,[
'label' =>'Handle',
'required'=>true,
'mapped' => false,
])
->add('oldSub',TextType::class,[
'label' =>'Old Subcategory',
'required'=>true,
'mapped' => false,
])
->add('newSub',EntityType::class,[
'class'=>Subcategory::class,
'label'=>'New Subcategory',
'group_by'=>'category',
'multiple'=>false,
'attr'=>[
'class'=>'js-select2'
],
'help'=>'Subcategories that will replace one being removed.',
'mapped' => false,
])
;
}
public function configureOptions(OptionsResolver $resolver)
{
}
}
【问题讨论】:
-
即使您不使用实体,您仍然可以使用与您的数据库无关的对象。将它放在 src 文件夹或 Form 中的“模型”文件夹中是很常见的。您将拥有更清晰的结构,并且能够在注释中使用断言。我不确定它是否会解决您的问题,但它可能会并且会使正在发生的事情更加清晰。显示您的视图代码也很有用。
-
@FTW 这是一个想法,我是一个使用“映射”的大傻瓜,这并不意味着数据库而是表单。 “如果您希望在读取或写入对象时忽略该字段,您可以将映射选项设置为 false。”