2011-08-09 132 views
4

我有一个表格,我需要在多个页面上使用:如何处理在多个页面上使用的表单?

控制器

$emailForm = $this->get('form.factory')->createNamedBuilder('form', 'email_form') 
    ->add('email', 'email') 
    ->add('subject', 'text') 
    ->add('body', 'textarea') 
    ->getForm(); 

$request = $this->get('request'); 

if ($request->getMethod() == 'POST' && $request->request->has('email_form')) { 
    $emailForm->bindRequest($request); 

    if ($emailForm->isValid()) { 

     // do stuff ... 

     $this->get('session')->setFlash('email_sent', "Woey, mail sent successfully!"); 

     // Redirect on the same url to prevent double posts 
     return $this->redirect($this->generateUrl($this->getRequest()->attributes->get('_route'))); 
    } 
} 

return $this->render('Bundle:Form:index.html.twig', array('email_form' => $emailForm->createView())); 

模板

{% if app.session.getFlash('email_sent') %} 
    <p>{{ app.session.getFlash('email_sent') }}</p> 
{% endif %} 

<form action="{{ path(app.request.attributes.get('_route')) }}" method="post" {{ form_enctype(email_form) }}> 
    {{ form_widget(email_form) }} 

    <p><input type="submit" class="submit" value="Send" /></p> 
</form> 

这真的只是标准Symfony2的形式,就像从教程。

我无法想象如何在多个页面(在多个控制器操作中)有效地使用它,而不必重复自己(太多)。到目前为止,我尝试过:

  • 将逻辑放入基本控制器,这是每个控制器的父级,我想要这种形式。有两个问题这种方法:
    • 我想不出如何正确重定向到同一页面
    • 我只好打电话给父母,从法的每一个动作,这是不是一个真正的问题,但我猜想必须有一些更优雅的方式
  • 渲染控制器使用embedded controllers在树枝。但是,我无法计算出how to redirect properly

那么,这种形式的常用方法是什么?

编辑:

我正在寻找一个没有脚本的解决方案。

+0

我发现这篇博文很有帮助,当处理类似的问题时:https://phpcoderblog.wordpress.com/2014/06/26/symfony2-using-same-form-for-all-pages-symfony2-put-同外形上所有页Symfony2中使用,同样外形上的每个页面,Symfony2中,如何使用的接触式外形上的每个页面,Symfony2中,如何对使用 - contact-form-on-al/ – Sam

回答

2

我结束了在我需要的每个页面上使用嵌入式控制器,发布到不同的URL并保存cookie与引用。然后我验证表单,将结果保存为cookie,重定向到引用链接并呈现结果(错误,谢谢您的消息...)。在处理需要考虑禁用Javascript的场景时,这似乎是最好的选择。当用户使用AJAX发布时,您可以使用简单的条件轻松禁用冗余Cookie/Flash会话的创建。

+0

我知道它的老,但这个问题让我感到莫名其妙。好一个。 – Flosculus

1

的Symfony2的窗体教程解决您的情况为好,看到Creating Form ClassesDocs部分,其中“您将学习如何建立你的形式在一个独立的类,它被推荐为您的形式变成可重复使用的”(同上) 。

+1

是的,类是一回事,处理逻辑是其他。我仍然需要在每个操作方法中编写相当多的逻辑。我希望有更类似于嵌入式控制器的东西,在那里我将所有逻辑(包括渲染,验证和所有其他东西)“分离”为独立的方法,并将其包含到我需要的模板中。 –

1

您应该通过ajax文章提交数据。

在控制器中执行以下操作:p 然后在树枝模板中呈现窗体,而不扩展布局。 (就像现在这样)

然后在任何视图中,您只需替换结果:$('#formDiv')。html(htmlReceivedBack);

我觉得用新的呈现的html代替整个html div是最简单的;很可能您会显示成功消息或某些表单错误。

这样用户不必为了发送消息/反馈而改变页面。

+0

那么JavaScript禁用的用户呢? –

+2

对于那些1%的奶奶,您仍然可以通过逐步增强来完成。你只通过js挂钩动作,而不是删除url。如果不是xmlhttprequest,您可能只需要启用布局。所以表单就在页面上(可以这么说)。但严重的......这是1% - 你不想要这样的顾客......他们是麻烦的... – Tjorriemorrie

+5

希望我可以投票评论。我不了解你的客户,但我不会乐意失去1%的销售额,因为我认为他们很麻烦。 – Simon

相关问题