Медиа-пакет сонаты модифицирует MediaType - PullRequest
0 голосов
/ 20 мая 2018

Я использую symfony 3.4 с медиа-пакетом sonata.Использование 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')}} для записи кнопки загрузки и флажка для удаления загруженных файлов, включая метки,Это делается в классе \ sonata-project \ media-bundle \ src \ Forms \ Type \ MediaType.php в методе buildForm.

Теперь я хочу изменить этот метод 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»: аргумент «$ pool» метода «Sonata \ MediaBundle \ Form \ Type \ MediaType :: __ construct ()» ссылается на класс «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 () "нет подсказки типа, вы должны явно указать его значение.

Я новичок в Symfony и неочень знаком с его конфигурацией.Кто-нибудь может помочь мне перечислить шаги, которые мне нужно сделать, чтобы я мог расширить и изменить класс MediaType?

Большое спасибо.

Саша

1 Ответ

0 голосов
/ 17 августа 2018

Вы можете сделать следующее.Вам нужно создать собственное определение сервиса.

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 %}
...