2017 © Pedro PelĂĄez
 

symfony-bundle upload-bundle

Symfony Upload Ajax Bundle

image

bnbc/upload-bundle

Symfony Upload Ajax Bundle

  • Wednesday, March 14, 2018
  • by bnbc
  • Repository
  • 1 Watchers
  • 16 Stars
  • 9,336 Installations
  • JavaScript
  • 0 Dependents
  • 0 Suggesters
  • 8 Forks
  • 3 Open issues
  • 1 Versions
  • 13 % Grown

The README.md

Bundle d'upload pour Symfony 2 et 3

Ce bundle vous permettra d'ajouter des champs d'upload en ajax dans vos formulaires. Basé sur le plugin d'upload blueimp/jQuery-File-Upload, (*1)

Installation via composer

Ajoutez le require Ă  votre fichier composer.json et lancer la commande composer update, (*2)

# composer.json

{
    // ...
    require: {
        // ...
        "bnbc/upload-bundle": "dev-master"
    }
}

Configuration

Ajoutez le bundle Ă  votre kernel, (*3)

# app/AppKernel.php

// in AppKernel::registerBundles()
$bundles = array(
    // ...
    new Bnbc\UploadBundle\BnbcUploadBundle(),
    // ...
);

Si cela n'a pas déjà été fais par composer, copiez les assets situés dans le dossier /vendor/bnbc/upload-bundle/Bnbc/UploadBundle/Resources/public/js dans le dossier /web/bundles/bnbcupload/js et ajoutez les fichiers javascripts à votre template, supprimez la ligne avec jQuery si vous l'avez déjà (requiert jQuery 1.6+)., (*4)

<script src="{{ asset('bundles/bnbcupload/js/1_jquery.min.js') }}"></script>
<script src="{{ asset('bundles/bnbcupload/js/2_jquery.ui.widget.js') }}"></script>
<script src="{{ asset('bundles/bnbcupload/js/3_jquery.iframe-transport.js') }}"></script>
<script src="{{ asset('bundles/bnbcupload/js/4_jquery.fileupload.js') }}"></script>
<script src="{{ asset('bundles/bnbcupload/js/5_init.js') }}"></script>

Ajouter la route, (*5)

# app/config/routing.yml

bnbc_upload:
    resource: "@BnbcUploadBundle/Controller/"
    type:     annotation
    prefix:   /upload

Ajouter la ressource pour le type de champs bnbc_ajax_file, (*6)

# app/config/config.yml

twig:
    form_themes:
            - BnbcUploadBundle:Form:fields.html.twig

Options de configuration globale (facultatives)

uniqid

Conversion de tous les noms de fichiers en uniqid
DĂ©faut : false, (*7)

max_file_size

Taille de fichier max en octets
Défaut : null (la limite dépendra alors des variables upload_max_filesize et post_max_size de votre php.ini)
Exemple : 10 * 1024 * 1024 = 10485760 représente (10 Mo), (*8)

accept_file_types

Expression réguliÚre pour gérer les fichiers ou types de fichiers acceptés
DĂ©faut : '/.+$/i' (Autorise tous les fichiers)
Exemple : '/\.(gif|jpe?g|png)$/i' (Autorise uniquement les fichiers images gif, jpeg et png), (*9)

upload_folder

