SonataMediaBundle: способ удалить расшитый динбокс
Поэтому я хочу удалить "Unlink" и "Binary content" из формы SonataMediaBundle:
Я ничего не нашел в Google. Должен ли я использовать Javascript, чтобы скрыть их?
7 ответов
Unlink
Я расширил форму Media Type, чтобы сделать флажок unlink необязательным (основываясь на ответе abadius):
# src/MyNamespace/AppBundle/Form/Extension/MediaTypeExtension.php
namespace MyNamespace\AppBundle\Form\Extension;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\FormBuilderInterface;
class MediaTypeExtension extends AbstractTypeExtension
{
/**
* {@inheritdoc}
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'show_unlink' => true,
));
}
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
if (!$options['show_unlink']) {
$builder->add('unlink', 'hidden', array(
'mapped' => false,
'data' => false,
'required' => false,
));
}
}
/**
* {@inheritdoc}
*/
public function getExtendedType()
{
return 'sonata_media_type';
}
}
Добавьте его в качестве службы расширения формы:
# Bundle config
mynamespace.form.type_extension.media:
class: MyNamespace\AppBundle\Form\Extension\MediaTypeExtension
tags:
-
name: form.type_extension
alias: sonata_media_type
Двоичный контент
Здесь вам нужно переопределить провайдер файлов, чтобы изменить или удалить метку ( источник):
# src/Application/Sonata/MediaBundle/Provider/FileProvider.php
namespace Application\Sonata\MediaBundle\Provider;
use Sonata\MediaBundle\Provider\FileProvider as BaseFileProvider;
use Symfony\Component\Form\FormBuilder;
class FileProvider extends BaseFileProvider
{
/**
* {@inheritdoc}
*/
public function buildMediaType(FormBuilder $formBuilder)
{
$formBuilder->add('binaryContent', 'file', array(
'label' => false,
));
}
}
И переопределите параметр в конфигурации вашего приложения:
# app/config/config.yml
parameters:
sonata.media.provider.file.class: Application\Sonata\MediaBundle\Provider\FileProvider
Вы можете снять флажок unlink с помощью:
protected function configureFormFields(FormMapper $formMapper)
{
$fileFieldOptions = array(
'provider' => 'sonata.media.provider.file',
'context' => 'default',
'label' => 'File',
'required' => true
);
$formMapper
->add(
'file',
'sonata_media_type',
$fileFieldOptions
);
$formMapper->get('file')->remove('unlink');
}
Чтобы скрыть отсоединение, измените это рядом со строкой 63 в MediaType.php в Type:
$builder->add('unlink', 'hidden', array(
'mapped' => false,
'data' => false,
'required' => false
));
чтобы удалить двоичный контент, я ищу сейчас... У кого-нибудь есть решение?
С наилучшими пожеланиями.
В принятом ответе Вы должны добавить опцию extended_type для Symfony >= 3.1. Итак, правильная регистрация сервиса:
# Bundle config
mynamespace.form.type_extension.media:
class: MyNamespace\AppBundle\Form\Extension\MediaTypeExtension
tags:
-
name: form.type_extension
extended_type: 'Sonata\MediaBundle\Form\Type\MediaType'
alias: sonata_media_type
В примере, предоставленном malberts, чтобы скрыть / переопределить метку, помните, что вы можете получить доступ к текущей метке виджета вашей связанной формы благодаря методу getOption formBuilder.
public function buildMediaType(FormBuilder $formBuilder)
{
$formBuilder->add('binaryContent', 'file', array(
'label' => $formBuilder->getOption('label'),
));
}
Если вам нравится скрытый unlink и бинарный контент от media/admin, это для меня работа
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->add('numerocamera')
->add('tipocamera')
->add('media', 'sonata_media_type', array(
'label'=> 'carica immagine 1',
'provider' => 'sonata.media.provider.image',
'context' => 'camere'
))
->add('media1', 'sonata_media_type', array(
'label'=> 'carica immagine 2',
'provider' => 'sonata.media.provider.image',
'context' => 'camere'
))
->add('media2', 'sonata_media_type', array(
'label'=> 'carica immagine 3',
'provider' => 'sonata.media.provider.image',
'context' => 'camere'
))
->add('media3', 'sonata_media_type', array(
'label'=> 'inserisci url video youtube 1',
'provider' => 'sonata.media.provider.youtube',
'context' => 'camere'
))
;
**$formMapper->get('media')->add('unlink', 'hidden', ['mapped' => false, 'data' => false])
->add('binaryContent', 'file', ['label' => false]);
$formMapper->get('media1')->add('unlink', 'hidden', ['mapped' => false, 'data' => false])
->add('binaryContent', 'file', ['label' => false]);
$formMapper->get('media2')->add('unlink', 'hidden', ['mapped' => false, 'data' => false])
->add('binaryContent', 'file', ['label' => false]);
$formMapper->get('media3')->add('unlink', 'hidden', ['mapped' => false, 'data' => false])
->add('binaryContent', 'url', ['label' => false]);
}**
Для полного удаления элемента "unlink" из элемента типа "sonata_media_type"
Пример набора в форму:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add(
'mediaProfil',
'sonata_media_type',
array(
'provider' => 'sonata.media.provider.image',
'context' => 'teams',
'required' => false
)
);
$builder->get('mediaProfil')->remove('unlink');
}
Или внутри контроллера:
public function editProfileAction()
{
/** @var \Symfony\Component\Form\Form $form */
$form = $this->container->get('sonata.user.profile.form');
$form->get('mediaProfil')->remove('unlink');
}
Но явный вызов элемента unlink выполняется в sonataMedia
PR: https://github.com/sonata-project/SonataMediaBundle/pull/666
Или просто добавьте в свою форму:
// fix https://github.com/sonata-project/SonataMediaBundle/pull/666
$builder->addEventListener(
FormEvents::PRE_SUBMIT,
function (FormEvent $event) use ($formModifier) {
$event->getForm()->get('mediaProfil')->add('unlink', null, array('mapped' => false,));
}
);