2013-10-11 2 views
7

하나의 입력으로 극히 기본적인 심포니 폼 (검색 기능에 사용됨)을 만들려고했습니다. 제출시 GET 메소드를 사용합니다. 예상대로 작동하는 것 같지만 극단적으로 추악하고 불필요하게 긴 URL을 생성합니다. 나는 누군가가 같은 문제에 부딪쳤을 때 궁금해하며 그것을 고치는 법을 알고 있습니까?Symfony 2 기본 GET 폼 생성 된 URL

양식

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

에 양식을 제출은 다음 URL을 생성합니다

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

원하는 URL : 사전에

search?q=red+apple 

감사합니다!

답변

16

원하는 URL을 만들려면 으로 그냥두면 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= 제거하려는 경우, 하나 개의 방법이 buttonsubmit에서 search을 변경하는 것입니다.

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

이렇게하면 javascript가 양식을 제출해야합니다. 그냥

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 

} 

: 당신이 당신의 컨트롤러 같은 것을 넣어 바르

search?q=red+apple 

가 GET에 액세스하려면 다음과 같이 이것은 URL을 생성합니다

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

: 여기 JQuery와 간단한 예입니다 URL에 page을 추가하는 경우 명확히하려면 양식에 추가해야합니다.

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

대단히 감사합니다! 이것은 꽤 잘 돌아갔다. URL에서'& search ='를 제거 할 방법이 있습니까? – AnchovyLegend

+0

또한 'search'와 같은'href'를 만들면?q = red + apple & search = & page = 2', 컨트롤러에서'page' GET var에 어떻게 접근 할 수 있습니까? 도움에 감사드립니다. – AnchovyLegend

+0

나는이 두 가지 질문에 답하기 위해 게시물을 편집했다. – hcoat

1

오래된 질문이지만, 알고 싶은 사람들을 위해, 이것은 않습니다 너무 일 (심포니 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(); 
     // ... 
    } 
    // ... 
}