Dossier de téléversement des fichiers par rapport à la racine du dossier web
DĂ©faut : 'uploads'
Exemple : 'uploads/test' (Il est possible d'indiquer des sous-dossiers, ils se créeront automatiquement), (*10)

image_versions

Génération de formats supplémentaires, 3 formats possibles: thumbnail, medium, large. Le paramÚtre crop permet de recadrer l'image à la taille indiquée
DĂ©faut : null
Exemple :, (*11)

thumbnail:
    max_width: 100
    max_height: 100
    crop: true
medium:
    max_width: 300
    max_height: 300
    crop: false
large:
    max_width: 1024
    max_height: 768
    crop: false

Exemple complet

# app/config/config.yml

bnbc_upload:
    uniqid: true
    max_file_size: 10485760
    accept_file_types: '/\.(gif|jpe?g|png)$/i'
    upload_folder: 'uploads/test'
    image_versions:
        thumbnail:
            max_width: 100
            max_height: 100
            crop: true
        medium:
            max_width: 300
            max_height: 300
            crop: false
        large:
            max_width: 1024
            max_height: 768
            crop: false

Utilisation

Ajouter un champs de type bnbc_ajax_file Ă  votre formulaire, (*12)

# Symfony 2
$formBuilder->add('myfield', 'bnbc_ajax_file');

# Symfony 3
$formBuilder->add('myfield', AjaxfileType::class);

Options de configuration du champs fichier (facultatives)

required

Champs requis ou non
DĂ©faut : false, (*13)

progressBar

Affichage d'une barre de progression (calque qui voit sa largeur passer de 0 Ă  100%)
DĂ©faut : false, (*14)

progressBarClass

Classe(s) css pour la barre de progression (séparé par des espaces)
DĂ©faut : bnbc-ajax-file-progress, (*15)

progressBarPosition

Position de la barre de progression, toutes les fonctions d'insertion jQuery sont autorisées
DĂ©faut : append, (*16)

progressElement

Nom de l'élément auquel on assigne un attribut de progression qui va de 0 à 100 : data-progress
DĂ©faut : null, (*17)

progressText

Nom de l'Ă©lĂ©ment dans lequel le pourcentage de progression va ĂȘtre mis en texte
DĂ©faut : null, (*18)

multiple

TĂ©lĂ©versement de plusieurs fichiers en mĂȘme temps
DĂ©faut : false, (*19)

label

Label pour le bouton d'upload si vous souhaitez le personnaliser en css DĂ©faut : null, (*20)

autoUpload

Le(s) fichier(s) se téléverse(nt) automatiquement aprÚs avoir été ajouté, si false un bouton de soumission apparait.
DĂ©faut : true, (*21)

dropZone

Affichage d'une zone de glisser/déposer
DĂ©faut : true, (*22)

dropZoneText

Texte la zone de glisser/déposer
DĂ©faut : 'Drop file(s) here', (*23)

callbackFunction

Nom d'une fonction javascript à appeler une fois le téléversement terminé
DĂ©faut : null
Exemple : afterUpload
Utilisation dans un template : var afterUpload = function(files){}; oĂč files est un tableau des fichiers tĂ©lĂ©versĂ©s, (*24)

formData

Vous pouvez redéfinir les options de configuration globale pour chaque champs dans le paramÚtre formData
DĂ©faut : ne pas mettre le paramĂštre, (*25)

# Symfony 2
$formBuilder->add('myfield', 'bnbc_ajax_file',
    array(
        'required'            => false,
        'progressBar'         => false,
        'progressBarClass'    => 'bnbc-ajax-file-progress',
        'progressBarPosition' => 'append',
        'multiple'            => false,
        'label'               => null,
        'autoUpload'          => true,
        'dropZone'            => true,
        'dropZoneText'        => 'Drop file(s) here',
        'callbackFunction'    => null,
        'formData'            => array(
            'uniqid'            => false,
            'max_file_size'     => 5 * 1024 * 1024,
            'accept_file_types' => null,
            'upload_folder'     => 'test',
            'image_versions'    => array(
                'thumbnail' => array(
                    'max_width'  => 100,
                    'max_height' => 100,
                    'crop'       => true
                )
            )
        )
    )
);

# Symfony 3
$formBuilder->add('myfield', AjaxfileType::class,
    array(
        'required'            => false,
        'progressBar'         => false,
        'progressBarClass'    => 'bnbc-ajax-file-progress',
        ...        
    )
);

Exemple de code css pour personnaliser le bouton "Parcourir"

A venir..., (*26)

Exemple de traitement du fichier téléversé (pas optimisé et pas forcément adapté à tous)


/** * Creates a new entity. * * @Route("/new", name="admin_entity_new") * @Method({"GET", "POST"}) */ public function newAction(Request $request) { $entity = new Entity(); $form = $this->createForm('AdminBundle\Form\EntityType', $entity); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $em = $this->getDoctrine()->getManager(); $em->persist($entity); $em->flush($entity); if($entity->getPhoto()){ $entity->setPhoto($this->_movePhoto($entity)); } $em->flush($entity); return $this->redirectToRoute('admin_entity_show', array('id' => $entity->getId())); } return $this->render('AppBundle:entity:new.html.twig', array( 'entity' => $entity, 'form' => $form->createView(), )); } # Traitement de la photo protected function _movePhoto($data){ $fs = new Filesystem(); $dir = $this->get('kernel')->getRootDir() . '/../web/uploads/'; $coach_dir = $this->_createEntityFolder($data); # On dĂ©place la photo dans le dossier if($photo = $data->getPhoto()){ $ext = pathinfo($photo, PATHINFO_EXTENSION); $name = 'photo.' . $ext; # Si le fichier existe (il peut ne pas exister dans le cas d'une modification oĂč on uploaderai pas un nouveau fichier) if(file_exists($dir . $photo)){ $fs->copy($dir . $photo, $coach_dir . '/' . $name, true); $fs->remove($dir . $photo); } return $name; } else { return null; } } # CrĂ©ation du dossier pour accueillir l'image protected function _createEntityFolder($data){ $fs = new Filesystem(); $dir = $this->get('kernel')->getRootDir() . '/../web/data/entity/' . $data->getId(); try { $fs->mkdir($dir); } catch (IOExceptionInterface $e) { echo "Une erreur est survenue lors de la crĂ©ation du dossier : ". $e->getPath(); } return $dir; }

The Versions

14/03 2018

dev-master

9999999-dev

Symfony Upload Ajax Bundle

  Sources   Download

MIT

The Requires

 

ajax symfony upload