如何在 url @admin_sonata_media_media_create 从 sonata_type_model_list 删除类别

How to remove category from sonata_type_model_list at url @admin_sonata_media_media_create

我在用户实体(头像)中使用媒体。

一开始我用的是sonata_media_type。效果不错。

问题是我正在使用 ManyToOne - 因此管理员可以 select 从列表中选择一个。为此,我必须使用 sonata_type_model_list - 这具有列表、新建、删除操作。我通过 'btn_delete' => '' 删除了 delete。这里的列表操作效果很好(到目前为止)。

真正的问题在于新操作。 新操作 window 从 ajax 加载 - 它有 File/Reference,类别 (两个字段)。

这里我需要完全删除类别字段(列出、新建、删除)。我们为什么需要这个?因为没用!

我的研究:

我试图修改模板 - 但找不到正确的树枝文件。它指向 parent() - 指向管理包!

验证 File/Reference - 我创建了自己的 ImageProvider(根据文档) - 它工作(验证)很好。

我试图删除类别字段(查看图片)- 但失败了。

我的代码是:

    class ImageProvider extends BaseProvider{...}
        public function buildCreateForm(FormMapper $formMapper) {
// This works - changed File/Reference to ok
            $formMapper->add('binaryContent', 'file', array('label' => 'ok',
                'constraints' => array(
                    new NotBlank(),
                ),
            ));
// This works - added a new text field
            $formMapper->add('context', 'text', ['attr' => ['class' => 'fz_rocks']]);
// This not working - also ->add('category') - has no effect even when attr=hide and so on..
            $formMapper->remove('category');
        }

-

从媒体弹出窗口中删除类别字段

  • 您需要通过覆盖 class 参数 sonata.media.admin.media.class
  • 来覆盖媒体管理员的 class
  • 创建您自己的管理员 class 并使用 sonata media 的基础管理员 class 对其进行扩展 class。
  • 通过在您的管理 class
  • 中定义来覆盖 configureFormFields() 方法
  • $formMapper 中删除类别字段

覆盖奏鸣曲媒体 class

parameters:
    sonata.media.admin.media.class: Your\MediaBundle\Admin\ORM\MediaAdmin

媒体管理员Class

namespace Your\MediaBundle\Admin\ORM;

use Sonata\MediaBundle\Admin\ORM\MediaAdmin as Admin;
// .. Other use statements 

class MediaAdmin extends Admin {

    /**
     * {@inheritdoc}
     */
    protected function configureFormFields( FormMapper $formMapper ) {
        $media = $this->getSubject();

        if ( ! $media ) {
            $media = $this->getNewInstance();
        }

        if ( ! $media || ! $media->getProviderName() ) {
            return;
        }

        $formMapper->add( 'providerName', 'hidden' );

        $formMapper->getFormBuilder()->addModelTransformer( new ProviderDataTransformer( $this->pool, $this->getClass() ), true );

        $provider = $this->pool->getProvider( $media->getProviderName() );

        if ( $media->getId() ) {
            $provider->buildEditForm( $formMapper );
        } else {
            $provider->buildCreateForm( $formMapper );
        }

    }

}

我通过隐藏类别字段解决了这个问题。如果我完全删除它有时会导致问题。安全就是躲起来。

为了实现这一点,我根据 sonata-media 文档使用自定义提供程序 creating_a_provider_class.rst

namespace Application\Sonata\MediaBundle\Provider;
class ImageProvider extends BaseProvider {
    public function buildCreateForm(FormMapper $formMapper) {
        $formMapper->add('binaryContent', 'file', ['label' => 'Upload a new file', 'constraints' => [new NotBlank(), new NotNull()]])->end();
        $formMapper->with('General', ['class' => 'hidden'])->add('category');
    }
    public function buildEditForm(FormMapper $formMapper) {
        parent::buildEditForm($formMapper);
        $formMapper->add('binaryContent', 'file', ['label' => 'Upload a new file', 'required' => FALSE])->end();
        $formMapper->with('General', ['class' => 'hidden'])->add('category');
    }
}