Symfony 在控制器中更改表单字段类型
Symfony3 change form field type in the controller
我有一个可以构建表单的表单生成器
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->
add('typeTask',TextType::class,array('label'=>"Вид заявка"))->
add('description',TextareaType::class,array('label'=>"Описание"))->
add('term',DateType::class, array(
'widget' => 'choice',
'label'=>"Краен срок"
))->
add('designer',TextareaType::class,array('label'=>"Дизайнер",
"required"=>false))->
add('executioner',TextareaType::class,array('label'=>"Под изпълнител",
"required"=>false))->
add("file",TextType::class,array('label'=>"Файл",
"required"=>false))->
add("ergent",CheckboxType::class,array('label'=>"Спешно",
"required"=>false))->add("approved",HiddenType::class,array(
"required"=>false
))->add("rejected",HiddenType::class,array(
'required'=>false
));
}
如您所见,我有 2 个字段,"approved" 可以是真或假,拒绝也可以是真或假。通常它们是隐藏的,因为只有一种类型的用户可以访问它们 - ROLE_ADMIN,其余的是 ROLE_EDITOR。在我的例子中,ADMIN 只需要批准或拒绝它,而 EDITOR 不能这样做。最大的问题是我不需要整个表格,而是 2 个按钮 - "Approve" 和 "Reject" 当项目显示时("show" 动作),但是改变项目是 "edit" 所以我到目前为止尝试的是从 "show" 发送表单到 "edit" 然后当编辑操作结束时加载 "show" 操作 again.I 尝试通过创建 2 个表单来实现这一点 - approveForm
和 rejectForm
每个只能容纳 1 个 属性 并将它们发送并刷新到 "edit" 函数,但是编辑函数不接受表格,如果接受了,它会删除其他所有内容。到目前为止,这是我的代码
表演中 -
$projectFormApprove = $this->createForm('AppBundle\Form\ProjectType', $project,array(
"method"=>"post"
));
$projectFormApprove->remove("description");
$projectFormApprove->remove("designer");
$projectFormApprove->remove("executioner");
$projectFormApprove->remove("term");
$projectFormApprove->remove("typeTask");
$projectFormApprove->remove("file");
$projectFormApprove->remove("ergent");
$projectFormApprove->remove("approved");
$projectFormApprove->remove("rejected");
$projectFormApprove->add("approved",HiddenType::class,array(
"data"=>true
));
$projectFormReject = $projectFormApprove;
$projectFormReject->remove("approved");
$projectFormReject->add("rejected",HiddenType::class,array(
'data'=>true
));
这将创建 2 个表单,每个表单有 1 个 属性,这是我的 twig 模板中发生的事情
<tr>
<td>
{{ form_start(approveForm, {'action': path('project_edit', { 'id': project.id })}) }}
{{ form_widget(approveForm) }}
<input type="submit" value="Approve" />
{{ form_end(approveForm) }}
</td>
</tr>
<tr>
<td>
{{ form_start(rejectedForm,{'action': path('project_edit', { 'id': project.id })}) }}
{{ form_widget(rejectedForm) }}
<input type="submit" value="Reject" />
{{ form_end(rejectedForm) }}
</td>
</tr>
我需要两个表单,因为有 2 个按钮可以简单地提交它们并且没有人实际更改值(这就是为什么在 "show" 函数中创建的 属性 具有 "data"=>true
. 如果提交表单,它将自动执行。
这是我的 "edit" 函数中的内容 -
/** @var $user User */
$user = $this->getUser();
$project = new Project();
$form = $this->createForm('AppBundle\Form\ProjectType', $project);
if($user->getType() != "LittleBoss"){
$form->remove("designer");
$form->remove("executioner");
}
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$project->setFromUser($user->getUsername());
$project->setDepartment($user->getDepartment());
$project->setIsOver(false);
$project->setDate(new \DateTime());
$project->setSeenByDesigner(false);
$project->setSeenByExecutioner(false);
$project->setSeenByLittleBoss(false);
$project->setSeenByManager(false);
$em = $this->getDoctrine()->getManager();
$em->persist($project);
$em->flush();
return $this->redirectToRoute('project_show', array('id' => $project->getId()));
}
return $this->render('project/new.html.twig', array(
'project' => $project,
'form' => $form->createView(),
));
现在解决我的实际问题 - 如您所见,我首先删除 "approved" 字段,然后添加具有预定义值的新字段。我想要的不是更改值,而是更改 description
和其余字段的类型。有没有办法说 $form->change();
或任何可以更改字段类型而无需删除它们的方法。我希望它们成为的类型是 HiddenType 并设置它们的数据,以便当我提交 2 种形式之一时,它将在 "edit" 操作中被接受为有效,然后刷新到数据库,一切都会好起来的。到目前为止,当在 "edit" 操作中单击其中一个按钮 - "Approve" 或 "Reject" 时 $edit_form->IsSubmited()
returns false。
我建议您创建单独的表单,一个用于编辑器,另一个用于管理员。然后在控制器中通过登录用户的权限使用您需要的表单。
if ($this->authorizationChecker->isGranted('ROLE_EDITOR')) {
$form = $this->createForm(EditorType::class);
} elseif ($this->authorizationChecker->isGranted('ROLE_ADMIN')) {
$form = $this->createForm(AdminType::class);
}
$form->handleRequest($request);
在这两种形式中,您可以使用相同的实体,但字段不同。
我有一个可以构建表单的表单生成器
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->
add('typeTask',TextType::class,array('label'=>"Вид заявка"))->
add('description',TextareaType::class,array('label'=>"Описание"))->
add('term',DateType::class, array(
'widget' => 'choice',
'label'=>"Краен срок"
))->
add('designer',TextareaType::class,array('label'=>"Дизайнер",
"required"=>false))->
add('executioner',TextareaType::class,array('label'=>"Под изпълнител",
"required"=>false))->
add("file",TextType::class,array('label'=>"Файл",
"required"=>false))->
add("ergent",CheckboxType::class,array('label'=>"Спешно",
"required"=>false))->add("approved",HiddenType::class,array(
"required"=>false
))->add("rejected",HiddenType::class,array(
'required'=>false
));
}
如您所见,我有 2 个字段,"approved" 可以是真或假,拒绝也可以是真或假。通常它们是隐藏的,因为只有一种类型的用户可以访问它们 - ROLE_ADMIN,其余的是 ROLE_EDITOR。在我的例子中,ADMIN 只需要批准或拒绝它,而 EDITOR 不能这样做。最大的问题是我不需要整个表格,而是 2 个按钮 - "Approve" 和 "Reject" 当项目显示时("show" 动作),但是改变项目是 "edit" 所以我到目前为止尝试的是从 "show" 发送表单到 "edit" 然后当编辑操作结束时加载 "show" 操作 again.I 尝试通过创建 2 个表单来实现这一点 - approveForm
和 rejectForm
每个只能容纳 1 个 属性 并将它们发送并刷新到 "edit" 函数,但是编辑函数不接受表格,如果接受了,它会删除其他所有内容。到目前为止,这是我的代码
表演中 -
$projectFormApprove = $this->createForm('AppBundle\Form\ProjectType', $project,array(
"method"=>"post"
));
$projectFormApprove->remove("description");
$projectFormApprove->remove("designer");
$projectFormApprove->remove("executioner");
$projectFormApprove->remove("term");
$projectFormApprove->remove("typeTask");
$projectFormApprove->remove("file");
$projectFormApprove->remove("ergent");
$projectFormApprove->remove("approved");
$projectFormApprove->remove("rejected");
$projectFormApprove->add("approved",HiddenType::class,array(
"data"=>true
));
$projectFormReject = $projectFormApprove;
$projectFormReject->remove("approved");
$projectFormReject->add("rejected",HiddenType::class,array(
'data'=>true
));
这将创建 2 个表单,每个表单有 1 个 属性,这是我的 twig 模板中发生的事情
<tr>
<td>
{{ form_start(approveForm, {'action': path('project_edit', { 'id': project.id })}) }}
{{ form_widget(approveForm) }}
<input type="submit" value="Approve" />
{{ form_end(approveForm) }}
</td>
</tr>
<tr>
<td>
{{ form_start(rejectedForm,{'action': path('project_edit', { 'id': project.id })}) }}
{{ form_widget(rejectedForm) }}
<input type="submit" value="Reject" />
{{ form_end(rejectedForm) }}
</td>
</tr>
我需要两个表单,因为有 2 个按钮可以简单地提交它们并且没有人实际更改值(这就是为什么在 "show" 函数中创建的 属性 具有 "data"=>true
. 如果提交表单,它将自动执行。
这是我的 "edit" 函数中的内容 -
/** @var $user User */
$user = $this->getUser();
$project = new Project();
$form = $this->createForm('AppBundle\Form\ProjectType', $project);
if($user->getType() != "LittleBoss"){
$form->remove("designer");
$form->remove("executioner");
}
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$project->setFromUser($user->getUsername());
$project->setDepartment($user->getDepartment());
$project->setIsOver(false);
$project->setDate(new \DateTime());
$project->setSeenByDesigner(false);
$project->setSeenByExecutioner(false);
$project->setSeenByLittleBoss(false);
$project->setSeenByManager(false);
$em = $this->getDoctrine()->getManager();
$em->persist($project);
$em->flush();
return $this->redirectToRoute('project_show', array('id' => $project->getId()));
}
return $this->render('project/new.html.twig', array(
'project' => $project,
'form' => $form->createView(),
));
现在解决我的实际问题 - 如您所见,我首先删除 "approved" 字段,然后添加具有预定义值的新字段。我想要的不是更改值,而是更改 description
和其余字段的类型。有没有办法说 $form->change();
或任何可以更改字段类型而无需删除它们的方法。我希望它们成为的类型是 HiddenType 并设置它们的数据,以便当我提交 2 种形式之一时,它将在 "edit" 操作中被接受为有效,然后刷新到数据库,一切都会好起来的。到目前为止,当在 "edit" 操作中单击其中一个按钮 - "Approve" 或 "Reject" 时 $edit_form->IsSubmited()
returns false。
我建议您创建单独的表单,一个用于编辑器,另一个用于管理员。然后在控制器中通过登录用户的权限使用您需要的表单。
if ($this->authorizationChecker->isGranted('ROLE_EDITOR')) {
$form = $this->createForm(EditorType::class);
} elseif ($this->authorizationChecker->isGranted('ROLE_ADMIN')) {
$form = $this->createForm(AdminType::class);
}
$form->handleRequest($request);
在这两种形式中,您可以使用相同的实体,但字段不同。