Symfony的FormType:如何在形式类型的文件拿到的样机
问题描述:
在symfony的表单类型我有一个FormType
名为Symfony的FormType:如何在形式类型的文件拿到的样机
- KeywordType
- 消息类型
- ReplyTextMessage
- ReplyImageMessage
和里面的代码看起来像这样
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,
]),
)]
问题是
如何获得的ReplyTextMessageType
和ReplyImageMessageType
原型内MessageType
,因为我想获得的所有ReplyMessageType在form_theme
如果你不明白我的问题,我会在这里回答任何小姐明白。
谢谢你的提前。
答
问题解决!
您必须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);
}
}
不清楚的问题!请尝试修改您的,删除不必要的部分,并大胆您的要求。 – Trix
@Trix啊好的只是片刻 –
@Trix问题已更新。 –