2015-04-23 1 views
12

Bu yüzden Symfony'de oldukça yeniyim ve denetleyicinin denetleyici eylemlerine bağlı olarak biraz farklı formlar oluşturmasını sağlamaya çalışıyorum. Şu anda, ben buSymfony2: Geçiş seçenekleri buildForm

//in Controller 

public function addLocationEntryAction(Request $request) 
{ 
    $entry = new Entry(); 
    $form = $this->get('form.factory')->create(new EntryType('addLocation'), $entry); 

    return $this->render('OOTNBlogBundle:Blog:addEntry.html.twig', array(
     'form' => $form->createView() 
    )); 
} 

public function addArticleEntryAction(Request $request) 
{ 
    $entry = new Entry(); 
    $form = $this->get('form.factory')->create(new EntryType('addArticle'), $entry); 

    return $this->render('OOTNBlogBundle:Blog:addEntry.html.twig', array(
     'form' => $form->createView() 
    )); 
} 

Ve

//in EntryType 

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

    $builder 
     ->add('title',  'text') 
     ->add('continent', 'text', array('required' => false)) 
     ->add('country', 'text', array('required' => false)) 
     ->add('category', 'text', array('required' => false)) 
     ->add('author',  'hidden') 
     ->add('type',  'hidden') 
     ->add('text',  'textarea') 
     ->add('post',  'submit') 
    ; 
} 

ben böyle bir şey yapmak, böylece, buildForm yılında denetleyici bir seçenek geçmek istiyorum:

public function buildForm(FormBuilderInterface $builder, array $options, $option) 
{ 
    $builder 
     ->add('title',  'text') 
    ; 

    if($option == 'addLocation') 
    { 
     $builder 
      ->add('continent', 'text', array('required' => false)) 
      ->add('country', 'text', array('required' => false)) 
     ; 
    } 
    elseif($option == 'addArticle') 
    { 
     $builder 
      ->add('category', 'text', array('required' => false)) 
     ; 
    } 

    $builder 
     ->add('author',  'hidden') 
     ->add('type',  'hidden') 
     ->add('text',  'textarea') 
     ->add('post',  'submit') 
    ; 
} 

Bunu nasıl yaparım? Symfony belgesini ve benzer soruları burada kontrol ettim ama hiçbir şey benim durumum için uygun değil. Bilmiyorum.

cevap

15

Ek bir param oluşturmaya gerek yoktur, sadece özel verileri iletmek için options kullanın. Aşağıdaki örnekte, age özniteliğini zorunlu kıldım, isteğe bağlı olabilir veya varsayılan değeri belirtebilirsiniz. daha hakkında OptionsResolverhere

class ExampleType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     var_dump($options['age']); 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setRequired(array(
      'age' 
     )); 

    } 
} 

oluştur Oku:

$form = $this->get('form.factory')->create(new ExampleType(), $entry, array(
    'age' => 13 
)); 
+0

Çalışır güzelce, en iyi cevap b.b3rn4rd Eğer – Afunakwa

+0

@ teşekkür ederim! Açık, basit, etkili. Benim durumumda da iyi çalışıyor –

+2

'setDefaultOptions'' configureOptions' lehine kabul edilmediğini unutmayın. http://symfony.com/blog/new-in-symfony-2-7-form-and-validator-updates#deprecated-setdefaultoptions-in-favor-of-configureoptions – DarksteelPenguin