簡體   English   中英

Symfony3更改控制器中的表單字段類型

[英]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個表單來實現此approveFormrejectForm每個僅擁有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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM