2016-11-24 4 views
1

У меня есть Formtype. В этом Formtype я перехожу через options -Array в функцию 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']; 
    } 

Я попытался Allready установить переменную личное $additionalName; на верхней части класса, установите его в функции buildForm и получить к нему доступ с $this->additionalName в getBlockPrefix функции. Но значение в getBlockPrefix пуст. Я думаю, что getBlockPrefix вызывается перед buildForm.

Тип является неоспоримым вызывается из другой формы:

$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

Не работает # t, переменная «$ this -> _ anotherName» равна null при вызове в «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; 
    } 

EDIT:

Арф .. Я думаю, что это доступно только для Symfony 2 до (2.8).

 Смежные вопросы

  • Нет связанных вопросов^_^