【问题标题】:Symfony 4 - Using an array to create formSymfony 4 - 使用数组创建表单
【发布时间】:2020-05-13 07:53:00
【问题描述】:

我正在寻找一种使用 Symfony 4 创建嵌入式表单的方法。 我使用了一个查询,这个查询返回了一个数组。但是当我执行代码时出现以下错误:

表单的视图数据应该是类的一个实例 App\Entity\Categorie,但是是一个 (n) 数组。您可以通过以下方式避免此错误 将“data_class”选项设置为 null 或添加视图 将 a(n) 数组转换为 应用\实体\类别。

所以我的控制器看起来像这样:

    /**
     * @Route("/admin/categories/import/{userId}", name="admin.categorie.link", methods={"GET|POST"})
     * @param Int $userId
     * @return Response
     */
    public function linkImport(Int $userId, Request $request)
    {

        $categories = $this->em->getRepository(Categorie::class)->checkIfNew($userId);


            $form = $this->createForm(CategorieType::class, $categories);

            $form->handleRequest($request);

            if ($form->isSubmitted() && $form->isValid()) {
                $this->em->flush();
                $this->addFlash('success', 'Catalogue modifié avec succès');
                return $this->redirectToRoute('admin.catalogues.index');
            }

            return $this->render('admin/catalogues/link.html.twig', [
                'categories' => $categories,
                'form' => $form->createView()
            ]);
    }

我的表单类型如下所示:

class CategorieType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('categorie_intitule')
            ->add('categorie_parent_id')
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Categorie::class,
        ]);
    }
}

我尝试使用 foreach 来构建表单

foreach ($categories as $categorie) {
    $form = $this->createForm(CategorieType::class, $categorie);

    $form->handleRequest($request);

}

但它在我的树枝内没有返回我。 那么你能告诉我更多关于这个错误的信息,以及如何解决它吗? 谢谢。

更新:根据@DoncCallisto 的回答,我尝试了以下方法:

我创建了一个 CategorieCollectionType :

class CategorieCollectionType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('categories', CollectionType::class, [
                'entry_type' => CategorieType::class,
            ])
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Categorie::class,
        ]);
    }
}

并在我的控制器中更改它:

$categories = $this->em->getRepository(Categorie::class)->checkIfNew($userId);


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

但错误仍然相同。 这是来自 Symfony 调试的$categories 的转储:

array:1 [▼
  0 => App\Entity\Categorie {#1395 ▼
    -id: 52
    -categorie_intitule: "-"
    -categorie_parent_id: null
    -produitCategorie_id: Doctrine\ORM\PersistentCollection {#1451 ▶}
    -created_by: App\Entity\User {#1039 ▶}
  }
]

【问题讨论】:

    标签: php forms symfony


    【解决方案1】:

    CategorieType 是单个 Category 的单个表单。 如果您需要显示所有这些,也许您应该将CategorieType inside 包裹在另一个表单中(例如CategorieCollectionType)。

    更多或更少,比如

    use Symfony\Component\Form\Extension\Core\Type\CollectionType;
    
    class CategorieCollectionType extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('categories', CollectionType::class, [
                    'entry_type' => CategorieType::class, // remember to import it via "use"
                ])
            );
        }
    }
    

    并在控制器中使用它

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

    【讨论】:

    • 您好,感谢您的回答,我已经尝试了您的解决方案,但错误仍然存​​在...我需要在 My CategorieCollectionType 或 CategorieTYpe 中添加一些东西吗? + 顺便说一句,我想你的意思是我需要使用 $form = $this->createForm(CategorieCollectionType::class, ['categories' => $categories]); 对吗?
    • 报错信息是一样的:The form's view data is expected to be an instance of class App\Entity\Categorie, but is a(n) array. You can avoid this error by setting the "data_class" option to null or by adding a view transformer that transforms a(n) array to an instance of App\Entity\Categorie.
    • @Newbiedev 很奇怪,你确定你在效仿我的例子吗?它应该可以工作,我看不出有任何理由仍然显示该消息,除非$categories 是数组数组。
    • 我已经用我尝试的代码和来自$categories 的笨蛋更新了我的问题我是否需要从CategorieCollectionType 更改configureOption 中的某些内容?我什么都没改变?
    • 对不起,我犯了错误....非常感谢您的帮助:)
    猜你喜欢
    • 2014-09-06
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多