[英]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個字段為“已批准”,可以為真或假,被拒絕的字段也可以為真和假。 通常它們是隱藏的,因為只有一種類型的用戶可以訪問它們-ROLE_ADMIN,其余的用於ROLE_EDITOR。 就我而言,ADMIN只需要批准或拒絕它,而編輯者就不能這樣做。 最大的問題是,我不需要一個完整的表單,而是兩個按鈕-顯示項目時“批准”和“拒絕”(“顯示”操作),但是更改項目的操作是“編輯”和所以到目前為止,我嘗試的是從“顯示”將表單發送到“編輯”,然后在編輯操作結束后再次加載“顯示”操作。我嘗試通過創建2個表單來實現此approveForm
和rejectForm
每個僅擁有1個屬性,然后將其發送並刷新到“ edit”函數,但是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個屬性,這是我的樹枝模板中發生的情況
<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>
我需要兩個表單,因為有兩個按鈕可以簡單地提交它們,而實際上沒有人更改值(這就是為什么在“顯示”功能中,創建的屬性具有"data"=>true
。如果提交了表單,它將執行它是自動的。這是我的“編輯”功能中的內容-
/** @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(),
));
現在是我的實際問題-如您所見,我首先刪除“已批准”字段,然后添加具有預定義值的新字段。 我要更改的不是值,而是description
的類型和其余字段。 有沒有辦法說$form->change();
或無需刪除即可更改字段類型的任何內容。 我希望他們的類型是HiddenType並設置他們的數據,這樣當我提交2個表單之一時,它將在“編輯”操作中被接受為有效表單,然后刷新到數據庫,一切都會好起來。 到目前為止,在“編輯”操作中單擊按鈕“批准”或“拒絕”之一時, $edit_form->IsSubmited()
返回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);
在這兩種形式中,您可以使用相同的實體,但可以使用不同的字段。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.