2012-07-11 85 views
0

嘿,我在我的網站上用兩種不同的語言保存每一頁。我想用我正在用symfony2開發的管理區域管理我的頁面。用Symfony2在一個控制器中處理兩種形式

以下控制器代碼可以在包含來自數據庫的正確數據的同一頁上顯示兩個表單。一種形式以管理爲EN的DE語言和另:

查看:

<form action="{{ path('admin_about') }}" method="post" {{ form_enctype(formEN) }}> 
      {{ form_widget(formEN) }} 

      <button type="submit" class="btn btn btn-warning" naem="EN">Save</button> 
     </form> 

     <form action="{{ path('admin_about') }}" method="post" {{ form_enctype(formDE) }}> 
      {{ form_widget(formDE) }} 

      <button type="submit" class="btn btn btn-warning" name="DE">Save</button> 
     </form> 

控制器: 公共職能aboutAction(請求$要求) {

$pageEN = $this->getDoctrine() 
    ->getRepository('MySitePublicBundle:Page') 
    ->findOneBy(array('idName' => 'about', 'lang' => 'EN')); 

    $pageDE = $this->getDoctrine() 
    ->getRepository('MySitePublicBundle:Page') 
    ->findOneBy(array('idName' => 'about', 'lang' => 'DE')); 

    if (!$pageDE) { 
     throw $this->createNotFoundException('About page (DE) not found.'); 
    } 

    if (!$pageEN) { 
     throw $this->createNotFoundException('About page (EN) not found.'); 
    } 

    $formDE = $this->createFormBuilder($pageDE) 
     ->add('title', 'text') 
     ->add('content', 'text') 
     ->getForm(); 

    $formEN = $this->createFormBuilder($pageEN) 
     ->add('title', 'text') 
     ->add('content', 'text') 
     ->getForm(); 

    //Save Form here 

    return $this->render('MySitePublicBundle:Admin:about.html.twig', array(
     'aboutPageDE' => $pageDE, 'aboutPageEN' => $pageEN, 'formDE' => $formDE->createView(), 'formEN' => $formEN->createView(), 
    )); 
} 

我的問題是:如何保存已從一個控制器中使用的表單?

+1

您可能希望查看[form classes](http://symfony.com/doc/current/book/forms.html#creating-form-classes)並在那裏處理翻譯。這樣,你只有一種形式擔心持續(並且不必爲每個翻譯複製「FormBuilder」代碼。 – Nick 2012-07-11 16:14:19

+0

我不明白這是如何解決我的問題的?!或者它只是爲了不要重複自己?:-) – Sven 2012-07-11 16:43:25

+0

哦,你在尋找如何將它們保存在一般?我將添加一個答案... – Nick 2012-07-11 22:03:08

回答

1

在您的控制器如果請求中包含的形式,比如你可以測試:

if($this->getRequest()->get('form1')) { 
    // 
} elseif($this->getRequest()->get('form2')) { 
    // 
} 
+0

我將這些代碼的窗體的DOM-Id設置爲'form1'和'form2'。它沒有找到它們:-( – Sven 2012-07-12 07:45:08

+0

這不是重要的ID,而是表單名稱,您可以重寫表單類型的getName()方法以返回您在控制器中測試的相同值。 – Pappa 2012-07-12 08:06:59

+0

DOM參數'name'也不起作用。你如何覆蓋表單類型?爲什麼要這麼做?對不起,我問這些新手問題。我正在尋找最簡單的解決方案,然後重構它。 – Sven 2012-07-12 08:38:28

2

基礎上的Symfony2文檔的Forms and Doctrine部分(或你的情況,因爲你是not using a Form class) - -

所以,你必須//save form here假設你已經設置了MySitePublicBundle:Page保存TitleContent(並具有正常的getter/setter方法)。

if ($request->getMethod() == 'POST') { 
    $form->bindRequest($request); 

    // data is an array with "title" and "content" keys 
    $data = $form->getData(); 

    // You'll need to have some switch depending on which language you're dealing 
    // with... (unless its both, then just repeat for $pageDE) 

    $pageEn->setTitle($data['title']); 
    $pageEn->setContent($data['content']); 

    $em = $this->getDoctrine()->getEntityManager(); 
    $em->persist($pageEn); 
    $em->flush(); 
} 
+1

好吧我管理保存它。但我正在努力與開關。謝謝你到目前爲止。 – Sven 2012-07-12 08:41:06

+0

順便說一句,我正在使用一個實體類! – Sven 2012-07-12 09:10:04

+0

如何添加一個隱藏字段,告訴你在每個表單上的語言,然後做'if($ data ['language'] ==「EN」){$ pageEN - > ...} else {$ pageDE->。作爲你的開關? – Nick 2012-07-12 20:40:58