symfony - 奏鸣曲媒体包修改 MediaType
问题描述
我将 symfony 3.4 与奏鸣曲媒体包一起使用。在表单中使用 MediaType 可以正常工作,如下所示:
$this->builder->->add('document', MediaType::class,
['label' => 'Document',
'provider' => 'sonata.media.provider.file',
'context' => 'default']) ;
现在我想修改 MediaType 生成的字段。
我刚刚将 Twig Template \vendor\sonata-project\media-bundle\src\Resources\views\Form\media_widgets.html.twig 复制到我的项目(\AppBundle\SonataMediaBundle\views\Form),现在我可以修改布局。这么久,一切都很好。
模板最终使用{{ block('form_widget') }}写出上传按钮和复选框以删除上传的文件,包括标签。这是在buildForm 方法的\sonata-project\media-bundle\src\Forms\Type\MediaType.php类中完成的。
现在我想修改这个 buildForm 方法。修改供应商包中的类不是一个好习惯,所以我想创建一个新类来扩展 MediaType 类并覆盖 buildForm 方法,如下所示:
namespace AppBundle\Form\SonataMediaBundle ;
class MyMediaType extends \Sonata\MediaBundle\Form\Type\MediaType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
... copy code from original MediaType class and modify it after my needs ...
... e.g. just remove the unlink checkbox ...
}
}
我收到一条错误消息 无法自动连接服务“AppBundle\Form\SonataMediaBundle\EwMediaType”:方法“Sonata\MediaBundle\Form\Type\MediaType::__construct()”的参数“$pool”引用类“Sonata\MediaBundle\Provider\ Pool”,但不存在这样的服务。您可能应该将此类别名为现有的“sonata.media.pool”服务。
我假设我必须先做一些配置,然后才能在我自己的项目中扩展 MediaType。我尝试在我的services.yml中使用以下代码
Sonata\MediaBundle\Provider\Pool:
tags: ['sonata.media.pool']
但现在又发生了另一个错误: 无法自动装配服务“AppBundle\Form\SonataMediaBundle\EwMediaType”:方法“Sonata\MediaBundle\Form\Type\MediaType::__construct()”的参数“$class”没有类型提示,你应该显式配置其值。
我对 symfony 很陌生,对它的配置不是很熟悉。谁能帮我列出我需要做的步骤,以便我可以扩展和修改 MediaType 类?
非常感谢。
萨沙
解决方案
您可以执行以下操作。您需要创建自定义服务定义。
AppBundle\Form\Type\CustomMediaType:
class: AppBundle\Form\Type\CustomMediaType
autowire: true
autoconfigure: true
arguments:
- "@sonata.media.pool"
- "Application\\Sonata\\MediaBundle\\Entity\\Media"
然后在您的 CustomMediaType 中按照正常方式创建您的表单类型..
namespace AppBundle\Form\Type;
use Sonata\MediaBundle\Form\Type\MediaType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\UrlType;
use Symfony\Component\OptionsResolver\OptionsResolver;
class CustomMediaType extends MediaType
{
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
]);
}
public function getBlockPrefix()
{
return 'custom_media_type';
}
public function getParent()
{
return MediaType::class;
}
}
然后在你的树枝包含的某个地方,你可以添加你的自定义 HTML ......
{% block custom_media_type_widget %}
// Your HTML here
{% endblock %}
推荐阅读
- javascript - nodejs中redis客户端的异步导出
- python - C++ 在 Qt 中的行为不同,bind() 返回 EINVAL
- amazon-web-services - 更新实例后如何更新 Auto Scaling 启动配置或启动模板
- javascript - MongoDB/Mongoose $pull 一个数组中的对象,其中对象的 _id 匹配
- python - 图像序列的 LSTM - AttributeError:'bool' 对象没有属性'float'
- dart - 为什么在 Dart 中不能用“catchError”捕获异常?
- r - 将两个数据帧相乘
- android - 是否可以卸载 react native android app react native?
- php - 如何在这个 foreach 循环中插入 else 语句?
- javascript - Lodash:如何分组,然后按多个属性对集合进行排序