Symfony 奏鸣曲媒体束修改媒体类型

Symfony 奏鸣曲媒体束修改媒体类型,symfony,sonata-media-bundle,Symfony,Sonata Media Bundle,我将symfony 3.4与sonata media捆绑包一起使用。在表单中使用MediaType的工作原理如下: $this->builder->->add('document', MediaType::class, ['label' => 'Document', 'provider' => 'sonata.media.provider.file',

我将symfony 3.4与sonata media捆绑包一起使用。在表单中使用MediaType的工作原理如下:

$this->builder->->add('document', MediaType::class,
                      ['label'    => 'Document',
                       'provider' => 'sonata.media.provider.file',
                       'context'  => 'default']) ;
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 ...
    }
}
现在我想修改MediaType生成的字段

我刚刚将细枝模板\vendor\sonata project\media bundle\src\Resources\views\Form\media\u widgets.html.Twig复制到我的项目(\AppBundle\SonataMediaBundle\views\Form),现在我可以修改布局了。这么久了,一切都很好

模板最后使用{{block('form_widget')}}写出上传按钮和一个复选框来删除上传的文件,包括标签。这是在buildForm方法的\sonata project\media bundle\src\Forms\Type\MediaType.php类中完成的

现在我想修改这个buildForm方法。修改供应商包中的类不是一个好做法,因此我想创建一个新类扩展MediaType类并覆盖buildForm方法,如下所示:

$this->builder->->add('document', MediaType::class,
                      ['label'    => 'Document',
                       'provider' => 'sonata.media.provider.file',
                       'context'  => 'default']) ;
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::\uu construct()”的参数“$pool”引用类“Sonata\MediaBundle\Provider\pool”,但不存在此类服务。您可能应该将该类别名为现有的“sonata.media.pool”服务

我假设在我自己的项目中扩展MediaType之前,我必须做一些配置工作。我在services.yml中尝试了以下代码

但现在出现了另一个错误: 无法自动连线服务“AppBundle\Form\SonataMediaBundle\EwMediaType”:方法“Sonata\MediaBundle\Form\Type\MediaType::\uu构造()”的参数“$class”没有类型提示,应显式配置其值

我对symfony很陌生,对它的配置不太熟悉。谁能帮我列出我需要做的步骤,这样我就可以扩展和修改MediaType类了

非常感谢


Sascha

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

AppBundle\Form\Type\CustomMediaType:
    class: AppBundle\Form\Type\CustomMediaType
    autowire: true
    autoconfigure: true
    arguments:
    - "@sonata.media.pool"
    - "Application\\Sonata\\MediaBundle\\Entity\\Media"
然后在CustomMediaType中,按照常规创建formtype

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方法吗?非常感谢!我不确定。但是,如果你想删除某些内容,只需->删除()构建器上的元素。这就是您想要做的吗?谢谢Layke,这是一个很好的提示。我尝试了remove,但问题是MediaType创建了一个包含多个字段的子窗体,我想删除该子窗体中的一个字段。我能删除主窗体buildForm方法中子类型中的字段吗?