Пакет медиа для сонаты изменить MediaType

Я использую 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') }} для записи кнопки загрузки и флажка для удаления загруженных файлов, включая метки. Это делается в классе \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 ...
    }
}

Я получаю сообщение об ошибке Cannot autowire service "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": аргумент "$class" метода "Sonata\MediaBundle\Form\Type\MediaType::__construct()" не имеет подсказки типа , вы должны указать его значение явно.

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

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

Саша


person Sascha    schedule 20.05.2018    source источник
comment
Вы когда-нибудь находили ответ на это?   -  person Layke    schedule 17.08.2018


Ответы (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 %}
person Layke    schedule 17.08.2018
comment
Здравствуйте Лайк, спасибо за ответ. Я попробовал это, и все работало очень хорошо до тех пор. Теперь я могу изменить вывод HTML с помощью шаблона ветки. - person Sascha; 18.08.2018
comment
Затем я попытался перезаписать метод buildForm в моем классе CustomMediaType.php и удалил строку, которая создает флажок ($builder-›add('unlink', CheckboxType::class, [...]);< /i> но все равно вызывается метод buildForm в исходном классе MediaType.php. Что я упустил? У вас есть подсказка, как я могу перезаписать метод buildForm? Большое спасибо! - person Sascha; 18.08.2018
comment
Я не уверен. Однако, если вы хотите что-то удалить, вероятно, имеет смысл просто -›remove() элемент в конструкторе. Это все, что вы пытаетесь сделать? - person Layke; 20.08.2018
comment
Спасибо, Лайке, это прекрасный намек. Я попытался удалить, но проблема в том, что MediaType создает подчиненную форму с несколькими полями, и я хочу удалить одно из полей в этой подчиненной форме. Могу ли я удалить поле в подтипе в моем методе buildForm основной формы? - person Sascha; 24.08.2018