2011-06-14 5 views
15

Symfony2 फॉर्म घटक में कस्टम विशेषताओं को बनाना संभव है?क्या सिम्फनी 2 में कस्टम फॉर्म फ़ील्ड विशेषताओं को बनाना संभव है?

कारण मैं पूछता हूं क्योंकि मैं एक निश्चित किनारे पर काम कर रहा हूं जहां read_only पर्याप्त नहीं होगा।

यहां परिदृश्य है: मुझे कुछ बाहरी तर्क पार्सिंग के परिणाम के आधार पर डेटा बाध्य करने की आवश्यकता है। यह महत्वपूर्ण है क्योंकि मेरे पास ऐसे फ़ील्ड हो सकते हैं जो डिफ़ॉल्ट रूप से अक्षम हैं लेकिन बाहरी तर्क के आधार पर फ़ील्ड सक्रिय हो सकते हैं। मैं इस परिणाम को उत्पन्न करने के लिए क्लाइंट स्क्रिप्टिंग का उपयोग नहीं कर सकता, इसे फ़ॉर्म विशेषता में अक्षम होना है।

यदि मैं फ़ील्ड के साथ read_only के रूप में शुरू करता हूं, तो यह अक्षम हो जाएगा, लेकिन मैं इसे डेटा को बाध्य नहीं कर पाऊंगा। तो मेरे उपर्युक्त बाहरी तर्क का नतीजा दिया गया, मैं read_only का उपयोग करने में सक्षम नहीं होगा। तो यह मुझे किसी अन्य विकल्प के साथ छोड़ देता है लेकिन एक अलग विशेषता का उपयोग करता है जो फ़ील्ड को अक्षम कर देगा।

क्या यह अक्षम प्रभाव उत्पन्न करने के लिए एक कस्टम विशेषता बनाना संभव है?

+0

यह "बाहरी तर्क पार्सिंग" क्या है?जो कुछ मैं इकट्ठा करता हूं, उससे आप कुछ अन्य मानदंडों के आधार पर वैकल्पिक रूप से आवश्यक फॉर्म फ़ील्ड बनाना चाहते हैं, लेकिन आप यह नहीं बताते कि वह मानदंड क्या है, इसलिए यह पता लगाना मुश्किल हो जाता है कि समाधान कहां होना चाहिए। क्या यह एक AJAX कॉल, फॉर्म अपडेट, या आपके नियंत्रक के लिए कुछ आंतरिक परिणाम है? –

उत्तर

19

मुझे यकीन नहीं है कि मैंने आपका प्रश्न सही ढंग से समझा है; क्या आप अपने फॉर्म इनपुट टैग में मनमानी विशेषताओं को जोड़ना चाहते हैं? उदाहरण के लिए:

<input type="text" name="myInput" myAttr="myValue" /> 

यदि यह है कि आप क्या करना चाहते है, तो यह संभव है, इसलिए जैसे:

$form = $this->createFormBuilder($someObj) 
     ->add('myInput', 'text', array(
      'attr' => array('myAttr' => 'myValue') 
     ) 
     ->getForm(); 

प्रलेखन यहाँ है:

http://symfony.com/doc/2.0/reference/forms/types/field.html

+0

मैंने अपने इनपुट फ़ील्ड के विशेषता नाम मान को सेट करने के लिए इस समाधान का प्रयास किया। लेकिन जब मैंने अपना फॉर्म प्रस्तुत किया और तत्वों का निरीक्षण किया, तो सेट फ़ील्ड मान उस फ़ील्ड के लेबल को असाइन किया गया था। मैं विशेषता मान को 'वर्ग' में बदलता हूं और यह काम करता है। क्लास एट्रिब्यूट के विपरीत यह नाम विशेषता कैसे अपेक्षित काम नहीं करती है? – Floricel

+1

@ फ्लोरिसेल, आपके इनपुट का 'नाम' विशेषता '$ builder-> add ($ inputName, $ type)' के पहले तर्क द्वारा निर्धारित किया गया है, इसलिए यह वास्तव में ' attr' विकल्प। यह हो सकता है कि 'add()' के लिए पहला तर्क हमेशा 'attr [' name '] 'ओवरराइड करता है। –

+0

यह स्वीकार्य उत्तर होना चाहिए –

0

आपकी सीमा सिम्फनी नहीं है, आपकी सीमा HTML और HTTP है। दुर्भाग्यवश, एक बार जब HTTP अनुरोध पूरा हो जाता है, तो एक बार जब ब्राउज़र ब्राउज़र को भेजा जाता है, तो सर्वर को जो कुछ भी प्रदान किया जाता है उसे बदलने के लिए कुछ भी नहीं कर सकता है (ठीक है, लगभग कुछ नहीं, हमेशा स्काईनेट होता है)। एकमात्र विकल्प जावास्क्रिप्ट है (और यदि वे लिंक्स नहीं चला रहे हैं तो यह बहुत कुछ कर सकता है)।

मैंने Google समूह पर question देखा और दोनों के संयोजन के आधार पर, मैं आपको बता सकता हूं कि आपके पास केवल दो विकल्प हैं।

  • आप ब्राउज़र से पहले प्रतिक्रिया के जवाब के रूप में विकल्प को प्रकट कर सकते हैं।
  • आप जावास्क्रिप्ट का उपयोग कर सकते हैं और फिर सर्वर की ओर किसी भी विफलता को संभाल सकते हैं।

आपकी सर्वश्रेष्ठ शर्त? मुझे लगता है कि उपयोगकर्ता जावास्क्रिप्ट विकल्प की सराहना करेंगे। वैसे भी उपयोगकर्ता जानकारी सर्वर-पक्ष को मान्य करने के लिए अच्छी नीति है। स्पष्ट रूप से उपयोगकर्ता को जावास्क्रिप्ट के साथ सत्यापन करके जितनी जल्दी हो सके पता चले, लेकिन आपको सर्वर पर उनके इनपुट की जांच करने की आवश्यकता होगी।

वैसे, Symfony में एक फार्म क्षेत्र को निष्क्रिय करने, कदम दर कदम निर्देश here हैं।

+0

केवल पढ़ने के लिए काम नहीं करता है क्योंकि, Symfony2 में (Symfony1 नहीं) यदि फ़ील्ड पढ़ा जाता है तो केवल अक्षम फ़ील्ड को डेटा बाध्य करना संभव नहीं होगा, यही कारण है कि मैं अक्षम करने के लिए अपनी खुद की कस्टम विशेषता बनाना चाहता हूं केवल पढ़ने के बिना अक्षम किया जा सकता है। फ़ील्ड को अक्षम करने के लिए जावास्क्रिप्ट का उपयोग करना केवल एक काम है क्योंकि HTML दस्तावेज़ अभी भी अर्थपूर्ण रूप से गलत होगा। –

1

हार्ड करने के लिए बिल्कुल बताएं कि आप क्या करना चाहते हैं, लेकिन लगता है जैसे आप कुछ घटनाओं के आधार पर गतिशील रूप से जेनरेट किए गए फॉर्म चाहते हैं, जो यहां वर्णित है:

http://symfony.com/doc/2.0/cookbook/form/dynamic_form_generation.html