Мне нужно добавить расширение .svg в мою конфигурацию.
На данный момент в моем проекте у меня есть другие расширения как (pdf, images)
Я внесла следующие изменения
Теперь я могу загрузить файл svg, но проблема в том, что пользователь может загружать другие расширения файлов, например, pdf и т. Д.
Как это можно избежать? Или найти правильный способ проверки формы?
Документация Соната:
РАСШИРЕННАЯ КОНФИГУРАЦИЯ
Контекст медиа
помогли мне, но не для проверки формы.
Что мне не хватает?
Я изменил следующие файлы:
#app/config/sonata_config.yml sonata_media: default_context: images_file db_driver: doctrine_orm # or doctrine_mongodb, doctrine_phpcr contexts: pdf_file: providers: - sonata.media.provider.file formats: ~ images_file: providers: - sonata.media.provider.image formats: 1x: { width: 870 , height: 412 , quality: 80 } 2x: { width: 1740 , height: 824 , quality: 50 } svg_file: providers: - sonata.media.provider.file formats: ~ cdn: server: path: /uploads/media # http://media.sonata-project.org/ filesystem: local: directory: %kernel.root_dir%/../web/uploads/media create: false providers: file: service: sonata.media.provider.file resizer: false filesystem: sonata.media.filesystem.local cdn: sonata.media.cdn.server generator: sonata.media.generator.default thumbnail: sonata.media.thumbnail.format allowed_extensions: ['pdf', 'txt', 'rtf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pttx', 'odt', 'odg', 'odp', 'ods', 'odc', 'odf', 'odb', 'csv', 'xml','svg'] allowed_mime_types: ['application/pdf', 'application/x-pdf', 'application/rtf', 'text/html', 'text/rtf', 'text/plain', 'image/svg+xml']
Файл формы:
use Sonata\AdminBundle\Admin\Admin; class CustomAdmin extends Admin { /** * @param FormMapper $formMapper */ protected function configureFormFields(FormMapper $formMapper) { $formMapper ->add( 'NormalLogo', 'sonata_type_model_list', array('required' => false), array( 'link_parameters' => array('context' => 'images_file', 'provider' => 'sonata.media.provider.image'), ) ) ->add( 'SvgLogo', 'sonata_type_model_list', array('required' => false), array( 'link_parameters' => array('context' => 'svg_file', 'provider' => 'sonata.media.provider.file'), ) ) ->add('overriddenBy', 'sonata_type_model', array( 'empty_value' => 'Not overridden', 'btn_add' => false, 'btn_list' => false, 'btn_delete' => false, 'btn_catalogue' => false, ) ); } }
Вы можете создать своего собственного поставщика для файлов SVG только для этого, вам нужно сначала определить службу для своего поставщика SVG
parameters: application_sonata_media.svg_class: Application\Sonata\MediaBundle\Provider\SVGProvider services: sonata.media.provider.svg: class: %application_sonata_media.svg_class% tags: - { name: sonata.media.provider } arguments: - sonata.media.provider.svg - @sonata.media.filesystem.local - @sonata.media.cdn.server - @sonata.media.generator.default - @sonata.media.thumbnail.format - allowed_extensions: ['svg'] - allowed_mime_types: ['image/svg+xml']
Используя сонату, вы можете создавать расширенные пакеты с помощью EASYEXTENDS BUNDLE
по умолчанию, он генерирует расширенный пакет в src/Application/Sonata/MediaBundle
но вы также можете указать другой пункт назначения. Теперь создайте выше сервис в расширенных сервисах media.yml и импорте в основной config.yml
Если вы хотите добавить больше типов или расширений mime, которые вы можете определить в приведенном выше сервисе allowed_mime_types: ['image/svg+xml','application/pdf']
imports: - { resource: @ApplicationSonataMediaBundle/Resources/config/services.yml }
Теперь создайте свой класс провайдера в расширенном пакете мультимедиа в качестве SVGProvider
и расширьте свой класс провайдера FileProvider
сонатной среды FileProvider
<?php namespace Application\Sonata\MediaBundle\Provider; use Sonata\MediaBundle\Provider\FileProvider as BaseFileProvider; use Gaufrette\Filesystem; use Sonata\AdminBundle\Form\FormMapper; use Sonata\AdminBundle\Validator\ErrorElement; use Sonata\MediaBundle\CDN\CDNInterface; use Sonata\MediaBundle\Generator\GeneratorInterface; use Sonata\MediaBundle\Metadata\MetadataBuilderInterface; use Sonata\MediaBundle\Model\MediaInterface; use Sonata\MediaBundle\Thumbnail\ThumbnailInterface; use Symfony\Component\HttpFoundation\File\File; use Symfony\Component\HttpFoundation\File\UploadedFile; use Symfony\Component\Validator\Constraints\NotBlank; use Symfony\Component\Validator\Constraints\NotNull; class SVGProvider extends BaseFileProvider { protected $allowedMimeTypes; protected $allowedExtensions; protected $metadata; public function __construct( $name, Filesystem $filesystem, CDNInterface $cdn, GeneratorInterface $pathGenerator, ThumbnailInterface $thumbnail, array $allowedExtensions = array(), array $allowedMimeTypes = array(), MetadataBuilderInterface $metadata = null ) { parent::__construct( $name, $filesystem, $cdn, $pathGenerator, $thumbnail ); $this->allowedExtensions = $allowedExtensions; $this->allowedMimeTypes = $allowedMimeTypes; $this->metadata = $metadata; } public function buildCreateForm( FormMapper $formMapper ) { $formMapper->add( 'binaryContent', 'file', array( 'label' => 'Upload SVG file only', 'constraints' => array( new NotBlank(), new NotNull(), ), ) ); } /** * {@inheritdoc} */ public function validate( ErrorElement $errorElement, MediaInterface $media ) { if ( ! $media->getBinaryContent() instanceof \SplFileInfo ) { return; } if ( $media->getBinaryContent() instanceof UploadedFile ) { $fileName = $media->getBinaryContent()->getClientOriginalName(); } elseif ( $media->getBinaryContent() instanceof File ) { $fileName = $media->getBinaryContent()->getFilename(); } else { throw new \RuntimeException( sprintf( 'Invalid binary content type: %s', get_class( $media->getBinaryContent() ) ) ); } if ( ! in_array( strtolower( pathinfo( $fileName, PATHINFO_EXTENSION ) ), $this->allowedExtensions ) ) { $errorElement ->with( 'binaryContent' ) ->addViolation( 'Invalid extensions' ) ->end(); } if ( ! in_array( $media->getBinaryContent()->getMimeType(), $this->allowedMimeTypes ) ) { $errorElement ->with( 'binaryContent' ) ->addViolation( 'Invalid mime type : ' . $media->getBinaryContent()->getMimeType() ) ->end(); } } }
Здесь вы можете переопределить функции базового класса и определить свои собственные функции, как вы хотите, например, хотите добавить некоторые проверки на ввод файла, вы можете настроить функцию validate()
для изменения атрибутов для поля ввода файла, которую вы можете определить в buildCreateForm()
Теперь в вашем администраторе, если вы хотите разрешить загрузку только SVG, вы можете определить своего собственного провайдера, который позволяет использовать только файлы SVG
protected function configureFormFields(FormMapper $formMapper) { $formMapper ->add( 'SvgLogo', 'sonata_type_model_list', array('required' => false), array( 'link_parameters' => array('context' => 'svg_file', 'provider' => 'sonata.media.provider.svg'), ) ) }