【问题标题】:Handle two forms in one Controller with Symfony2使用 Symfony2 在一个控制器中处理两种表单
【发布时间】:2012-07-11 16:06:30
【问题描述】:

嘿,我在我的网站上以两种不同的语言保存每个页面。我想用我正在用 symfony2 开发的管理区域来管理我的页面。

以下控制器代码能够在同一页面上显示两个表单,其中包含来自数据库的正确数据。一种管理 DE 语言,另一种管理 EN:

查看:

<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(Request $request) {

    $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(),
    ));
}

我的问题是:如何将已使用的表单保存在一个控制器之外?

【问题讨论】:

  • 您可能希望查看form classes 并在那里处理翻译。这样一来,您只需担心一种形式的持久性(并且不必为每次翻译复制 FormBuilder 代码。
  • 我不明白这如何解决我的问题?!还是只是为了不要重复自己? :-)
  • 哦,您正在寻找如何保存它们?我会添加一个答案...

标签: symfony doctrine


【解决方案1】:

基于 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();
}

【讨论】:

  • 好吧,我设法保存了它。但我正在为切换而苦苦挣扎。到目前为止,谢谢。
  • 顺便说一下我用的是实体类!
  • 如何添加一个隐藏字段来告诉您每个表单上的语言,然后使用if($data['language'] == "EN") { $pageEN-&gt;... } else { $pageDE-&gt;... } 作为您的开关?
  • 我无法相信 symfony 没有办法处理这样的事情 -.- 那么为什么表单会变得如此复杂?
【解决方案2】:

在您的控制器中,您可以测试请求是否包含表单,例如:

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

【讨论】:

  • 我将此代码的表单的 DOM-Id 设置为“form1”和“form2”。它没有找到它们:-(
  • 这里重要的不是 ID,而是表单名称。您可以覆盖表单类型的 getName() 方法,以返回您在控制器中测试的相同值。
  • DOM 参数“名称”也不起作用。你如何覆盖表单类型?我为什么要这样做。抱歉问那些新手问题。我的目标是最简单的解决方案,然后重构它..
  • 对不起,我没有意识到你没有使用表单类。在这种情况下,您不能覆盖 getName() 方法,而且我不确定表单名称是如何设置的。可能有更好的方法来做到这一点,但是您可以通过将 $this->getRequest() 的内容转储到屏幕来查找表单名称,或者在开发环境中您也可以通过查看请求数据网络分析器。
  • 表单只提交 _Token 值。没有名称价值!我是第一个尝试这个吗? :-/
猜你喜欢
  • 2014-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多