Php Sonata媒体包自定义提供程序未映射请求数据

Php Sonata媒体包自定义提供程序未映射请求数据,php,symfony,sonata,sonata-media-bundle,Php,Symfony,Sonata,Sonata Media Bundle,我有一个定制的ImageProvider,可用于索纳塔的媒体包 不幸的是,当我单击“提交”时,表单字段被放置在extra_data中,而不是表单对象中,导致错误消息此表单不应包含额外字段。 我的buildCreateForm函数如下所示: 公共函数buildCreateForm(FormMapper$FormMapper) { $formMapper ->使用('Media Details',['class'=>'panel Media Details'])) ->添加('binaryConte

我有一个定制的
ImageProvider
,可用于索纳塔的媒体包

不幸的是,当我单击“提交”时,表单字段被放置在
extra_data
中,而不是表单对象中,导致错误消息
此表单不应包含额外字段。

我的
buildCreateForm
函数如下所示:

公共函数buildCreateForm(FormMapper$FormMapper)
{
$formMapper
->使用('Media Details',['class'=>'panel Media Details']))
->添加('binaryContent','file'[
“标签”=>“上载图像文件”,
“帮助”=>AdminUtils::helpPopover(
'上载的图像文件应为以下类型之一:png、gif、jpg、jpeg',
['placement'=>'right']
),
'约束'=>[
新的NotBlank(),
新的NotNull(),
新文件([
'mimeTypes'=>['image/png'、'image/gif'、'image/jpeg'、'image/pjpeg'],
'mimeTypesMessage'=>'此文件不是图像(应为PNG、GIF或JPEG,但为{type}}),
])
],
])
->添加('名称','文本'[
“标签”=>“标题”,
“帮助”=>AdminUtils::helpPopover(
'图像的标题。将图像嵌入文本或作为多媒体资料的一部分呈现时,它将显示为图像标题。它还将显示为单个媒体项目页面和搜索结果中的标题。',
['placement'=>'right']
),
“必需”=>true,
])
->添加('alt_标记','text'[
“标签”=>“可选文本”,
“帮助”=>AdminUtils::helpPopover(
“屏幕阅读器、搜索引擎以及无法加载图像时将使用的文本。如果未提供,将使用标题。”,
['placement'=>'right']
),
“映射”=>false,
“必需”=>true,
])
->添加('description',CKEditorType::class[
“help'=>AdminUtils::helpPopover('说明将显示在媒体项目页面、搜索结果中,并且可能在图像单独或作为媒体库的一部分显示在弹出窗口(灯箱)中时显示。',[“placement'=>“right']),
“必需”=>false,
])
->完()
->带('Notes',['class'=>'panler Notes']))
->添加('notes',CKEditorType::class[
“标签”=>“注释”,
“help'=>AdminUtils::helpPopover('用于管理目的的注释;这些注释仅对编辑器可见,并且永远不会显示在前端站点上'),
“必需”=>false,
])
->完()
;
}
我的
$mediaAdmin->configureFormFields()
如下所示:

受保护的函数配置FormFields(FormMapper$FormMapper)
{
$formMapper
->使用('Publishing',['class'=>'panler Publishing']))
->添加('enabled',null[
“标签”=>“已发布”,
“help'=>AdminUtils::helpPopover('未发布的媒体项将不会显示在前端站点的任何位置,即使它们附加到内容或嵌入到文本中。它们仍将在后端CMS站点中可见'),
“必需”=>false,
])
->完()
;
$media=$this->getSubject();
如果(!$media){
$media=$this->getNewInstance();
}
如果(!$media | |!$media->getProviderName()){
返回;
}
$formMapper->getFormBuilder()->addModelTransformer(
新ProviderDataTransformer($this->pool,$this->getClass()),true
);
$provider=$this->pool->getProvider($media->getProviderName());
如果($media->getId()){
$provider->buildEditForm($formMapper);
}否则{
$provider->buildCreateForm($formMapper);
}
//在表单底部放置所有隐藏字段,以便它们不会
//break:使用的第一个子css规则。另外,将它们包装成一个封闭的形式
//组,这样它就不会中断已加载的窗体组
//在子管理类中定义的buildEditForms或configureFormFields。
$formMapper
->使用('Provider',['class'=>'hidden Provider']))
->添加('providerName','hidden')
->完()
;
}
验证失败后表单对象的调试为:


我正在覆盖
sonata.media.provider.iamge
,因此它被显示为提供者。

对于那些在这里找到方法的人

首先,要通过额外字段冲突

公共函数getFormBuilder()
{
$this->formOptions['allow\u extra\u fields']=true;
返回父级::getFormBuilder();
}
下一步手动映射字段

public function prePersist($media)
{
//这有点混乱,但是获取额外的_数据数组并手动映射它
$extraData=$this->getForm()->getExtraData();
$media->setProviderName($extraData['providerName']);
$media->setName($extraData['name']);
$media->setDescription($extraData['description']);
$media->setBinaryContent($extraData['binaryContent']);
$media->setNotes($extraData['notes']);
家长:预科生($media);
}