2017-10-20 42 views
0

在symfony的表单类型我有一个FormType名为Symfony的FormType:如何在形式类型的文件拿到的样机

  • KeywordType
  • 消息类型
  • ReplyTextMessage
  • ReplyImageMes​​sage

和里面的代码看起来像这样

KeywordType

$builder 
    ->add('messages', CollectionType::class, [ 
     'entry_type' => MessageType::class, 
     'prototype' => true, 
     'allow_add' => true, 
     'allow_delete' => true, 
     'by_reference' => false, 
    )] 

消息类型

$builder 
    ->add('type', ChoiceType::class, [ 
     'choices' => array_flip([ 
     'text' => ReplyMessageInterface::TEXT, 
     'image' => ReplyMessageInterface::IMAGE, 
     ]), 
    )] 

问题是

如何获得的ReplyTextMessageTypeReplyImageMessageType原型内MessageType

,因为我想获得的所有ReplyMessageTypeform_theme

如果你不明白我的问题,我会在这里回答任何小姐明白。

谢谢你的提前。

+0

不清楚的问题!请尝试修改您的,删除不必要的部分,并大胆您的要求。 – Trix

+0

@Trix啊好的只是片刻 –

+0

@Trix问题已更新。 –

回答

0

问题解决!

您必须getForm()通过使用$builder->create()功能,然后设置$ builder->使用$builder->setAttribute()

而且在功能buildView()你只能使用$view->vars['nameAttribute']属性创建()为array,并设置属性和不喜欢我的代码,以便您form_theme将有原型

的更多信息,请看看我的代码如下

/** 
* @param FormBuilderInterface $builder 
* @param array $options 
*/ 
public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('type', ChoiceType::class, [ 
      'required' => true, 
      'choices' => array_flip([ 
       'text' => self::TEXT_VALUE, 
       'sticker' => self::STICKER_VALUE, 
       'image' => self::IMAGE_VALUE, 
      ]), 
     ]) 
    ; 

    $prototypes = []; 

    $replyMessageTypes = [ 
     self::TEXT_VALUE => ReplyTextMessageType::class, 
     self::STICKER_VALUE => ReplyStickerMessageType::class, 
     self::IMAGE_VALUE => ReplyImageMessageType::class 
    ]; 

    foreach ($replyMessageTypes as $name => $type) { 
     $formBuilder = $builder->create(
      $name, $type, [] 
     ); 

     $prototypes[$name] = $formBuilder->getForm(); 
    } 

    $builder->setAttribute('replyMessageTypes', $prototypes); 
} 

/** 
* @param FormView $view 
* @param FormInterface $form 
* @param array $options 
* 
* @return mixed 
*/ 
public function buildView(FormView $view, FormInterface $form, array $options) 
{ 
    parent::buildView($view, $form, $options); 

    $view->vars['replyMessageTypes'] = []; 

    foreach ($form->getConfig()->getAttribute('replyMessageTypes') as $type => $prototype) { 
     /** @var FormInterface $prototype */ 
     $view->vars['replyMessageTypes'][$type] = $prototype->createView($view); 
    } 
}