Php Symfony buildForm builder集合名
我在做一个Symfony项目,所以我的问题是: 我有一个实体,对于该实体,我在同一页中有两个表单(一个用于插入,另一个用于更新插入的内容)。 所以我做了 行动方法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
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之前执行,因此名称不会更改。如果我想为表单设置名称,则?是相同的,但您可以将表单名称放在第一个参数中。