奏鸣曲媒体包修改 MediaType

Posted

技术标签:

【中文标题】奏鸣曲媒体包修改 MediaType【英文标题】:sonata media bundle modify MediaType 【发布时间】:2018-10-30 03:13:29 【问题描述】:

我将 symfony 3.4 与奏鸣曲媒体包一起使用。在表单中使用 MediaType 可以正常工作,如下所示:

$this->builder->->add('document', MediaType::class,
                      ['label'    => 'Document',
                       'provider' => 'sonata.media.provider.file',
                       'context'  => 'default']) ;

现在我想修改 MediaType 生成的字段。

我刚刚将 Twig 模板 \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 类?

非常感谢。

萨沙

【问题讨论】:

你找到答案了吗? 【参考方案1】:

您可以执行以下操作。您需要创建自定义服务定义。

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 %

【讨论】:

你好莱克,谢谢你的回答。我试过了,这么长时间一切都很好。我现在可以通过 twig 模板修改 HTML 输出。 然后我尝试覆盖我的 CustomMediaType.php 类中的 buildForm 方法并删除了创建复选框 ($builder->add('unlink', CheckboxType::class, [...]); 但似乎仍然调用了原始 MediaType.php 类中的 buildForm 方法。我错过了什么?你有线索吗,我如何覆盖 buildForm 方法?非常感谢! 我不确定。但是,如果您想删除某些内容,那么仅 ->remove() 构建器上的元素可能更有意义。这就是你想要做的一切吗? 谢谢 Layke,这是一个很好的提示。我尝试删除,但问题是 MediaType 创建了一个包含多个字段的子表单,我想删除该子表单中的一个字段。我可以在我的主表单 buildForm 方法中删除子类型中的字段吗?

以上是关于奏鸣曲媒体包修改 MediaType的主要内容,如果未能解决你的问题,请参考以下文章

奏鸣曲媒体包,无法预览图像

奏鸣曲媒体包

Symfony 4 中的奏鸣曲媒体包模板

奏鸣曲媒体包中的错误

Symfony 3.2.7 和奏鸣曲媒体包安装

Symfony 2 Sonata 媒体包:在没有奏鸣曲管理员的情况下保存媒体文件图像