2016-11-24 90 views
1

我有Formtype。在这Formtype我得到了options-在buildForm函数中键入additionalName。我想将此值添加到FormType名称(在Symfony3 BlockPrefix中)。但我怎么设置呢?Symfony3:set Custom FormType“name”/“blockPrefix”

class AdultType extends AbstractType 
{  
    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $additionalName = $options['additionalName']; 

     $builder 
      ->add('account', TextType::class,array(
       'label' => 'account', 
       'required' => false, 
      )) 

     ; 
    } 

    /** 
    * @param OptionsResolver $resolver 
    */ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'My\Bundle\WebsiteBundle\Model\Adult', 
      'csrf_protection' => true, 
      'cascade_validation' => true, 
      'name' => "" 
     )); 
    } 

    /** 
    * @return string 
    */ 
    public function getBlockPrefix() 
    { 
     //Here I need the $options['additionalName'] 
     return 'my_bundle_websitebundle_adult_'.$options['additionalName']; 
    } 

我想媒体链接设置私有变量$additionalName;在类的顶部,将其设置在buildForm功能,并获得在getBlockPrefix功能访问它与$this->additionalName。但getBlockPrefix中的值为空。所以我认为getBlockPrefix被称为buildForm之前。

类型是beeing从另一种形式叫:

$builder->add('adult', AdultType::class, array(
         'additionalName' => $options['name'] 
        )); 

感谢您的帮助!

+2

您想通过动态更改块前缀来解决的实际用例是什么? – xabbuh

回答

-1

试试这个:

class AdultType extends AbstractType 
{ 
    protected $_additionalName; 

    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $this->_additionalName = $options['additionalName']; 

     $builder 
      ->add('account', TextType::class,array(
       'label' => 'account', 
       'required' => false, 
      )) 

     ; 
    } 

    /** 
    * @param OptionsResolver $resolver 
    */ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'My\Bundle\WebsiteBundle\Model\Adult', 
      'csrf_protection' => true, 
      'cascade_validation' => true, 
      'name' => "" 
     )); 
    } 

    /** 
    * @return string 
    */ 
    public function getBlockPrefix() 
    { 
     //Here I need the $options['additionalName'] 
     return 'my_bundle_websitebundle_adult_'.$this->_additionalName; 
    } 

    public function getName(){ 
     return $this->getBlockPrefix(); 
    } 
} 

getBlockPrefix心不是知道$选项[ 'additionalName'],因此,你需要一个类属性。和另外你可以用的getName()

+0

Doesn#t工作,变量“$ this - > _ additionalName”在“getBlockPrefix”中调用它时为空。 – Zwen2012

+0

你能说明这个类型是如何被调用的吗? – Rawburner

+0

请参阅我编辑的代码请 – Zwen2012

0

尝试,我建议你到一个属性添加到您的FormType这样的:

class AdultType extends AbstractType 
{  
    protected $_additionalName; 

    public function __construct($additionalName= ''){ 
     $this->_additionalName = $additionalName; 
    } 


    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $additionalName = $options['additionalName']; 

     $builder 
      ->add('account', TextType::class,array(
       'label' => 'account', 
       'required' => false, 
      )) 

     ; 
    } 

    /** 
    * @param OptionsResolver $resolver 
    */ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'My\Bundle\WebsiteBundle\Model\Adult', 
      'csrf_protection' => true, 
      'cascade_validation' => true, 
      'name' => "" 
     )); 
    } 

    /* 
    * @return string 
    */ 
    public function getBlockPrefix() 
    { 
     //Here I need the $options['additionalName'] 
     return 'my_bundle_websitebundle_adult_'.$this->_additionalName; 
    } 

编辑:

Arf的。我认为这是唯一可用对于Symfony 2之前(2.8)..