【问题标题】:symfony2 form abstract type send optionssymfony2 表单抽象类型发送选项
【发布时间】:2013-04-30 10:04:31
【问题描述】:

我在 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。

例如,在某些情况下,我不想添加“电话”和“地址”输入。 或者有时,我希望这个输入是必需的,在其他情况下,我希望不需要相同的输入。

我该怎么做?

谢谢你,

【问题讨论】:

    标签: forms symfony options


    【解决方案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'));
    

    希望对你有帮助

    【讨论】:

    • 不是动态的。我希望表单根据提供给控制器的参数而改变。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-09
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    相关资源
    最近更新 更多