Symfony2 में फॉर्म फ़ील्ड के लिए डिफ़ॉल्ट मान कैसे सेट करें?


137

क्या टेक्स्ट फ़ॉर्म फ़ील्ड के लिए डिफ़ॉल्ट मान सेट करने का एक आसान तरीका है?


1
हां, लेकिन इस प्रश्न में दिए गए उत्तर संतोषजनक नहीं हैं / काम नहीं करते ... मैं यह समझाने के लिए "एडिट"
जोड़ूंगा

ऐसा लगता है कि आपके द्वारा किया गया 'सही' समाधान फ़ील्ड के लिए 'default_value' विकल्प है। बात यह है, वर्तमान में यह नहीं है , इसलिए मुझे नहीं लगता कि आप जिस सही समाधान की तलाश कर रहे हैं वह वर्तमान में मौजूद है। केवल एक चीज है जो सिम्फोनी प्रदान करता है (लिंक देखें) है डेटा विकल्प। तो अगर-तब एकमात्र तरीका है कि मैं एटीएम देख सकता हूं। यहां तक ​​कि अगर मैदान पर ही एक 'default_value' विकल्प था, तो मुझे लगता है कि यह अनिवार्य रूप से वैसे भी आंतरिक रूप से एक ही काम करेगा।
क्रायसल्लस

इसके अलावा, मैंने दृष्टिकोण 2 में मेरे जवाब के लिए एक सुधार किया है। यदि आप बिंदु 2 में उल्लिखित वाक्यविन्यास समस्या को ठीक करते हैं, तो आप उस टिप्पणी को संपादित करना चाह सकते हैं। या मुझे बताएं कि समस्या क्या है, और मैं अपना उत्तर ठीक करूंगा।
crysallus

1
@ यह सवाल 2 साल पहले पूछा गया था
Ondrej Slinták

1
@ OndrejSlinták मैं वोट देने के लिए वोट नहीं देता था, लेकिन FYI करें: इससे कोई फर्क नहीं पड़ता कि कौन पहले आया था, " यदि नया प्रश्न बेहतर प्रश्न है या उसके बेहतर उत्तर हैं, तो पुराने को डुप्लिकेट के रूप में बंद करें नए के साथ। "
जेफ पिकेट

जवाबों:


105

निर्माण के दौरान आसानी से उपयोग किया जा सकता है:

->add('myfield', 'text', array(
     'label' => 'Field',
     'empty_data' => 'Default value'
))

11
सिम्फनी 2.1 के लिए मुझे 'data''value'
एड

175
यह केवल एक डिफ़ॉल्ट मान सेट नहीं करता है, यह हमेशा किसी भी संदर्भ में मूल्य को मजबूर करेगा। ऐसा नहीं है जिसे मैं "डिफ़ॉल्ट मान" कहूंगा ...
ह्यूबर्ट पेर्रोन

4
मैंने इस समाधान को अस्वीकार कर दिया क्योंकि यह समस्या का हल नहीं है (जैसा कि ह्यूबर्ट पेरोन ने ऊपर बताया है)। मैं इस पोस्ट stackoverflow.com/questions/17986481/…
herrjeh42

13
यह प्रारंभिक मूल्य है, डिफ़ॉल्ट मान हैempty_data
पियरे डे लेसपिन

3
dataबेकार है - यह सहेजे गए मूल्य को अधिलेखित करता है। empty_dataमान प्रदर्शित नहीं करता है, यह खाली मान सबमिट पर इसका उपयोग करता है और अनियंत्रित विकल्पों को सहेजना असंभव बनाता है।
मोल्डक्राफ्ट

115

आप के साथ डिफ़ॉल्ट मान सेट कर सकते हैं empty_data

$builder->add('myField', 'number', ['empty_data' => 'Default value'])

29
डेटा सेट करना डिफ़ॉल्ट सेट नहीं है। यह उत्तर सही है।
अलेक्सई तेनित्स्की

