2013-10-11 25 views
7

Sadece bir giriş ile son derece basit bir symfony formu (arama işlevi için kullanılır) oluşturmaya çalışıyorum. Gönderide GET yöntemini kullanır. Beklendiği gibi çalışır, ancak son derece çirkin ve gereksiz uzun URL üretir. Şimdiye kadar bir süredir '' temizlemeyi '' deniyordum, birisinin aynı problemle karşılaştığını ve nasıl düzeltileceğini bilip bilmediğini merak ediyordum.Symfony 2 basic GET formu oluşturulan URL

Formu

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

On formu göndermek aşağıdaki URL oluşturur:

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

İstenilen URL: önceden

search?q=red+apple 

teşekkürler!

cevap

16

İstediğiniz URL'yi oluşturmak için, '' boş bırakacağınız createNamedBuilder kullanarak form adını ayarlamanız gerekecektir. _token kaldırmak için , csrf_protection yanlış ayarlamak gerekir. Lütfen kapatılmışsa neler olabileceğini bildiğinizden emin olmak için csrf korumasına bakın.

Kodunuzu aşağıdaki şekilde değiştirmek istediğiniz sonuçları vermelidir.

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

Bu

gibi bir URL üretmelidir:

search?q=red+apple&search= 

Düzenleme:

Eğer &search= kurtulmak istiyorsanız, tek yön button için submit den search değiştirmek olacaktır.

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

Bu, javascript'in formunuzu göndermesini gerektirir. Sadece

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 

} 

: Eğer denetleyici böyle bir şey koymak vars

search?q=red+apple 

GET erişmek için: gibi bu bir URL üretecek

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

: İşte jquery basit bir örnek Eğer URL'nize page ekliyor iseniz açıklığa kavuşturmak için formunuza eklemeniz gerekecek:

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

çok teşekkür ederiz! Bu oldukça iyi çalıştı. URL’den '& search =' kaldırmanın herhangi bir yolu var mı? – AnchovyLegend

+0

Ayrıca "href" gibi bir arama oluşturursam?q = kırmızı + elma ve arama = & sayfa = 2', denetleyicideki "sayfa" GET varlığına nasıl erişebilirim? Yardımı takdir ediyorum. – AnchovyLegend

+0

Bu iki soruyu yanıtlamak için gönderiyi düzenledim. – hcoat

1

Eski bir soru ama, bilmek isteyenler için, bunu yapar da iş (Symfony'nin 2.8): Kumandanızda olarak

<?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(); 
     // ... 
    } 
    // ... 
}