2015-04-23 13 views
12

Also bin ich ziemlich neu bei Symfony und ich versuche, den Controller leicht unterschiedliche Formen basierend auf Controller-Aktionen erstellen zu lassen. Gerade jetzt, ich habe dieseSymfony2: Optionen an buildForm übergeben

//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() 
    )); 
} 

Und

//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') 
    ; 
} 

Ich möchte eine Option aus dem Controller in buildForm passieren, so dass ich etwas tun kann:

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') 
    ; 
} 

Wie mache ich das? Ich habe das Symfony doc und ähnliche Fragen hier gelesen, aber für meinen Fall scheint nichts passendes zu sein. Ich weiß es nicht.

Antwort

15

Es ist nicht notwendig, einen zusätzlichen Parameter zu erstellen, verwenden Sie einfach options, um benutzerdefinierte Daten zu übergeben. Im folgenden Beispiel habe ich das Attribut age als obligatorisch festgelegt. Sie könnten es optional haben oder den Standardwert angeben. Lesen Sie mehr über 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' 
     )); 

    } 
} 

erstellen:

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

Works schön, danke – Afunakwa

+0

@ b.b3rn4rd die beste Antwort! Klar, einfach, effektiv. In meinem Fall funktioniert es auch gut –

+2

Beachten Sie, dass 'setDefaultOptions' zugunsten von' configureOptions' veraltet ist. http://symfony.com/blog/new-in-symfony-2-7-form-and-validator-updates#deprecated-setdefaultoptions-in-favor-of-configureoptions – DarksteelPenguin

Verwandte Themen