symfony2表单抽象类型发送选项

时间:2013-04-30 10:04:31

标签: forms symfony options

我正在symfony 2.1.9下做一些表格 由于有用的原因,我已经完成了一个FUser类,它从我的用户实体扩展而来。 我已经完成了一个UserType类,因为它能够重用我的表单。

我的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 doc上找到我的答案。 我想从我的控制器向此UserType发送选项。

例如,在某些情况下,我不想添加“tel”和“adresse”输入。 或者有时候,我希望这个输入是必需的,另外,我想要不需要相同的输入。

我该怎么做?

谢谢,

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您需要动态修改表单。

看看这里:How to Dynamically Modify Forms Using Form Events

<强>更新

要将选项传递给表单,您可以通过以下方式修改表单:

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

希望这有帮助