2013-10-11 19 views
7

我一直在試圖用一個輸入創建一個非常基本的symfony表單(用於搜索功能)。它在提交時使用GET方法。它似乎按預期工作,但它會生成一個非常醜陋和不必要的長URL。我一直在努力「清理」URL長達一段時間,我想知道是否有人遇到同樣的問題並知道如何解決它?Symfony 2生成的基本GET表單URL

形式

$form = $this->createFormBuilder($search) 
      ->setMethod('GET') 
      ->add('q', 'text') 
      ->add('search', 'submit') 
      ->getForm(); 

在提交表單生成以下網址:

search?form[q]=red+apple&form[search]=&form[_token]=bb342d7ef928e984713d8cf3eda9a63440f973f2 

所需的URL:提前

search?q=red+apple 

謝謝!

回答

16

要創建您想要的網址,您必須使用createNamedBuilder來設置表格名稱,您只需將其保留爲空即可。''。 要刪除_token,您需要將csrf_protection設置爲false。請關注csrf保護,以確保您知道關閉後會發生什麼情況。

將您的代碼更改爲以下內容應該會給您想要的結果。

$form = $this->get('form.factory')->createNamedBuilder('', 'form', $search, array(
      'csrf_protection' => false, 
     ))->setMethod('GET') 
      ->add('q', 'text') 
      ->add('search', 'submit') 
      ->getForm(); 

這應該產生一個URL,如:

search?q=red+apple&search= 

編輯:

如果你想擺脫&search=,一個辦法是從submit改變searchbutton

->add('search', 'button') 

這將需要JavaScript來提交您的表單。 這裏是jQuery的簡單的例子:

search?q=red+apple 

要訪問GET瓦爾你把這樣的事情在你的控制器:

public function yourSearchAction(Request $request) 
{ 
    // your code ... 

    $form->handleRequest($request); 

    if ($form->isValid()) { 

     $getVars = $form->getData(); 

     $q = $getVars['q']; 
     $page = $getVars['page']; 
     $billing = $em 

     //Do something 

    } 

    return //your code 

} 

只是

//This assumes one form and one button 
$(document).ready(function(){ 
    $('button').click(function(){ 
     $('form').submit(); 
    }); 
}); 

喜歡這將產生一個網址澄清如果您將page添加到您的網址,您需要將其添加到您的表單中:

->add('page', 'text') 
+0

非常感謝您!這工作得很好。有什麼辦法可以從URL中刪除'&search ='? – AnchovyLegend

+0

另外,如果我創建'href'就像'搜索?q = red + apple&search =&page = 2',我將如何訪問控制器中的'page' GET var?我很感激幫助。 – AnchovyLegend

+0

我已編輯帖子回答這兩個問題。 – hcoat

1

老問題,但對於想知道誰的人,這樣做的工作太(Symfony的2.8):

<?php 
// src/AppBundle/Form/SearchType.php 
namespace AppBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\Form\Extension\Core\Type\TextType; 
use Symfony\Component\Form\Extension\Core\Type\SubmitType; 
use Symfony\Component\OptionsResolver\OptionsResolver; 

class SearchType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->setMethod('GET') 
      ->add('q', TextType::class) 
      ->add('submit', SubmitType::class)) 
     ; 
    } 

    public function getBlockPrefix(){ 
     return ''; 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults([ 
      'csrf_protection' => false, 
     ]); 
    } 
} 

在你的控制器:

<?php 
//... 
use AppBundle\Form\SearchType; 
//... 
public function yourSearchAction(Request $request) 
{ 
    $form = $this->createForm(SearchType::class); 

    $form->handleRequest($request); 

    if ($form->isSubmitted() && $form->isValid()) { 

     $q = $form->get('q')->getData(); 
     // ... 
    } 
    // ... 
}