9
यह फ़ील्ड को केवल 1 पर सेट करने के लिए प्रकट होता है जब इसे बिना मूल्य के साथ सबमिट किया जाता है। जब कोई मूल्य मौजूद नहीं है तो आप इनपुट में 1 प्रदर्शित करने के लिए डिफ़ॉल्ट के रूप में क्या चाहते हैं?
ब्रायन

मेरे परीक्षण में, खाली_डाटा मुझे खाली सबमिट किए गए फ़ील्ड से डिफ़ॉल्ट मान को ओवरराइड करने की अनुमति नहीं देता है, जैसे कि यदि आप डेटाबेस को NULL के बजाय 0 के रूप में सहेजना चाहते हैं। यह बग अभी भी बकाया है जहां तक ​​मैं बता सकता हूं: github.com/symfony/symfony/issues/5906
चाडविक मेयर

63

मैंने अतीत में कुछ बार इस पर विचार किया है, इसलिए मैंने सोचा है कि मैंने उन विभिन्न विचारों को दबा दिया है जिनका मैंने उपयोग / उपयोग किया है। कुछ का उपयोग हो सकता है, लेकिन कोई भी "सही" Symfony2 समाधान नहीं हैं।

कंस्ट्रक्टर एंटिटी में आप $ यह कर सकते हैं-> सेटबार ('डिफ़ॉल्ट मान'); लेकिन यह हर बार आपको इकाई को लोड करने के लिए कहा जाता है (डीबी या नहीं) और थोड़ा गड़बड़ है। हालाँकि यह हर क्षेत्र के प्रकार के लिए काम करता है क्योंकि आप तिथियां बना सकते हैं या आपको और कुछ भी चाहिए।

अगर बयान के भीतर मैं नहीं होगा, लेकिन आप कर सकते हैं।

return ( ! $this->hasFoo() ) ? 'default' : $this->foo;

फैक्टरी / उदाहरण । एक स्थिर फ़ंक्शन / द्वितीयक वर्ग को कॉल करें जो आपको डेटा के साथ एक डिफ़ॉल्ट एंटिटी पूर्व-आबादी प्रदान करता है। उदाहरण के लिए

function getFactory() {
    $obj = new static();
    $obj->setBar('foo');
    $obj->setFoo('bar');

   return $obj;
}

यदि आप अतिरिक्त फ़ील्ड जोड़ते हैं तो वास्तव में आदर्श नहीं है, तो आपको इस फ़ंक्शन को बनाए रखना होगा, लेकिन इसका मतलब यह है कि आप डेटा सेटर्स / डिफ़ॉल्ट को अलग कर रहे हैं और जो db से उत्पन्न होता है। इसी तरह आपके पास कई getFactories हो सकते हैं, जिन्हें आपको अलग-अलग डिफ़ॉल्ट डेटा चाहिए।

विस्तारित / परावर्तन संस्थाएं एक विस्तारित इकाई बनाएँ (जैसे FooCreate Foo का विस्तार करता है) जो आपको समय पर (निर्माणकर्ता के माध्यम से) डिफ़ॉल्ट डेटा देता है। फैक्टरी / उदाहरण के विचार के समान ही एक अलग दृष्टिकोण है - मैं व्यक्तिगत रूप से स्थिर तरीकों को पसंद करता हूं।

बिल्ड फॉर्म से पहले डेटा सेट करें कंस्ट्रक्टर्स / सर्विस में, आप जानते हैं कि क्या आपके पास एक नई इकाई है या यदि यह डीबी से पॉपुलेटेड है। जब आप एक नई इकाई को पकड़ते हैं तो यह विभिन्न क्षेत्रों पर सेट डेटा को कॉल करने के लिए प्रशंसनीय है। उदाहरण के लिए

