2013-04-30 21 views
0

我正在做一些symfony下的表格2.1.9 由於有用的原因,我做了一個FUser類,它從我的用戶實體擴展而來。 我已經完成了一個UserType類,可以重用我的表單。symfony2形式抽象類型發送選項

我的UserType類看起來是這樣的:

<?php 
namespace CD\BoutiqueBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 

class UserType extends AbstractType 
{ 
public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('nom', 'text') 
     ->add('prenom', 'text') 
     ->add('mail', 'text') 
     ->add('fb_id','hidden',array('data'=>'null')) 
     ->add('pass', 'repeated', 
     array('type' => 'password', 'invalid_message' => 'The password fields must match.', 
     'first_options' => array('label' => 'Mot de passe'), 
     'second_options' => array('label' => 'Confirmer le mot de passe'))) 
     ->add('tel', 'text', array('required' => false)) 
     ->add('adresse', 'text') 
     ->add('code_postal', 'text') 
     ->add('ville', 'text') 
     ->add('tel', 'text') 
     ->add('date_naissance', 'birthday', array('widget' => 'choice', 'years' => range(1933,2013,1), 'months' => range(1,12,1), 'days' => range(1,31,1))); 
} 

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => 'CD\ConfigBundle\Entity\User' 
    )); 
} 
public function getDefaultOptions(array $options) 
{ 
    return array(
     'data_class' => 'CD\ConfigBundle\Entity\User', 
    ); 
} 

public function getName() 
{ 
    return 'usertype'; 
} 
} 

我想要做的是很簡單,但我沒有找到我的答案既不是谷歌,既不在symfony的文檔,也不在這網站。 我想從我的控制器發送選項到這個UserType。

例如,在某些情況下,我不想添加「tel」和「adresse」輸入。 或者有時,我希望這個輸入是必需的,而在其他情況下,我希望輸入不是必需的。

我該怎麼做?

謝謝

回答

1

如果我理解正確的話,你需要動態地修改您的形式。

到這裏看看:How to Dynamically Modify Forms Using Form Events

UPDATE

選項傳遞給你的表格,您可以修改形式是這樣的:

<?php 
namespace CD\BoutiqueBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 

class UserType extends AbstractType 
{ 
public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $myCustomVar = $options['foo']; 

    $builder 
    ->add('nom', 'text') 
    ->add('prenom', 'text') 
    ->add('mail', 'text') 
    ->add('fb_id','hidden',array('data'=>'null')) 
    ->add('pass', 'repeated', 
    array('type' => 'password', 'invalid_message' => 'The password fields must match.', 
    'first_options' => array('label' => 'Mot de passe'), 
    'second_options' => array('label' => 'Confirmer le mot de passe'))) 
    ->add('tel', 'text', array('required' => false)) 
    ->add('adresse', 'text') 
    ->add('code_postal', 'text') 
    ->add('ville', 'text') 
    ->add('tel', 'text') 
    ->add('date_naissance', 'birthday', array('widget' => 'choice', 'years' => range(1933,2013,1), 'months' => range(1,12,1), 'days' => range(1,31,1))); 
} 

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
    'data_class' => 'CD\ConfigBundle\Entity\User', 
    'foo' => 'bar' 
)); 
} 

public function getName() 
{ 
    return 'usertype'; 
} 
} 

正如你可以setDefaultOptions方法看你必須聲明自定義選項。 然後在你的控制器,你可以實例化的形式是這樣的:

$myForm = $this->createForm(new UserType(), $entity, array('foo' => 'baz')); 

希望這有助於

+0

不dinamically。我希望表單在給予控制器參數的功能上發生變化。 – vekah 2013-05-03 13:06:48