2012-06-14 9 views
17

मैं symfony2 के भीतर से कुछ इनपुट या लेबल फ़ील्ड में कक्षा जोड़ना चाहता हूं।सिम्फनी 2 - फॉर्मबिल्डर - फ़ील्ड में एक कक्षा जोड़ें और इनपुट

मैं टहनी भीतर मेरे रूप में कुछ इस तरह कर सकते हैं:

<div class="row"> 
    {{ form_label(form.subject) }} 
    {{ form_widget(form.subject, { 'attr': {'class': 'c4'} }) }} 
</div> 

कौन सा ठीक काम करता है। लेकिन मुझे हर रूप के लिए टेम्पलेट सेट करना होगा। और मुझे इसे सबसे छोटे संभव आउटपुट स्तर पर तोड़ना है। ,

{{ form_widget(form) }} 

तो मैं, सोच रहा था कि कैसे मैं में कहीं एल के लिए एक सीएसएस वर्ग जोड़ सकते हैं:: मैं वास्तव में उपयोग करना चाहते हैं, मुझे लगा कि यह अधिक उपयोगी हो सकता है

class SystemNotificationType extends AbstractType { 
    public function buildForm(FormBuilder $builder, array $options) { 
     $builder ->add('subject', 'text', array('label' => 'Subject')) 
– 

मैं के रूप में केवल एक जगह पर बदलाव करना है।

तो यह कैसे किया जा सकता है, या शायद मैं गलत तरीके से सोच रहा हूं।

किसी भी मदद की बहुत अच्छा होगा,

बहुत धन्यवाद, फिलिप

उत्तर

26

एक क्षेत्र के वर्ग की प्रस्तुति परत का हिस्सा है आपके एप्लिकेशन, इसलिए अपने फॉर्मों के लिए एक टिग थीम बनाना सर्वोत्तम है:

fields.html.twigमें फ़ाइल बनाएं अपने बंडल कीऔर निर्धारित करें कि आपके प्रपत्र पंक्ति से स्वरूपित किया जाएगा, उदाहरण के लिए:

{% block field_row %} 
<div class="row"> 
    {{ form_errors(form) }} 
    {{ form_label(form) }} 
    {{ form_widget(form, { 'attr': {'class': 'c4'} }) }} 
</div> 
{% endblock field_row %} 

आप केवल कुछ क्षेत्र कस्टमाइज़ करना चाहते हैं, उदाहरण के लिए प्रपत्र formName के क्षेत्र fieldName, पंक्ति को अनुकूलित:

{% block _formName_fieldName_row %} 
<div class="row"> 
    {{ form_label(form) }} 
    {{ form_errors(form) }} 
    {{ form_widget(form, { 'attr': {'class': 'c4'} }) }} 
</div> 
{% endblock %} 

संपादित: सभी के लिए में

{% block _formName_fieldName_widget %} 
    {% set type = type|default('text') %} 
    <input type="{{ type }}" {{ block('widget_attributes') }} value="{{ value }}" class="c4" /> 
{% endblock %} 

तब: केवल क्षेत्र को अनुकूलित मीटर टेम्पलेट्स आप इसे इस विषय जोड़ने का उपयोग करना चाहते हैं: the cookbook

+0

धन्यवाद, यह भी ठीक है। मैंने पूरी तरह से इस हिस्से को कुकबुक में नहीं देखा। :) लेकिन मुझे अभी भी खेतों में हर तत्व के लिए पंक्तियां बनाना है। लेकिन शायद यह है, यह कैसे होना है। – insertusernamehere

+0

@insertusername यहां मेरे उत्तर में फ़ील्ड केवल अनुकूलन जोड़ा गया। परीक्षण नहीं किया गया लेकिन यह काम करना चाहिए। –

+0

यह बहुत अच्छा काम करता है। एक बार फिर धन्यवाद। :) – insertusernamehere

40

आप इसे इस तरह कर सकते हैं:

class SystemNotificationType extends AbstractType { 
    public function buildForm(FormBuilder $builder, array $options) { 
     $builder->add('subject', 'text', array( 
      'label' => 'Subject', 
      'attr' => array(
       'class' => 'c4') 
      ) 
     ); 
    } 
} 
+0

यह ठीक काम करता है। लेकिन यह वर्ग, लेबल और इनपुट क्षेत्र दोनों को जोड़ता है। क्या यह कहना संभव है कि लेबल और फ़ील्ड को विभिन्न कक्षाएं मिलती हैं? – insertusernamehere

+0

केवल 'सी 4' कक्षा को फ़ील्ड के लिए कैसे जोड़ना है, लेकिन लेबल के लिए नहीं? – Mikhail

+0

दस्तावेज़ पर संभावित जावास्क्रिप्ट वर्कअराउंड तैयार: $ ('label.c4')।removeClass ('सी 4'); – sglessard

6

पर्चा थीम


की कैसे एक रूप प्रदान की गई है हर भाग में

{% form_theme form 'MyBundle:Form:fields.html.twig' %} 

यह गहराई से समझाया गया है अनुकूलित किया जा सकता । आप यह बदलने के लिए स्वतंत्र हैं कि प्रत्येक फ़ॉर्म "पंक्ति" कैसे प्रस्तुत करता है, त्रुटियों को प्रस्तुत करने के लिए उपयोग किए गए मार्कअप को बदलें, या यह भी अनुकूलित करें कि टेक्स्टरेरा टैग कैसे प्रस्तुत किया जाना चाहिए। कुछ भी सीमाएं नहीं हैं, और विभिन्न स्थानों पर विभिन्न अनुकूलन का उपयोग किया जा सकता है।