if( ! $entity->isFromDB() ) {
     $entity->setBar('default');
     $entity->setDate( date('Y-m-d');
     ...
}
$form = $this->createForm(...)

प्रपत्र घटनाएँ जब आप प्रपत्र बनाते हैं तो आप फ़ील्ड बनाते समय डिफ़ॉल्ट डेटा सेट करते हैं। आप PreSetData इवेंट श्रोता इस उपयोग को ओवरराइड करते हैं। इसके साथ समस्या यह है कि आप फॉर्म वर्कलोड / डुप्लिकेटिंग कोड को डुप्लिकेट कर रहे हैं और इसे बनाए रखना / समझना कठिन बना रहे हैं।

विस्तारित प्रपत्र प्रपत्र ईवेंट के समान, लेकिन यदि आप एक db / नई निकाय है, तो इसके आधार पर आप भिन्न प्रकार को कॉल करते हैं। इससे मेरा मतलब है कि आपके पास FooType है जो आपके एडिट फॉर्म को परिभाषित करता है, BarType FooType को बढ़ाता है और सभी डेटा को फ़ील्ड्स पर सेट करता है। अपने कंट्रोलर में आप फिर से टाइप करने के लिए कौन सा फॉर्म चुनें। यह बेकार है अगर आपके पास एक कस्टम विषय है और घटनाओं की तरह, मेरी पसंद के लिए बहुत अधिक रखरखाव बनाता है।

Twig आप अपना स्वयं का विषय बना सकते हैं और मूल्य विकल्प का उपयोग करके डेटा को डिफ़ॉल्ट कर सकते हैं जब आप इसे प्रति-क्षेत्र के आधार पर करते हैं। फॉर्म थीम में इसे लपेटने से कुछ भी नहीं होता है या तो आपको अपने टेम्प्लेट को साफ रखना चाहिए और फॉर्म को फिर से उपयोग करना चाहिए। जैसे

form_widget(form.foo, {attr: { value : default } });

जे एस यह एक जे एस समारोह के साथ फार्म को भरने के लिए है, तो फ़ील्ड रिक्त हैं तुच्छ होगा। आप उदाहरण के लिए प्लेसहोल्डर्स के साथ कुछ कर सकते हैं। यह एक बुरा, बुरा विचार है।

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

निष्कर्ष जैसा कि मैंने इसे देखा है, आप एक ही मुद्दे पर समय और समय में फिर से चलेंगे - जहां डिफ़ॉल्ट डेटा रहने के लिए है?

  • यदि आप इसे db / doctrine के स्तर पर संग्रहीत करते हैं तो क्या होगा यदि आप हर बार डिफ़ॉल्ट को संग्रहीत नहीं करना चाहते हैं?
  • यदि आप इसे इकाई स्तर पर संग्रहीत करते हैं तो क्या होता है यदि आप उस इकाई को कहीं और बिना किसी डेटा के फिर से उपयोग करना चाहते हैं?
  • यदि आप इसे Entity Level पर संग्रहीत करते हैं और एक नया फ़ील्ड जोड़ते हैं, तो क्या आप चाहते हैं कि पिछले संस्करणों में संपादन पर डिफ़ॉल्ट मान हो? समान डीबी में डिफ़ॉल्ट के लिए जाता है ...
  • यदि आप इसे प्रपत्र स्तर पर संग्रहीत करते हैं, तो क्या यह स्पष्ट है जब आप बाद में कोड बनाए रखने के लिए आते हैं?
  • यदि यह कंस्ट्रक्टर में है तो क्या होगा यदि आप कई स्थानों पर फॉर्म का उपयोग करते हैं?
  • यदि आप इसे जेएस स्तर पर धकेलते हैं तो आप बहुत दूर चले गए हैं - डेटा को जेएस में कभी भी ध्यान में नहीं रखना चाहिए (और हम संगतता को अनदेखा कर रहे हैं, त्रुटियों को दे रहे हैं आदि)
  • यह सेवा बहुत अच्छी है अगर मेरी तरह आप इसे कई स्थानों पर उपयोग कर रहे हैं, लेकिन यह एक साइट पर एक साधारण ऐड / एडिट फॉर्म के लिए ओवरकिल है ...

उस अंत तक, मैं हर बार समस्या से अलग तरीके से संपर्क करता हूं। उदाहरण के लिए, एक साइनअप फॉर्म "न्यूज़लेटर" विकल्प आसानी से (और तार्किक रूप से) फॉर्म बनाने से ठीक पहले कंस्ट्रक्टर में सेट किया गया है। जब मैं फॉर्म कलेक्शन बना रहा था जो एक साथ जुड़े हुए थे (जैसे अलग-अलग प्रकार के रेडियो बटन एक साथ जुड़े हुए हैं) तो मैंने इवेंट श्रोताओं का उपयोग किया है। जब मैंने एक अधिक जटिल इकाई (उदाहरण के लिए जिसे बच्चों या बहुत से डिफ़ॉल्ट डेटा की आवश्यकता होती है) बनाया है, तो मैंने इसे बनाने के लिए एक फ़ंक्शन (उदाहरण के लिए 'getFactory') का उपयोग किया है क्योंकि मुझे इसकी आवश्यकता है।

मुझे नहीं लगता कि हर बार जब मैंने यह आवश्यकता की है तो एक "सही" दृष्टिकोण है, यह थोड़ा अलग है।

सौभाग्य! मुझे आशा है कि मैंने आपको किसी भी दर पर कुछ खाने के लिए दिया है और बहुत अधिक नहीं हुआ है;)


