daric/sonata-multiupload-bundle
Installation:
composer require silasjoisten/sonata-multiupload-bundle
Enable the bundle in config/bundles.php:
Silasjoisten\SonataMultiuploadBundle\SonataMultiuploadBundle::class => ['all' => true],
Configuration: Add the bundle to your Sonata Admin configuration:
# config/packages/sonata_multiupload.yaml
sonata_multiupload:
enabled: true
max_file_size: 10M # Default max file size
allowed_mime_types: ['image/jpeg', 'image/png'] # Restrict file types
First Use Case: Extend a Sonata Admin class to enable multi-upload for a field:
use Silasjoisten\SonataMultiuploadBundle\Admin\Type\MultiuploadType;
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->add('images', 'sonata_multiupload', [
'label' => 'Images',
'required' => false,
'multiple' => true,
'btn_text' => 'Upload Images',
'btn_icon' => 'fa fa-upload',
]);
}
Frontend Setup: Ensure you include the bundle's JS/CSS in your base template:
{{ sonata_multiupload_js() }}
{{ sonata_multiupload_css() }}
sonata_multiupload field type in Sonata Admin forms.ProductAdmin:
$formMapper->add('gallery', 'sonata_multiupload', [
'label' => 'Gallery Images',
'multiple' => true,
'btn_text' => 'Add to Gallery',
'preview_size' => [100, 100], // Thumbnail size
]);
prePersist() or preUpdate() methods to process uploaded files:
public function prePersist($object)
{
if ($object->getGallery()) {
foreach ($object->getGallery() as $file) {
// Save file logic (e.g., move to storage, generate thumbnails)
}
}
}
$formMapper->add('documents', 'sonata_multiupload', [
'label' => 'Documents',
'allowed_mime_types' => $this->getConfigurationPool()->getContainer()->getParameter('sonata_multiupload.allowed_doc_types'),
]);
sonata-media-bundle, configure the field to work with media entities:
$formMapper->add('media', 'sonata_multiupload', [
'label' => 'Media',
'media_provider' => 'sonata.media.provider.file', // Specify provider
'context' => 'product_gallery', // Media context
]);
$formMapper->add('attachments', 'sonata_multiupload', [
'constraints' => [
new \Symfony\Component\Validator\Constraints\File([
'maxSize' => '5M',
'mimeTypes' => ['application/pdf'],
'mimeTypesMessage' => 'Only PDF files are allowed',
]),
],
]);
public function postUpdate($object, FormInterface $form, Request $request)
{
$data = $form->getData();
if (isset($data['attachments'])) {
$this->processAttachments($data['attachments']);
}
}
SonataAdminBundle in config/bundles.php.php bin/console cache:clear
vendor/silasjoisten/sonata-multiupload-bundle/Resources/views/sonata_multiupload/_form_field.html.twig
to your theme’s templates/sonata_multiupload/ directory.sonata_multiupload field in API platforms:
# config/packages/api_platform.yaml
api_platform:
formats:
jsonld:
mime_types: ['application/ld+json']
json:
mime_types: ['application/json', 'application/vnd.api+json']
resources:
- { type: App\Entity\Product, operations: { collection: { method: 'POST', deserialization_context: { groups: ['upload'] } } } }
// src/EventListener/MultiuploadListener.php
public function onMultiuploadUpload(KernelEvents::VIEW, GetResponseEvent $event)
{
$request = $event->getRequest();
if ($request->isXmlHttpRequest() && $request->query->has('sonata_multiupload')) {
// Handle upload logic
}
}
php.ini limits (upload_max_filesize, post_max_size).// In your custom JS
$('#sonata-multiupload').fileupload({
maxFileSize: 10000000, // 10MB
acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i,
});
$.ajaxSetup({
headers: {
'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
}
});
assets/app.js:
//= require jquery
//= require bootstrap
//= require sonata-multiupload
uploads/ directory is writable:
chmod -R 775 var/uploads
stof/doctrine-extensions or vich/uploader-bundle.sonata_multiupload:
enabled: true
upload_handler: sonata_multiupload.handler.file # Override default
TemplateNotFoundException for sonata_multiupload/_form_field.html.twig.mkdir -p templates/sonata_multiupload
cp vendor/silasjoisten/sonata-multiupload-bundle/Resources/views/sonata_multiupload/_form_field.html.twig templates/sonata_multiupload/
APP_DEBUG=true in .env to log upload errors:
APP_DEBUG=1
public function onKernelRequest(GetResponseEvent $event)
{
$request = $event->getRequest();
if ($request->query->has('sonata_multiupload')) {
\Log::debug('Multiupload request:', $request->query->all());
}
}
sonata_multiupload.upload_dir in config points to a valid, writHow can I help you explore Laravel packages today?