0

我在 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”输入。或者有时,我希望这个输入是必需的,在其他情况下,我希望不需要相同的输入。

我怎样才能做到这一点 ?

谢谢,

4

1 回答 1

1

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

看看这里:如何使用表单事件动态修改表单

更新

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

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

希望这可以帮助

于 2013-04-30T14:35:00.890 回答