क्या आप about एक ऐसी सेवा के बारे में जो आपके सभी रूपों को उत्पन्न करते हैं ’के बारे में कुछ और विवरण दे सकते हैं? मैं अभी एक वास्तविक रूप से केंद्रित परियोजना पर काम कर रहा हूं और इस पर अलग-अलग दृष्टिकोण रखना बहुत अच्छा होगा।
user2268997

2
सिद्धांत का उपयोग करते समय, जब एक इकाई डीबी से लोड होती है, तो निर्माणकर्ताओं को नहीं बुलाया जाता है।
एनडीएम

43

यदि आपको डिफ़ॉल्ट मान सेट करने की आवश्यकता है और आपका फॉर्म इकाई से संबंधित है, तो आपको निम्नलिखित दृष्टिकोण का उपयोग करना चाहिए:

// buildForm() method
public function buildForm(FormBuilderInterface $builder, array $options) {
    $builder
    ...
    ->add(
        'myField',
        'text',
        array(
            'data' => isset($options['data']) ? $options['data']->getMyField() : 'my default value'
        )
    );
}

अन्यथा, myFieldहमेशा इकाई से मान प्राप्त करने के बजाय, डिफ़ॉल्ट मान पर सेट किया जाएगा।


संस्थाओं के बजाय सरणियों के मामले में, बस के $options['data']->getMyField()साथ बदलें$option['data']['myField']
ggg

3
मुझे लगता है कि ऐड / अपडेट दोनों के लिए यह सही तरीका है। लेकिन मैं सिम्फनी से नफरत करता हूं, यह बहुत जटिल है।
यार्को

यह एकमात्र अच्छा जवाब है। जब मैं डॉक्टर को देखता हूं तो मुझे अन्य उत्तर समझ में नहीं आते हैं। empty_data: यह विकल्प निर्धारित करता है कि जमा मूल्य खाली होने पर फ़ील्ड किस मूल्य पर लौटेगी। यह एक प्रारंभिक मान सेट नहीं करता है
विन्सेन्ट डेक्सक्स

19

आप अपने मॉडल वर्ग में संबंधित फ़ील्ड के लिए डिफ़ॉल्ट सेट कर सकते हैं (परिभाषा मैपिंग में या स्वयं मान सेट करें)।

इसके अलावा, FormBuilder आपको सेटडेटा () विधि के साथ प्रारंभिक मान सेट करने का मौका देता है । फॉर्म बिल्डर को आपके फॉर्म वर्ग के createForm () पद्धति में पास किया जाता है।

इसके अलावा, इस लिंक की जाँच करें: http://symfony.com/doc/current/book/forms.html#using-a-form-without-a-class


16

यदि आपका फॉर्म किसी इकाई के लिए बाध्य है, तो निर्माण विधि का उपयोग करके इकाई पर डिफ़ॉल्ट मान को निर्धारित करें:

public function __construct()
{
    $this->field = 'default value';
}

फिर भी, आपके फॉर्म में आपकी इकाई के लिए अतिरिक्त फ़ील्ड नहीं हो सकती हैं ( 'mapped' => false)। setData(...)इनके लिए उपयोग करें ।
डिजले

12

दृष्टिकोण 1 ( http://www.cranespud.com/blog/dead-simple-default-values-on-symfony2-forms/ )

बस अपनी इकाई में डिफ़ॉल्ट मूल्य निर्धारित करें, या तो चर घोषणा या निर्माणकर्ता में:

class Entity {
    private $color = '#0000FF';
    ...
}

या

class Entity {
    private $color;

    public function __construct(){
         $this->color = '#0000FF';
         ...
    }
    ...
}

उपरोक्त लिंक में एक टिप्पणी से 2 दृष्टिकोण, और यह भी दिमित्री के जवाब (स्वीकार नहीं किया गया) से सिम्फनी 2 में फॉर्म फ़ील्ड के लिए डिफ़ॉल्ट मान कैसे सेट करें?

दिमित्री के जवाब से अनुकूलित, फॉर्मब्युलर के साथ फ़ील्ड को जोड़ते समय डेटा विशेषता के लिए डिफ़ॉल्ट मान जोड़ें।

ध्यान दें कि यह मान लेता है कि संपत्ति तभी होगी और जब वह नया होगा, और मौजूदा, इकाई नहीं, तो उसका मूल्य शून्य होगा

public function buildForm(FormBuilderInterface $builder, array $options) {
    $builder->add('color', 'text', array(
            'label' => 'Color:',
            'data' => (isset($options['data']) && $options['data']->getColor() !== null) ? $options['data']->getColor() : '#0000FF'
        )
    );
}

पहला काम करता है (धन्यवाद!), दूसरा वाला (मेरे लिए) नहीं है: $ विकल्प ["डेटा" हमेशा सेट होता है, इसलिए डिफ़ॉल्ट मान का उपयोग कभी नहीं किया जाएगा। मैं अभी भी सोच रहा हूं कि क्या समाधान नंबर 1 अभीष्ट तरीका है। यह करने के लिए ...
herrjeh42

आप $ विकल्पों के बारे में सही हैं ['डेटा'] हमेशा सेट किया जा रहा है। यदि आप इकाई फ़ील्ड को इनिशियलाइज़ नहीं करते हैं, तो आप इसके स्थान पर नल के लिए परीक्षण कर सकते हैं, जैसे। 'data' => $ विकल्प ['data'] -> getColor ()! == null आदि ... यह मानता है कि रंग क्षेत्र के लिए एक वैध मूल्य नहीं है, इसलिए मौजूदा संस्थाओं के पास उस क्षेत्र के लिए शून्य मान नहीं होगा।
crysallus

आह, बेवकूफ मुझे: मैंने इसे 'isset ($ $ विकल्प [' डेटा '] -> getColor ()) के साथ आज़माया, मुझे "लेखन संदर्भों में इसका उपयोग करने की अनुमति नहीं है" के बारे में एक त्रुटि संदेश मिला और यह भूल गया कि मुझे करना है इसे अलग तरीके से जांचें :-)
herrjeh42

1
वास्तव में ऐसे अवसर प्रतीत होते हैं जब डेटा प्रविष्टि सेट नहीं होती है। दोनों के लिए परीक्षण करना सुरक्षित है (यानी $ विकल्प ['डेटा']) और& $ विकल्प ['डेटा'] -> getColor ()! == null ...
crysallus

9

आप डिफ़ॉल्ट मान सेट कर सकते हैं, उदाहरण के लिए, जैसे message:

$defaultData = array('message' => 'Type your message here');
$form = $this->createFormBuilder($defaultData)
    ->add('name', 'text')
    ->add('email', 'email')
    ->add('message', 'textarea')
    ->add('send', 'submit')
    ->getForm();

यदि आपका फॉर्म किसी एंटिटी के लिए मैप किया जाता है, तो आप इस तरह जा सकते हैं (जैसे डिफ़ॉल्ट उपयोगकर्ता नाम):

$user = new User();
$user->setUsername('John Doe');

$form = $this->createFormBuilder($user)
    ->add('username')
    ->getForm();

2
मैं इस पद्धति को पसंद करता हूं, खासकर जब से अधिकांश अनुप्रयोगों में आप एक फॉर्म बना रहे हैं और एक इकाई में गुजर रहे हैं जो फॉर्म से संबंधित है।
22

9

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

// src/Form/Extension/DefaultFormTypeExtension.php

class DefaultFormTypeExtension extends AbstractTypeExtension
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        if (null !== $options['default']) {
            $builder->addEventListener(
                FormEvents::PRE_SET_DATA,
                function (FormEvent $event) use ($options) {
                    if (null === $event->getData()) {
                        $event->setData($options['default']);
                    }
                }
            );
        }
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefault('default', null);
    }

    public function getExtendedType()
    {
        return FormType::class;
    }
}

और फॉर्म एक्सटेंशन को पंजीकृत करें:

app.form_type_extension:
    class: App\Form\Extension\DefaultFormTypeExtension
    tags:
        - { name: form.type_extension, extended_type: Symfony\Component\Form\Extension\Core\Type\FormType }

उसके बाद, हम defaultकिसी भी रूप में विकल्प का उपयोग कर सकते हैं :

$formBuilder->add('user', null, array('default' => $this->getUser()));
$formBuilder->add('foo', null, array('default' => 'bar'));

यह सबसे अच्छा जवाब (अप-टू-डेट) के रूप में स्वीकार किया जाना चाहिए था
केंद्रित

7

उपयोग न करें:

'data' => 'Default value'

यहां पढ़ें: https://symfony.com/doc/current/reference/forms/types/form.html#data

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


निम्न का उपयोग करें:

कहते हैं, इस उदाहरण के लिए, आपके पास एक इकाई फू है, और एक फ़ील्ड "सक्रिय" है (इस उदाहरण में चेकबॉक्स टाइप है, लेकिन प्रक्रिया हर दूसरे प्रकार के लिए समान है), जिसे आप डिफ़ॉल्ट रूप से जांचना चाहते हैं।

अपने FooFormType वर्ग में जोड़ें:

...
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
...
public function buildForm( FormBuilderInterface $builder, array $options )
{
    ...

    $builder->add('active', CheckboxType::class, array(
        'label' => 'Active',
    ));

    $builder->addEventListener(
        FormEvents::PRE_SET_DATA,
        function(FormEvent $event){                 
            $foo = $event->getData();
            // Set Active to true (checked) if form is "create new" ($foo->active = null)
            if(is_null($foo->getActive())) $foo->setActive(true);
        }
   );
}
public function configureOptions( OptionsResolver $resolver )
{
    $resolver->setDefaults(array(
        'data_class' => 'AppBundle:Foo',
    ));
}

यह यहाँ पैसा है !! उन्हें डिफ़ॉल्ट करने से पहले अपने मूल्यों की जांच करने के लिए फॉर्म इवेंट श्रोता का उपयोग करें। यह आपके प्रपत्रों में डिफ़ॉल्ट मानों के लिए स्वीकृत उत्तर होना चाहिए क्योंकि यह नए कार्यों और संपादन कार्यों दोनों के लिए काम करता है।
tlorens

इसे संभालने का यह सही तरीका है और यह स्वीकृत उत्तर होना चाहिए।

यदि आप एक सशर्त / टर्नरी का उपयोग करते हैं, तो आप शुरुआत में जो उल्लेख करते हैं वह सच नहीं है। इस तरह:'data' => $data['myfield'] ?? 'Default value'
xarlymg89

6
->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
     $form = $event->getForm(); 
     $data = $event->getData(); 

     if ($data == null) {
         $form->add('position', IntegerType::class, array('data' => 0));
     }

});

यह एक अच्छा उपाय है। $event->setData()फ़ील्ड पढ़ने के बजाय कॉल करने से यह और बेहतर हो सकता है।
user2268997

5

मेरा समाधान:

$defaultvalue = $options['data']->getMyField();
$builder->add('myField', 'number', array(
            'data' => !empty($defaultvalue) ? $options['data']->getMyField() : 0
        )) ;

4

बस इसलिए मैं समस्या को समझता हूं।

आप अपनी इकाई में डेटा के आधार पर फ़ॉर्म को बनाने के तरीके को समायोजित करना चाहते हैं। यदि इकाई बनाई जा रही है, तो कुछ डिफ़ॉल्ट मान का उपयोग करें। यदि इकाई मौजूदा है तो डेटाबेस मान का उपयोग करें।

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

इसके बजाय आप इसका अनुसरण कर सकते हैं: http://symfony.com/doc/current/cookbook/form/dynamic_form_od_odification.html

आप अपने प्रपत्र प्रकार पर एक श्रोता को लटकाते हैं और फिर आप अपनी इकाई की जांच कर सकते हैं और बिल्डर को समायोजित कर सकते हैं-> एक नई या मौजूदा इकाई के आधार पर बयान जोड़ सकते हैं। आपको अभी भी अपने डिफ़ॉल्ट मानों को निर्दिष्ट करने की आवश्यकता है, हालांकि आप उन्हें अपने श्रोता में कोड कर सकते हैं। या उन्हें फॉर्म के प्रकार में पास करें।

हालांकि बहुत काम की तरह लगता है। पहले से तय मानों के साथ इकाई को फॉर्म में पास करना बेहतर है।


4

यदि आप FormBuilderप्रपत्र को जेनरेट करने के लिए सिम्फनी २. sym में उपयोग कर रहे हैं, तो आप कंट्रोलर की createFormBuilderविधि के लिए प्रारंभिक डेटा भी पास कर सकते हैं

$values = array(
    'name' => "Bob"
);

$formBuilder = $this->createFormBuilder($values);
$formBuilder->add('name', 'text');

3

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

उदाहरण:

class LoadSurgeonPlanData implements FixtureInterface
{
    public function load(ObjectManager $manager)
    {
        $surgeonPlan = new SurgeonPlan();

        $surgeonPlan->setName('Free trial');
        $surgeonPlan->setPrice(0);
        $surgeonPlan->setDelayWorkHours(0);
        $surgeonPlan->setSlug('free');

        $manager->persist($surgeonPlan);
        $manager->flush();        
    }   
}

फिर भी, सिम्फनी प्रकार क्षेत्र में विकल्प डेटा है

उदाहरण

$builder->add('token', 'hidden', array(
    'data' => 'abcdef',
));

3

एक बहुत ही सरल तरीका है, आप यहाँ पर डिफॉल्ट सेट कर सकते हैं:

$defaults = array('sortby' => $sortby,'category' => $category,'page' => 1);

$form = $this->formfactory->createBuilder('form', $defaults)
->add('sortby','choice')
->add('category','choice')
->add('page','hidden')
->getForm();

3

यदि आप अपने निर्माण फ़ॉर्म में 'डेटा' सेट करते हैं, तो यह मान आपकी इकाई को संपादित करते समय संशोधित नहीं किया जाएगा।

मेरा समाधान है:

public function buildForm(FormBuilderInterface $builder, array $options) {
    // In my example, data is an associated array
    $data = $builder->getData();

    $builder->add('myfield', 'text', array(
     'label' => 'Field',
     'data' => array_key_exits('myfield', $data) ? $data['myfield'] : 'Default value',
    ));
}

अलविदा।


स्वीकृत उत्तर की तुलना में बहुत अधिक सहायक! आप PHP7 का उपयोग + आप यह भी neater कर सकते हैं के साथ हैं:'data' => $data['myfield'] ?? 'Default value',
Boykodev

आपके पास array_key_exists () फ़ंक्शन
डेडपूल

1

डिफ़ॉल्ट मान संगत इकाई को कॉन्फ़िगर करके सेट किए जाते हैं। इकाई को बांधने से पहले "# 0000FF" पर अपना रंग क्षेत्र सेट करने के लिए:

// controller action
$project = new Project();
$project->setColor('#0000FF');
$form = $this->createForm(new ProjectType(), $project);

यह दृष्टिकोण काम करता है, लेकिन इसका नुकसान यह है कि आपको हर बार फॉर्म क्लास का उपयोग करते समय यह करना पड़ता है और यह बहुत ही क्रियात्मक है (बहुत सारे सेट स्टेटमेंट)। के रूप में फार्म घटक बहुत सुंदर है, वहाँ कुछ और होना चाहिए। लेकिन वैसे भी धन्यवाद :-)
herrjeh42

@ jamie0726 मेरी राय में, जब भी यह नया हो या प्राप्त हो, तो ऑब्जेक्ट के मूल्यों को सेट करने के लिए नियंत्रक जिम्मेदारी है। इस तरह आपके पास विभिन्न स्थितियों के साथ विभिन्न स्थितियों में उपयोग किए जा रहे फॉर्म हो सकते हैं, उदाहरण के लिए, नया रंग बदल सकता है क्योंकि उपयोगकर्ता की प्रबंधक या सुपरमैनर भूमिका होती है, और चूंकि यह एक व्यावसायिक तर्क है, इसलिए इसे नियंत्रित किया जाना चाहिए नियंत्रक या एक सेवा, प्रपत्र नहीं। इसलिए जैसा कि सेराड ने कहा, मैं इस समाधान को भी पसंद करता हूं। आप हमेशा उन डिफ़ॉल्ट मानों को सेट करने के लिए एक सेवा बना सकते हैं और नियंत्रक उस सेवा का उपयोग करते हुए इसे DRY रखते हैं।
सौम्यम

यह वह समाधान है जिसे मैंने चुना है, क्योंकि यह मेरे विचार के तर्क को फिट करता है। ईडीआईटी और क्रिएट फॉर्म बनाने के लिए उत्पन्न नियंत्रकों के अलग-अलग तरीके हैं, और वे हैं जहाँ मैं नई इकाई के लिए डिफ़ॉल्ट / प्रारंभिक डेटा सेट करता हूं।
अलुमी

1

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

एक उदाहरण:

public function getMyField() {
    if (is_null($this->MyField)) {
        $this->setMyField('my default value');
    }
    return $this->MyField;
}

1

मैं आमतौर पर अपनी इकाई में विशिष्ट क्षेत्र के लिए डिफ़ॉल्ट मान सेट करता हूं:

/**
 * @var int
 * @ORM\Column(type="integer", nullable=true)
 */
protected $development_time = 0;

यह नए रिकॉर्ड के लिए काम करेगा या यदि केवल मौजूदा अपडेट कर रहा है।


यह तब प्रतीत नहीं होता है जब 'empty_data'इकाई पर कंस्ट्रक्टर परम को अनुमति देने के लिए कॉलबैक का उपयोग किया जाता है।
एनडीएम

1

जैसा कि ब्रायन ने पूछा:

खाली_डेटा केवल फ़ील्ड को 1 पर सेट करने के लिए प्रकट होता है जब इसे बिना मूल्य के साथ सबमिट किया जाता है। जब कोई मूल्य मौजूद नहीं है तो आप इनपुट में 1 प्रदर्शित करने के लिए डिफ़ॉल्ट के रूप में क्या चाहते हैं?

आप के साथ डिफ़ॉल्ट मान सेट कर सकते हैं empty_value

$builder->add('myField', 'number', ['empty_value' => 'Default value'])

0

मैं attr में मूल्य जोड़कर इस समस्या को हल किया :

->add('projectDeliveringInDays', null, [
    'attr' => [
          'min'=>'1',
          'value'=>'1'
          ]
     ])
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.