सिम्फनी टेम्पलेट्स का उपयोग फॉर्म के प्रत्येक भाग को प्रस्तुत करने के लिए करता है, जैसे कि लेबल टैग, इनपुट टैग, त्रुटि संदेश और बाकी सब कुछ।

टवीग में, प्रत्येक रूप "खंड" को एक ट्विग ब्लॉक द्वारा दर्शाया जाता है।फ़ॉर्म कैसे प्रस्तुत करता है के किसी भी हिस्से को कस्टमाइज़ करने के लिए, आपको केवल उचित ब्लॉक को ओवरराइड करने की आवश्यकता है।

PHP में, प्रत्येक रूप "खंड" को एक व्यक्तिगत टेम्पलेट फ़ाइल के माध्यम से प्रस्तुत किया जाता है। एक फ़ॉर्म प्रस्तुत करने के किसी भी हिस्से को कस्टमाइज़ करने के लिए, आपको केवल एक नया निर्माण करके मौजूदा टेम्पलेट को ओवरराइड करने की आवश्यकता है।

यह समझने के लिए कि यह कैसे काम करता है, form_row खंड को कस्टमाइज़ करें और प्रत्येक पंक्ति से घिरे div तत्व में कक्षा विशेषता जोड़ें।

{# src/Acme/TaskBundle/Resources/views/Form/fields.html.twig #} 
{% block form_row %} 
{% spaceless %} 
<div class="form_row"> 
{{ form_label(form) }} 
{{ form_errors(form) }} 
{{ form_widget(form) }} 
</div> 
{% endspaceless %} 
{% endblock form_row %} 

form_row प्रपत्र टुकड़ा जब form_row समारोह के माध्यम से सबसे क्षेत्रों प्रतिपादन प्रयोग किया जाता है ऐसा करने के लिए, एक नया टेम्पलेट फ़ाइल है कि नए मार्कअप स्टोर करेगा पैदा करते हैं। अपने नए form_row टुकड़ा ऊपर परिभाषित उपयोग करने के लिए प्रपत्र घटक कहता हूं, जोड़ने के उस रूप renders टेम्पलेट के शीर्ष पर निम्नलिखित:

{# src/Acme/TaskBundle/Resources/views/Default/new.html.twig #} 
{% form_theme form 'AcmeTaskBundle:Form:fields.html.twig' %} 
{% form_theme form 'AcmeTaskBundle:Form:fields.html.twig' 
'AcmeTaskBundle:Form:fields2.html.twig' %} 
{{ form(form) }} 

form_theme टैग (टहनी में) "आयात" टुकड़े में परिभाषित किया गया टेम्पलेट दिया गया है और फॉर्म को प्रस्तुत करते समय उनका उपयोग करता है। दूसरे शब्दों में, जब form_row फ़ंक्शन को बाद में इस टेम्पलेट में कॉल किया जाता है, तो यह आपके कस्टम थीम से form_row ब्लॉक का उपयोग करेगा (डिफ़ॉल्ट फॉर्म_रो ब्लॉक के बजाय सिम्फनी के साथ जहाजों)।

आपकी कस्टम थीम को सभी ब्लॉक को ओवरराइड करने की आवश्यकता नहीं है। एक ब्लॉक को प्रतिपादित करते समय जो आपकी कस्टम थीम में ओवरराइड नहीं होता है, थीमिंग इंजन वैश्विक थीम पर वापस आ जाएगा (बंडल स्तर पर परिभाषित)।

यदि कई कस्टम थीम प्रदान की जाती हैं तो उन्हें वैश्विक विषय पर वापस आने से पहले सूचीबद्ध क्रम में खोजा जाएगा।

किसी फ़ॉर्म के किसी भी हिस्से को कस्टमाइज़ करने के लिए, आपको उचित टुकड़े को ओवरराइड करने की आवश्यकता है। यह जानने के लिए कि कौन सा ब्लॉक या फ़ाइल ओवरराइड है, अगले खंड का विषय है।

{# src/Acme/TaskBundle/Resources/views/Default/new.html.twig #} 

{% form_theme form with 'AcmeTaskBundle:Form:fields.html.twig' %} 

{% form_theme form with ['AcmeTaskBundle:Form:fields.html.twig', 
'AcmeTaskBundle:Form:fields2.html.twig'] %} 

अधिक जानकारी के लिए देख Symfony रसोई की किताब में प्रतिपादन अनुकूलित करने के लिए कैसे

वैश्विक पर्चा थीम


उपरोक्त उदाहरण में, आप form_theme इस्तेमाल किया सहायक (टवीग में) कस्टम फॉर्म टुकड़ों को "आयात" करने के लिए बस वें में फॉर्म पर आप सिम्फनी को अपनी संपूर्ण परियोजना में फॉर्म अनुकूलन आयात करने के लिए भी बता सकते हैं।

# app/config/config.yml 
    twig: 
    form: 
     resources: 
     - 'AcmeTaskBundle:Form:fields.html.twig' 

क्षेत्रों के अंदर किसी भी ब्लॉक:

टहनी

स्वचालित रूप से सभी टेम्पलेट में पहले बनाए fields.html.twig टेम्पलेट से अनुकूलित ब्लॉक, आपके आवेदन विन्यास फाइल को संशोधित शामिल करने के लिए। html.twig टेम्पलेट अब फॉर्म आउटपुट को परिभाषित करने के लिए वैश्विक रूप से उपयोग किया जाता है।

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