2013-10-11 10 views
7

मैं केवल एक इनपुट के साथ एक बेहद बुनियादी सिम्फनी फॉर्म (खोज कार्यक्षमता के लिए उपयोग किया जाता है) बनाने की कोशिश कर रहा हूं। यह सबमिट पर जीईटी विधि का उपयोग करता है। ऐसा लगता है कि यह अपेक्षाकृत काम करता है, हालांकि यह बेहद बदसूरत और अनावश्यक रूप से लंबा यूआरएल उत्पन्न करता है। मैं थोड़ी देर के लिए यूआरएल को 'साफ' करने की कोशिश कर रहा हूं, मैं सोच रहा था कि कोई एक ही समस्या में भाग गया है और जानता है कि इसे कैसे ठीक किया जाए?सिम्फनी 2 मूल जीईटी फॉर्म उत्पन्न यूआरएल

फार्म

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

पर प्रपत्र सबमिट निम्नलिखित URL जेनरेट करता है:

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

वांछित यूआरएल:

search?q=red+apple 

अग्रिम धन्यवाद!

उत्तर

16

अपना वांछित यूआरएल बनाने के लिए, आपको createNamedBuilder का उपयोग करके फॉर्म नाम सेट करना होगा, जिसे आप खाली '' छोड़ देंगे। _token को हटाने के लिए आपको csrf_protection को गलत पर सेट करने की आवश्यकता है। कृपया यह सुनिश्चित करने के लिए सीएसआरएफ सुरक्षा देखें कि आपको पता है कि क्या बंद हो सकता है।

अपने कोड को निम्नलिखित में बदलना आपको इच्छित परिणाम देना चाहिए।

$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 से button को search बदलने के लिए किया जाएगा।

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

इसके लिए आपको अपना फॉर्म सबमिट करने के लिए जावास्क्रिप्ट की आवश्यकता होगी।

search?q=red+apple 

प्राप्त का उपयोग करने के वार्स आप अपने नियंत्रक में कुछ इस तरह से रख::

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

यह किसी URL का उत्पादन करेगा: यहाँ jQuery में सरल उदाहरण है यह स्पष्ट करने के लिए कि क्या आप अपने यूआरएल में page जोड़ रहे हैं, आपको इसे अपने फॉर्म में जोड़ना होगा:

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

आपको बहुत बहुत धन्यवाद! यह काफी अच्छा काम किया। यूआरएल से '& search =' को हटाने का कोई तरीका है? – AnchovyLegend

+0

अगर मैं 'href' की तरह 'खोज बनाता हूं?क्यू = लाल + सेब और खोज = और पृष्ठ = 2', मैं नियंत्रक में 'पृष्ठ' 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(); 
     // ... 
    } 
    // ... 
} 
संबंधित मुद्दे