IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Plugins PHP Discussion :

[Symfony5.4 - EasyAdmin3] Redimensionner et convertir format d'une image upload.


Sujet :

Plugins PHP

  1. #1
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2023
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2023
    Messages : 37
    Par défaut [Symfony5.4 - EasyAdmin3] Redimensionner et convertir format d'une image upload.
    Bonjour à tous,

    Je suis en train de travailler sur un projet en Symfony 5.4 avec le bundle EasyAdmin 3.
    Voici mon controller CRUD :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    <?php
     
    namespace App\Controller\Admin;
     
    use App\Entity\FormulairePhotos;
    use App\Entity\FormulaireEtapes;
    use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
    use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
    use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
    use EasyCorp\Bundle\EasyAdminBundle\Config\Actions;
    use EasyCorp\Bundle\EasyAdminBundle\Field\IdField;
    use EasyCorp\Bundle\EasyAdminBundle\Field\ImageField;
    use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
    use EasyCorp\Bundle\EasyAdminBundle\Field\UrlField;
    use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField;
    use EasyCorp\Bundle\EasyAdminBundle\Form\Type\FileUploadType;
    use Doctrine\ORM\EntityManagerInterface;
     
    class FormulairePhotosCrudController extends AbstractCrudController
    {
        public static function getEntityFqcn(): string
        {
            return FormulairePhotos::class;
        }
     
    	public function configureCrud(Crud $crud): Crud
    	{
    		return $crud->setEntityLabelInSingular('Formulaire client')->setEntityLabelInPlural('Formulaires clients');
    	}
     
    	 public function configureFields(string $pageName): iterable
         {
    		return [
                IdField::new('id')->onlyOnIndex(),
    			AssociationField::new('formulaireEtapes')->setFormTypeOption('choice_label', 'Libelle_formulaire_etapes'),
    			ImageField::new('chemin_formulaire_photos', 'Photo des étapes')->setFormType(FileUploadType::class)->setBasePath('images/formulaires_clients')->setUploadDir('public/images/formulaires_clients')->setColumns(6)->setFormTypeOptions(['attr' => ['accept' => 'application/jpg']])->setUploadedFileNamePattern('[name].[extension]')/*->setFormTypeOption('upload_delete', function(File $file) {})*/,
            ];
        }
    }
    Lorsqu'on upload une image, je souhaiterais que cette dernière soit redimensionnée et surtout converti au format .webp.
    Cela est-il faisable ? Si oui, pouvez-vous m'indiquer comment puis-je obtenir le résultat souhaité ?

    Merci par avance pour votre aide !

  2. #2
    Membre émérite
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 421
    Par défaut
    Bonjour,

    Pour Symfony, tu peux créer ton propre service de redimensionnement et conversion d'une image, puis utiliser ce service dans ton contrôleur comme n'importe quel autre service.
    https://symfony.com/doc/5.x/service_...using-services

    Pour créer ta classe service, tu peux utiliser une bibliothèque permettant la manipulation des images en PHP :
    - les fonctions de l'extension GD : https://www.php.net/manual/fr/book.image.php
    - la classe Imagick : https://www.php.net/manual/fr/book.imagick.php
    - la biliothèque Imagine : https://github.com/php-imagine/Imagine
    - autres...

    Tu peux trouver un exemple de service de redimensionnement utilisant Imagine dans le book Symfony : https://symfony.com/doc/6.2/the-fast...s-avec-imagine

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2023
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2023
    Messages : 37
    Par défaut
    Bonjour Pytet,

    Merci pour ton retour.

    Concernant l'exemple de service de redimensionnement utilisant Imagine dans le book Symfony, je vois que la documentation n'est pas accessible pour la version 5.4 de Symfony. Cela signifie que l'exemple est compatible que pour la 6.2 ?
    Ensuite, est-il possible d'utiliser un service sur les controllers CRUD d'EasyAdmin ? Si oui, peux-tu me montrer un exemple pour faire cela s'il te plaît ?

    Merci par avance !

  4. #4
    Membre émérite
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 421
    Par défaut
    Commence par créer un service dans ton application, c-a-d créer une classe (namespace App\Service par convention) avec le nom que tu veux et au moins une méthode publique.
    Pour faire simple, déclenche juste une exception pour vérifier que le service est bien appelé au point suivant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
    // src/Service/ImageOptimizer.php
    namespace App\Service;
     
    class ImageOptimizer
    {
        public function doSomething(string $imagePath): void
        {
            throw new \Exception('TODO ! ' . $imagePath);
        }
    }
    Injecte ce service dans ton contrôleur en créant une propriété de classe et le constructeur (sans oublier le use) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    <?php
     
    namespace App\Controller\Admin;
     
    use App\Entity\FormulairePhotos;
    use App\Entity\FormulaireEtapes;
    use App\Service\ImageOptimizer;
    // use [...]
     
    class FormulairePhotosCrudController extends AbstractCrudController
    {
        private $imageOptimizer;
     
        public function __construct(ImageOptimizer $imageOptimizer)
        {
            $this->imageOptimizer = $imageOptimizer;
        }
     
        public static function getEntityFqcn(): string
        {
            return FormulairePhotos::class;
        }
     
        // ... configureCrud, configureFields...
    }
    Pour personnaliser les actions de EasyAdmin, tu peux soit utiliser les évènements déclenchés par le bundle, soit surcharger les méthodes protected de AbstractCrudController dans ton contrôleur.

    Essaye par exemple de surcharger la méthode persistEntity (cette méthode est appelée lors de l'enregistrement d'une nouvelle entité créée via l'interface EasyAdmin, il faudra aussi surement surcharger updateEntity qui est appelée lors de l'enregistrement d'une entité existante, voir le code de AbstractCrudController pour mieux comprendre cette classe).
    Dans cette méthode, tu peux appeler ton service puis appeler la méthode AbstractCrudController::persistEntity() pour enregistrer normalement l'entité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class FormulairePhotosCrudController extends AbstractCrudController
    {
        // [...]
     
        public function persistEntity(EntityManagerInterface $entityManager, $entityInstance): void
        {
            $this->imageOptimizer->doSomething($entityInstance->getCheminFormulairePhotos());
     
            parent::persistEntity($entityManager, $entityInstance);
        } 
    }
    Essaye de créer une entité via l'interface d'EasyAdmin : si tu vois une exception "TODO !", c'est que ton service est bien appelé avant de persister l'entité.

    Le paramètre $entityInstance dans la méthode persistEntity() correspond à l'objet FormulairePhotos qui va être enregistré, tu peux donc utiliser les méthodes de ton entité sur cet objet (getCheminFormulairePhotos pour récupérer le nom de l'image uploadé et setCheminFormulairePhotos pour mettre à jour le nom de l'image après conversion par exemple).

    Tu peux maintenant créer ta vraie fonction pour le traitement de l'image dans ton service.

  5. #5
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2023
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2023
    Messages : 37
    Par défaut
    Bonjour Pytet,

    Merci pour ton retour et toutes les explications claires et précises, ce qui m'a permis de mettre en place ce dont j'avais besoin : redimensionnée et surtout converti au format .webp.

    Bonne continuation à toi et encore un grand merci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 02/10/2007, 19h17
  2. Vérifier le format d'une image
    Par olivier94 dans le forum Langage
    Réponses: 6
    Dernier message: 19/02/2007, 15h06
  3. Redimensionnement fenêtre en fonction d'une image
    Par skyjoe dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 17/12/2006, 13h54
  4. Trouver le format d'une image
    Par blaiseac dans le forum Autres Logiciels
    Réponses: 4
    Dernier message: 27/09/2005, 22h17
  5. [VisualC++] Changer le format d'une image
    Par dananchet dans le forum MFC
    Réponses: 1
    Dernier message: 06/05/2005, 15h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo