2012-07-23 13 views
17

का फील्ड विकल्प बदलें मूल रूप से मेरा प्रश्न है, क्या मूल रूप से एम्बेडेड के किसी फ़ील्ड का विकल्प बदलना संभव है?सिम्फनी 2 एम्बेडेड फॉर्म

समस्या को समझाने के लिए इस पर विचार करें; मैं इस तरह एक माता पिता के रूप प्रकार वर्ग है:

class FruitFormType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('name', 'text') 
      ->add('apple', new AppleFormType()) 
     ; 
    } 

और एक बच्चे प्रपत्र प्रकार कक्षा एक अलग बंडल में है कि और मैं संपादित करने के लिए नहीं करना पसंद करेंगे, इस तरह:

class AppleFormType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('name', 'text') 
      ->add('qty', 'integer', array('label' => 'rubbish label') 
     ; 
    } 

और मैं चाहता हूँ qty के लेबल को किसी अन्य चीज़ में बदलने के लिए, लेकिन मैं इसे केवल FruitForm में करना चाहता हूं, हर जगह नहीं जहां AppleForm का उपयोग किया जाता है। मैं की तरह कुछ करने के लिए सक्षम होने के लिए आशा व्यक्त की थी:

class FruitFormType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('name', 'text') 
      ->add('apple', new AppleFormType(), array('qty' => array('label' => 'better label'))) 
     ; 
    } 

या:

class FruitFormType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('name', 'text') 
      ->add('apple', new AppleFormType()) 
     ; 

     $builder->get('apple')->get('qty')->setOption('label', 'better label'); 
    } 

लेकिन न तो इनमें से (और अन्य प्रयास के एक नंबर) सब मुझे विफल रहे हैं। setOption विधि मौजूद नहीं है जो मैं देख सकता हूं।

क्या किसी को ऐसा करने का तरीका पता है?

धन्यवाद

उत्तर

35

मैं भी विकल्प बदलना चाहते हैं, से एक मौजूदा क्षेत्र के लिए स्पष्ट "लेबल बदल" मामले FOSUserBundle। मुझे पता है कि मैं इसे टवीग में या अनुवाद के साथ कर सकता हूं।

@redbirdo ने मुझे सही दिशा में इंगित किया "ऐसा लगता है कि एक ही नाम के साथ एक फ़ील्ड जोड़ना इसे बदल देगा"।

$field = $builder->get('username');   // get the field 
$options = $field->getOptions();   // get the options 
$type = $field->getType()->getName();  // get the name of the type 
$options['label'] = "Login Name";   // change the label 
$builder->add('username', $type, $options); // replace the field 
+7

$ विकल्प एस = $ फ़ील्ड-> getOptions(); मेरे लिए काम नहीं किया, हालांकि, $ फ़ील्ड-> getConfig() -> getOptions() ने चाल की है! एक बार फिर धन्यवाद ! – Steven

+0

मेरे लिए काम नहीं करता –

+0

मेरे लिए ठीक काम किया। @Steven आपको '$ form-> get (" field ") -> getOptions()', या उस नाम वाला फ़ील्ड अभी तक मौजूद नहीं है। – Adambean

8

कुछ इस तरह का प्रयास करें:

class AppleFormType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('name', 'text') 
      ->add('qty', 'integer', array('label' => $options['qtyLabel']) 
     ; 
    } 

    public function getDefaultOptions() 
    { 
     return array(
      'qtyLabel' = 'rubbish label'; 
     ); 
    } 
} 

और:

class FruitFormType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('name', 'text') 
      ->add('apple', new AppleFormType(), array('qtyLabel' => 'better label')) 
     ; 
    } 
} 
+0

उत्तर के लिए धन्यवाद, मुझे पता है कि यह एक विकल्प है, लेकिन जैसा कि 'AppleFormType' एक विक्रेता-बंडल में है, मुझे इसे काम करने के लिए ओवरराइड या प्रतिस्थापित करना होगा। मैं ऐसे समाधान की उम्मीद कर रहा था जो पूरी तरह से 'फ्रूटफॉर्म टाइप' वर्ग में किया जा सके। – lopsided

+1

क्षमा करें, मैंने देखा है कि आप इसे संपादित नहीं करना चाहते हैं लेकिन माना जाता है कि आप इसे ओवरराइड करने के साथ ठीक रहेगा। $ Builder-> get ('apple') -> जोड़ें ('qty', 'integer', array ('label' => 'बेहतर लेबल') एक विकल्प होगा? फॉर्मबिल्डर के (2.0) दस्तावेज़ को पढ़ने से ऐसा प्रतीत होता है कि एक ही नाम के साथ एक फ़ील्ड जोड़ना इसे प्रतिस्थापित करेगा लेकिन स्पष्ट रूप से आपको केवल लेबल के लिए सभी विकल्पों को फिर से परिभाषित करना होगा ... – redbirdo

+0

संपादित किया गया - मुझे फॉर्मबिल्डर इंटरफेस के लिए एपीआई मिला। इसे प्राप्त/सेट एट्रिब्यूट()। क्या आपने $ builder-> get ('apple') -> get ('qty') -> setAttribute ('लेबल', 'बेहतर लेबल') का उपयोग करने का प्रयास किया है ;? – redbirdo

3

मैं एक मामले में जहां मैं प्रपत्र बिल्डर कोड का उपयोग नहीं कर सकते हैं, लेकिन एक 'required' => true जोड़ने के लिए एक क्षेत्र विकल्प ओवरराइड करने के लिए है में हूँ: यहाँ समाधान है।

@ पीटर-वूस्टर और @ thedamnedrhino का विस्तार गिटूब (https://github.com/symfony/symfony/issues/11188) पर एक सिम्फनी मुद्दे के उत्तर में, मैं कोड के इस टुकड़े के साथ समाप्त होता हूं।

$field = $form->get('combinaisons'); 
$options = $field->getConfig()->getOptions(); 
$type = $field->getConfig()->getType()->getName(); 
$options['required'] = true; 
unset($options['em']); 
$form->add('combinaisons', $type, $options); 

इस के साथ सिम्फोनी/सिम्फोनी ठीक काम करता है: 2.3.21, सिद्धांत/सिद्धांत-बंडल: 1.2.0 और सिद्धांत/ORM: 2.3.6

0

दृश्य को संशोधित करना अक्सर एक बहुत इस के लिए आसान है परिवर्तन की तरह।

$view->vars['label'] = 'New label'; 

आमतौर पर आपके विचार एक माता पिता के रूप हो जाएगा, तो यह ऐसा दिख सकता है - से 'तिथि'> 'प्रकाशन दिनांक' परिवर्तन:

$view = $form->createView(...); 
$view->children['date']->vars['label'] = 'Publication date'; 

आपके प्रपत्र अपना अलग प्रकार में समझाया जाता है तो आप finishView फ़ंक्शन का उपयोग कर सकते हैं:

public function finishView(FormView $view, FormInterface $form, array $options) 
{ 
    $view->children['date']->vars['label'] = 'Publication date'; 
} 

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

+0

ध्यान दें कि यह परिवर्तन केवल 'वर्तमान' दृश्य में लागू होगा। यह उस फ़ॉर्म को नहीं बदलता है जिससे दृश्य बनाया गया था। लेकिन मुझे उम्मीद है कि यह समाधान कई उपयोग मामलों के अनुरूप होगा। – Henry

8

धन्यवाद @ पीटर वूस्टर।

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder->add('my_field', ChoiceType::class, [ 
     // Some options here... 
     'multiple' => false, 
    ]); 
} 

और एक और कस्टम प्रपत्र प्रकार मैं की जरूरत में विस्तार प्रकार: मैं एक कस्टम प्रपत्र प्रकार तो जैसे क्षेत्रों को जोड़ने है

: Symfony 3.0 में, मैं कुछ कुछ अलग इस्तेमाल किया था ऊपर और कुछ विकल्प बदलें:

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    parent::buildForm($builder, $options); 

    $myField = $builder->get('my_field'); 
    $fieldOptions = $myField->getOptions(); 
    // Retrieve the FormType. That is the part that is different. 
    $fieldType = get_class($myField->getType()->getInnerType()); 
    $fieldOptions['multiple'] = true; 
    // I can obviously put the name 'my_field' directly here 
    $builder->add($myField->getName(), $fieldType, $fieldOptions); 
} 

उपरोक्त उत्तरों के लिए धन्यवाद, मुझे उम्मीद है कि मेरी मदद करता है!

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