Php Symfony buildForm builder集合名

Php Symfony buildForm builder集合名,php,forms,symfony,Php,Forms,Symfony,我在做一个Symfony项目,所以我的问题是: 我有一个实体,对于该实体,我在同一页中有两个表单(一个用于插入,另一个用于更新插入的内容)。 所以我做了 行动方法 public function adminTareasAction(Request $request) { $newTareaForm = $this->createForm(TareaType::class, null, array("formType" => "newTarea")); $editTa

我在做一个Symfony项目,所以我的问题是:

我有一个实体,对于该实体,我在同一页中有两个表单(一个用于插入,另一个用于更新插入的内容)。 所以我做了

行动方法

public function adminTareasAction(Request $request) {

    $newTareaForm = $this->createForm(TareaType::class, null, array("formType" => "newTarea"));
    $editTareasForm = $this->createForm(TareaType::class, null, array("formType" => "editTareas"));

    if($request->isMethod("POST")) {
        if(!is_null($request->request->get('newTarea'))) {
            $newTareaForm->handleRequest($request);
            if($newTareaForm->isSubmitted() && $newTareaForm->isValid()) {
                $newTarea = $newTareaForm->getData();

                $dataManager = $this->getDoctrine()->getManager();
                $dataManager->persist($newTarea);
                $dataManager->flush();

                return $this->redirectToRoute("admin_tareas");
            }
        }
        elseif(!is_null($request->request->get('editTareas'))) {
            $editTareasForm->handleRequest($request);
            if($editTareasForm->isSubmitted() && $editTareasForm->isValid()) {
                $newTarea = $newTareaForm->getData();

                $dataManager = $this->getDoctrine()->getManager();
                $dataManager->persist($newTarea);
                $dataManager->flush();

                return $this->redirectToRoute("admin_tareas");
            }
        }
    }

    $tareas = $this->getDoctrine()->getRepository('FabricacionBundle:Tarea')->findAll();
    if(!$tareas) {
        $tareas = "No hay Tareas";
    }
    return $this->render('UsersBundle:Admin:adminTareas.html.twig', array("newTareaForm" => $newTareaForm->createView(), "editTareasForm" => $editTareasForm->createView(), "tareas" => $tareas));
}
类型类

class TareaType extends AbstractType {

    private $formType;

    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options) {
        $this->formType = $options["formType"];
        if($this->formType == "newTarea") {
            //var_dump();
            $builder
                ->add('tareaName', TextType::class)
                ->add('tareaOrden', IntegerType::class)
                ->add('submitNewTarea', SubmitType::class);
        }
        elseif($this->formType == "editTareas") {
            $builder
                ->add('newName', CollectionType::class, array("entry_type" => TextType::class, "allow_add" => true))
                ->add('newOrden', CollectionType::class, array("entry_type" => IntegerType::class, "allow_add" => true))
                ->add('deleteTarea', CollectionType::class, array("entry_type" => CheckboxType::class, "allow_add" => true))
                ->add('submitTarea', SubmitType::class);

        }
    }

    /**
     * {@inheritdoc}
     */
    public function configureOptions(OptionsResolver $resolver) {
        $resolver->setDefaults(array(
            'data_class' => 'FabricacionBundle\Entity\Tarea',
            "formType" => null
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getBlockPrefix() {
        /*if($this->formType == "newTarea") {
            return $this->formType;
        }
        elseif($this->formType == "editTareas") {
            return $this->formType;
        }*/
        return 'FabricacionBundle_tarea';
    }
}

我只需要更改表单名称,然后在控制器中按名称处理它们。

只需删除
getBlockPrefix()
。您正在通过其FQCN访问您的字段类型:

 $newTareaForm = $this->createForm(TareaType::class, null, array("formType" => "newTarea"));

因此,您不需要为它设置别名(wich已被弃用)。

好吧,阅读表单类,我知道我必须做什么

仅此即可创建表单:

$newTareaForm = $this->container->get('form.factory')->createNamedBuilder("newTarea", TareaType::class, null, array("formType" => "newTarea"))->getForm();
$editTareasForm = $this->container->get('form.factory')->createNamedBuilder("editTareas", TareaType::class, null, array("formType" => "editTareas"))->getForm();

在getBlockPrefix中,您可以看到一个修改,它似乎在buildForm之前加载该函数,因此选项参数对此无效,但问题是什么?我想制作两个相同类型的表单,并更改表单的名称。或者,如果有其他选项,请对其进行注释。我不明白您的代码看起来是否正常。当您将所需表单的名称作为选项传递时,您的表单类型会发生更改。并且您有控制器操作来提交表单。什么缺失/不起作用?这就是想法,但是de getBlockPrefix在buildForm之前执行,因此名称不会更改。如果我想为表单设置名称,则?是相同的,但您可以将表单名称放在第一个参数中。