2011-08-09 56 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

相關問題