2012-07-11 43 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

相关问题