2012-11-14 15 views
6

मुझे विधि = जीईटी और एक स्वच्छ यूआरएल स्पेस के साथ Symfony2.1 रूपों का उपयोग करने में मदद की ज़रूरत है।सिम्फनी 2.1 विधि के साथ फॉर्म का उपयोग कर

मैं एक "फ़िल्टर" बना रहा हूं जिसे मैं यूआरएल में सेट करना चाहता हूं ताकि लोग अपने लिंक बुक कर सकें।

तो, बहुत बस कोड:

$form = $this->createFormBuilder($defaultData) 
    ->add('from', 'date', array('required' => false, 'widget' => 'single_text', 'format' => 'dd.MM.yyyy')) 

मैं प्रपत्र विजेट प्रस्तुत करना और सब ठीक है।

/app_dev.php/de/event?form%5Bfrom%5D=17.11.2012 

इसका कारण यह है इनपुट नाम निश्चित रूप से है form[from]

तो यूआरएल अंतरिक्ष साफ करने के लिए, मैं अपने आप को एक बना दिया:

हालांकि जब मैं सबमिट करने पर बहुत बदसूरत GET पैरामीटर का उत्पादन विषय:

{% block widget_attributes %} 
{% spaceless %} 
    id="{{ id }}" name="{{ id }}"{% if read_only %} disabled="disabled"{% endif %}{% if required %} required="required"{% endif %}{% if max_length %} maxlength="{{ max_length }}"{% endif %}{% if pattern %} pattern="{{ pattern }}"{% endif %} 
    {% for attrname,attrvalue in attr %}{{attrname}}="{{attrvalue}}" {% endfor %} 
{% endspaceless %} 
{% endblock widget_attributes %} 

जहाँ मैं name="{{ id }}" साथ name="{{ full_name }}" बदल दिया।

यह अच्छी तरह से काम करता है - मेरी यूआरएल जगह नहीं है क्लीनर:

/app_dev.php/de/event?form_from=17.11.2012 

मुझे लगता है मैं उस के साथ रह सकता है - हालांकि आदर्श from=xxx बेहतर होगा। यह पहली और अधिक मामूली समस्या है। इस स्पष्ट है क्योंकि पैरामीटर "फार्म" नहीं रह गया है सेट है - -


दूसरी समस्या यह है कि मैं अब और प्रपत्र बाध्य करने के लिए नहीं मिल सकता है "form_from" बदल दिया गया है, लेकिन जब आप एक बाँध कर यह अभी भी फार्म की उम्मीद है []।

मुझे लगता है कि ठीक करने के लिए इस तरह की कोशिश की:

$fromDate = $this->get('request')->query->get('form_from', null); 
$request->query->set('form', array('from' => $fromDate); 

लेकिन वह काम नहीं करता। मुझे यह भी संदेह है कि मैं इस समय हैक का एक बड़ा छेद खोद रहा हूं।

तो सवाल यह है कि: क्या मुझे बस form%5Bfrom%5D यूआरएल के साथ रहना चाहिए, या क्या यह सब करने के लिए एक बेहतर तरीका है (POST स्पष्ट रूप से उपयोग किए बिना)?

उत्तर

25

आप रूट फॉर्म का नाम खाली करने के लिए सेट कर सकते हैं, तो आपका फ़ील्ड नाम केवल form होगा। के माध्यम से

// the first argument to createNamedBuilder() is the name 
$form = $this->get('form.factory')->createNamedBuilder(null, 'form', $defaultData) 
    ->add('from', 'date', array(
     'required' => false, 
     'widget' => 'single_text', 
     'format' => 'dd.MM.yyyy' 
    )); 
+1

क्या फॉर्मटाइप का उपयोग सेवाओं के रूप में करते समय ऐसा कुछ करना संभव है?मुझे नहीं लगता कि आप उस संदर्भ में createNamedBuilder तक पहुंच सकते हैं और FormType :: getName() {return '' का उपयोग कर सकते हैं; } फॉर्मटाइप को सेवा के रूप में संदर्भित करने वाली समस्याओं का कारण बनता है। – caponica

+1

बेशक आप createNamedBuilder() तक पहुंच सकते हैं, आपको केवल फॉर्म फैक्ट्री तक पहुंच प्राप्त करने की आवश्यकता है :) –

+2

'$ builder-> getFormFactory()' ... कौन जानता था? धन्यवाद! – caponica

2

AbstractType::getName के अपने कार्यान्वयन में return null; का उपयोग कर ऐसा करते हैं इन दिनों एक ही प्रभाव है लगता है।

+0

लेकिन अगर फॉर्मटाइप शून्य हो जाता है, तो निर्भरता इंजेक्शन – mmoreram

+1

के साथ फॉर्म टाइप उत्पन्न करना संभव नहीं है सामान्य रूप से DI के साथ इस दृष्टिकोण का उपयोग नहीं कर सकता। रिटर्निंग नल स्वीकार किए गए उत्तर के बराबर है, अपने लिए देखें। –

5

पुराना धागा, लेकिन उल्लेखनीय है कि सिम्फनी 3 getName पूरी तरह से अनदेखा करता है।

हालांकि, यदि आप फॉर्म नाम रिक्त होने की आवश्यकता है तो आप getBlockPrefix के साथ ऐसा ही कर सकते हैं।

public function getBlockPrefix() { 
    return null; 
} 

इसका परिणाम फॉर्म फ़ील्ड को उपसर्ग के बिना नामित किया जाएगा।

संबंधित मुद्दे