2012-09-13 20 views
0

這是事情。如何在一個視圖中處理同一實體但只有一個綁定的2個窗體?

我想在一個視圖中創建2個窗體。一個綁定到一個實體,另一個是一個文件類型,我想把.csv放在裏面,並捕獲裏面的信息來填充第一個實體。

我已經創建了第一個,但我不知道如何創建第二個並在同一個視圖中正確集成它,因此它們不會互相爭鬥。這裏是我的文件(CSV過程還沒有實現)

我的控制器:

public function adminAction() 
    { 
    $form = $this->createForm(new StudentsType, null); 
    $formHandler = new StudentsHandler($form, $this->get('request'), $this->getDoctrine()->getEntityManager()); 

    if($formHandler->process()) 
    { 
     return $this->redirect($this->generateUrl('EnsgtiEnsgtiBundle_ens')); 
    } 

    return $this->render('EnsgtiEnsgtiBundle:Appli:admin.html.twig', array(
     'form' => $form->createView(), 
    )); 

    } 

第一種形式:

class StudentsType extends AbstractType 
{ 

    public function buildForm(FormBuilder $builder, array $options) 
    { 
     $builder 
      ->add('nom', 'text')->setRequired(false) 
      ->add('prenom', 'text') 
      ->add('email', 'email') 
      ->add('codeEtape', 'text') 
      ->add('file', new StudentsListType)->SetRequired(false); 
    } 

    public function getName() 
    { 
     return 'ensgti_ensgtibundle_studentstype'; 
    } 

    public function getDefaultOptions(array $options) 
    { 
     return array(
      'data_class' => 'Ensgti\EnsgtiBundle\Entity\Students', 
     ); 
    } 

} 

的處理程序:

class StudentsHandler 
{ 
    protected $form; 
    protected $request; 
    protected $em; 

    public function __construct(Form $form, Request $request, EntityManager $em) 
    { 
     $this->form = $form; 
     $this->request = $request; 
     $this->em  = $em; 
    } 

    public function process() 
    { 
     if($this->request->getMethod() == 'POST') 
     { 
      $this->form->bindRequest($this->request); 

      if($this->form->isValid()) 
      { 
       $this->onSuccess($this->form->getData()); 

       return true; 
      } 
     } 

     return false; 
    } 

    public function onSuccess(Students $students) 
    { 
     $this->em->persist($students); 
     $this->em->flush(); 
    } 
} 

第二形態:

class StudentsListType extends AbstractType 
{ 

    public function buildForm(FormBuilder $builder, array $options) 
    { 
     $builder 
     ->add('', 'file'); 

    } 

    public function getName() 
    { 
     return 'ensgti_ensgtibundle_studentslisttype'; 
    } 

} 

的處理程序:

class StudentsListHandler 
{ 
    protected $form; 
    protected $request; 
    protected $em; 

    public function __construct(Form $form, Request $request, EntityManager $em) 
    { 
     $this->form = $form; 
     $this->request = $request; 
     $this->em  = $em; 
    } 

    public function process() 
    { 
     if($this->request->getMethod() == 'POST') 
     { 
      $this->form->bindRequest($this->request); 

      if($this->form->isValid()) 
      { 
       //$this->onSuccess($this->form->getData()); 
       print_r($this->form->getData()); 
       return true; 
      } 
     } 

     return false; 
    } 

    public function onSuccess(/*StudentsList $studentsList*/) 
    { 
     //$this->em->persist($studentsList); 
     //$this->em->flush(); 
     echo 'Petit test'; 
    } 
} 

有了這個代碼,我得到這個:

無論財產 「文件」,也不是法 「的GetFile()」,也不是方法, 「ISFILE()」 存在於類「Ensgti \ EnsgtiBundle \ Entity \ Students「

這是正常的,因爲我綁定到沒有文件類型的實體。我是一名初學者,所以我一直在閱讀文檔,但對於我來說,仍然很難理解所有內容。有沒有一種方法,我可以在同一個視圖中創建2個表單,而不是綁定到一個實體,但通過csv處理它仍然會持續在它上面?

回答

-3

使用來做到這一點。這裏是link如何使用它,只需將src屬性url放到需要的頁面即可。你可以在一個佈局中顯示2頁。這就是它如何looks

+0

我確定有一種方法可以在沒有Iframe的情況下做我想做的事情,我真的很想了解Symfony是如何工作的。 – Freiyer

0

問題是,表單預計file是綁定實體的屬性。您只需將property_path設置爲false即可。 (Reference)例如

->add('file', new StudentsListType, array('property_path' => false)) 

編輯:

如果會更有意義有2種形式完全分開,然後取出上述->add(/*...*/)完全和只是通過兩種形式到來自控制器的視圖。然後你可以單獨渲染每一個。

+0

這一個不起作用。事情是,當我填寫第一個表單域時,需要提交第二個表單域。當我這樣做: - > add('file',new StudentsListType,array('property_path'=> false)) - > setRequired(false);沒有什麼是堅持在我的實體。 – Freiyer

相關問題