【问题标题】:Pass data to Symfony form collection without entity将数据传递给没有实体的 Symfony 表单集合
【发布时间】: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();
    }
}

SubcategoryDe​​leteType.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。”

标签: symfony symfony4


【解决方案1】:

所以我在这个案例中做错的是在表单上使用“映射”。

映射类型:布尔默认值:true

如果您希望在读取或写入时忽略该字段 对象,您可以将映射选项设置为 false。

你可以只传递一个值数组:

 $form = $this->createForm(SubcategoryReplacementType::class, ['replacements'=>$replacements]);

【讨论】:

    猜你喜欢
    • 2019-05-25
    • 2019-05-23
    • 2019-04-08
    • 1970-01-01
    • 2014-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多