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

Symfony PHP Discussion :

[Symfony 4][LiipImagine] Utiliser les filtres LiipImagine dans un controller


Sujet :

Symfony PHP

  1. #1
    Nouveau Candidat au Club Avatar de QuantumCobalt
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2020
    Messages : 5
    Points : 1
    Points
    1
    Par défaut [Symfony 4][LiipImagine] Utiliser les filtres LiipImagine dans un controller
    Bonjour,

    je travaille sur un projet de site pour mes cours avec une galerie photo, et j'essaie d'utiliser les filtres de liipImagine à l'intérieur de mon controller qui gère l'upload de mes photos pour pouvoir créer des miniatures des photos que j'upload en même temps,

    j'utilise cette méthode que j'ai vus en cours pour gérer l'upload :

    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
    /**
     * @Route("/new", name="photo_new", methods={"GET","POST"})
     */
    public function new(CategorieRepository  $cat, Request $request): Response
    {
        $photo = new Photo();
        $form = $this->createForm(PhotoType::class, $photo);
        $form->handleRequest($request);
     
        if ($form->isSubmitted() && $form->isValid()) {
            $entityManager = $this->getDoctrine()->getManager();
     
            // Je récupère les informations du fichier uploadé
            $photoUploade = $form->get("nom_photo")->getData();
     
            // Je récupère le nom du fichier uploadé
            $nomPhoto = pathinfo($photoUploade->getClientOriginalName(), PATHINFO_FILENAME);
     
            // Je remplace les espaces dans le nom du fichier
            $nomPhoto = str_replace(" ", "_", $nomPhoto);
     
            // Je rajoute un string unique (pour éviter les fichiers doublons) et l'extension du fichier téléchargé
            $nomPhoto .= uniqid() . "." . $photoUploade->guessExtension();
     
            // J'enregistre le fichier uploadé sur mon serveur, dans le dossier public/images
            $photoUploade->move("images", $nomPhoto);
     
            // Pour enregistrer l'information en BDD
            $photo->setnomPhoto($nomPhoto);
            $entityManager->persist($photo);
            $entityManager->flush();
     
            return $this->redirectToRoute('photo_index');
        }
    Dans la doc de LiipImagine j'ai trouvé ça pour l'utiliser dans mon controller,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    /** @var FilterService */
            $imagine = $this
                ->container
                ->get('liip_imagine.service.filter');
     
            // 1) Simple filter, OR
     
     
            $resourcePath = $imagine->getUrlOfFilteredImage('uploads/foo.jpg', 'my_thumb');
    Je remplaçais alors le 'upload/foo.jpg' par ma variable qui contient le nom du fichier complet et retravailler à savoir $nomPhoto et le 'my_thumb' par le nom de mon filtre Liip, et je lançais un dd($ressourcePath) pour essayer de comprendre qui faire ensuite mais j'obtiens systématiquement l'erreur " Service "liip_imagine.cache.manager" not found "

    Le problème est qu'en grand débutant que je suis, la doc n'est pas suffisamment claire pour moi, j'ai compris qu'il fallait que j'injecte la dépendance dans mon controller (via l'erreur) mais je ne sais pas vraiment comment faire, je ne sais pas quel "use" utiliser, ni si j'appelle correctement ensuite le filtre dont j'ai besoin sur la photo que j'upload pour en créer une version miniature en plus.

    Pourriez vous m'aider à y voir plus clair ?

  2. #2
    Membre expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Points : 3 001
    Points
    3 001
    Par défaut
    Bonjour,

    L'erreur vient de cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $imagine = $this->container->get('liip_imagine.service.filter');
    Le service est mal déclaré dans le fichier services.yaml.

    Néanmoins, c'est étonnant que tu aies trouvé cette documentation, je pense qu'elle date un peu trop, car cette méthode d'appel au conteneur est déprécié. Depuis Symfony 3.4, on recommande l'appel aux services depuis les paramètres du contrôleur par la méthode d'injection de dépendances. C'est plus compliqué à lire qu'à faire, tu l'as déjà fait avec le service "

    CategorieRepository" et le service "Request".

    Tu devrais donc avoir qqchose comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public function new(CategorieRepository  $cat, Request $request, LiipImagineFilter $filter): Response
    Attention LiipImagineFilter est peut-être un nom de classe incorrect, je connais mal cette librairie.

    Je ne sais pas si tu utilises seulement la librairie ou si tu fais appel au "bundle". Je te recommande de lire cette version de la documentation pour l'installation et la configuration.
    Alexandre Tranchant
    Chef de projet AMO pour le Cerema.
    Retrouvez mes articles sur PHP et Symfony

  3. #3
    Nouveau Candidat au Club Avatar de QuantumCobalt
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2020
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Avant tout merci pour ta réponse,

    C'est ça mon soucis, j'ai bien compris qu'il fallait plutôt que j'ajoute un "use" pour la classe puis que je fasse mon injection de dépendance, c'est juste que je ne trouve pas justement le nom de la classe qu'il me faut, ni comment ensuite j'utilise le filtre, je vais regarder dans cette doc mais je crois y être déjà passé sans avoir su ou chercher la dedans

    Par exemple aussi

    je comprends pas vraiment cette partie ci de la doc :

    Then, enable the bundle by adding new Liip\ImagineBundle\LiipImagineBundle() to the bundles array of the registerBundles method in your project's app/AppKernel.php file:
    https://symfony.com/doc/2.0/bundles/...undle-s-routes

    Sachant que j'ai pas eu besoin de faire ça, et j'arrive quand même à appliquer des filtres mais seulement sur la vue (ne sachant justement pas le faire dans le controller)

  4. #4
    Membre expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Points : 3 001
    Points
    3 001
    Par défaut
    Citation Envoyé par QuantumCobalt Voir le message
    Avant tout merci pour ta réponse,
    C'est ça mon soucis, j'ai bien compris qu'il fallait plutôt que j'ajoute un "use" pour la classe puis que je fasse mon injection de dépendance, c'est juste que je ne trouve pas justement le nom de la classe qu'il me faut, ni comment ensuite j'utilise le filtre
    Alors, voici ce que tu peux faire :
    • tu repères le code source ou bien tu fouilles dans ton répertoire vendor,
    • tu recherches le fichier de déclaration des services ( le voici sur github )
    • tu recherches le mot clé, ici c'est liip_imagine.service.filter d'après ton code, (Ligne 135)
    • tu découvres que la classe que tu recherches est celle-ci " Liip\ImagineBundle\Service\FilterService "


    Voilà !

    C'est parfois fastidieux, mais cette méthode à l'avantage de marcher dans la grande majorité des cas !

    Edit : je n'avais pas vu ta seconde remarque. En fait, c'est pour déclarer les nouvelles routes propres à LiipImagineBundle. Je ne connais pas cette librairie, mais je dirais que c'est une méthode pour associer une route, une URL donc, à une miniature. Par exemple /images/miniature/toto.jpg pourrait appeler un contrôleur interne à ce bundle et te renvoyer dynamiquement une miniature de l'image toto.jpg. Je parle au conditionnel, je ne connais pas la librairie.
    Alexandre Tranchant
    Chef de projet AMO pour le Cerema.
    Retrouvez mes articles sur PHP et Symfony

  5. #5
    Nouveau Candidat au Club Avatar de QuantumCobalt
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2020
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Merci pour la méthode c'est gentil, je connaissais pas,

    Par contre je suis surement une bille, mais je comprends toujours pas ensuite comment l'utiliser, je trouve 2 réponses dans le répertoire,

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <service id="liip_imagine.service.filter" class="Liip\ImagineBundle\Service\FilterService">
                <argument type="service" id="liip_imagine.data.manager" />
                <argument type="service" id="liip_imagine.filter.manager" />
                <argument type="service" id="liip_imagine.cache.manager" />
                <argument type="service" id="logger" on-invalid="ignore" />
            </service>

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <service id="Liip\ImagineBundle\Controller\ImagineController" public="true">
                <argument type="service" id="liip_imagine.service.filter" />
                <argument type="service" id="liip_imagine.data.manager" />
                <argument type="service" id="liip_imagine.cache.signer" />
                <argument type="service" id="liip_imagine.controller.config" />
            </service>

    Et, du coup, imaginons que se soit le premier,

    j'ajoute du coup la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    use Liip\ImagineBundle\Service\FilterService;
    Puis ici

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public function new(FilterService $FilterService, CategorieRepository  $cat, Request $request): Response
    Par exemple, et ensuite c'est la que je bloque du coup, je sais pas comment l'utiliser pour appliquer le filtre ensuite..

    J'ai aussi vus ça mais je sais pas du tout si ça va vraiment m'être utile ou non
    ajouter ça dans le services.yaml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Liip\ImagineBundle\Service\FilterService:
            alias: 'liip_imagine.service.filter'

  6. #6
    Membre expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Points : 3 001
    Points
    3 001
    Par défaut Coloration syntaxique
    Tout à l'heure, tu récupérais le service avec cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $imagine = $this->container->get('liip_imagine.service.filter');
    Bon ça ne marchait pas, sûrement car tu avais mal configuré ton service ou mélanger les anciennes et les nouvelles procédures d'installation. Mais tata variable avec ton service se nommait : $imagine.

    Maintenant ta variable se nomme $filterService. Je ne connais pas ton IDE, mais s'il ne te fait pas de complétion automatique, tu risques de galérer, d'autant que je ne suis même pas sûr de ce que tu veux faire.
    J'ai parcouru rapidement la documentation. J'ai l'impression que ton contrôleur marchait et que tu voulais rajouter un code pour générer la miniature en même temps. Et de ce que je comprends, ce bundle ne fonctionne pas de la sorte.

    Du moins, il n'a pas été pensé de la sorte. De ce que je comprends (donc attention, ce que je dis n'est pas paroles d'évangile), Imagine se moque de l'upload, de la taille de l'image. Je ne toucherai pas du tout le contrôleur à ta place.
    C'est au moment où tu dois afficher ton image, que Imagine fait le taf. Dans la vue donc, là, au lieu d'appeler l'asset de ton image, je pense que tu devrais appeler les filtres que Imagine met à ta disposition pour transformer l'image à la volée et balancer une miniature.




    Et normalement tu as un fichier où tu configures tes filtres justement. Le code ci-dessous est issue de la documentation et il crée un filtre nommé "ma_vignette_a_moi" si j'ai bien compris.
    Code yaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # app/config/config.yml
     
    liip_imagine :
        resolvers :
            default :
                web_path : ~
     
        filter_sets :
            cache : ~
     
            # the name of the "filter set"
     
            ma_vignette_a_moi: # <=== ici j'ai renommé pour que ce soit plus clair
                # adjust the image quality to 75%             quality : 75              # list of transformations to apply (the "filters")             filters :                  # create a thumbnail: set size to 120x90 and use the "outbound" mode                 # to crop the image when the size ratio of the input differs                 thumbnail  : { size : [120, 90], mode : outbound }

    Donc dans ta vue, au lieu d'afficher ton image en grand comme cela :
    Code twig : Sélectionner tout - Visualiser dans une fenêtre à part
    <img src="{{ asset('/relative/path/to/image.jpg') }}" />

    Tu lui appliques le filtre :
    Code twig : Sélectionner tout - Visualiser dans une fenêtre à part
    <img src="{{ asset('/relative/path/to/image.jpg') | imagine_filter('ma_vignette_a_moi') }}" />
    Alexandre Tranchant
    Chef de projet AMO pour le Cerema.
    Retrouvez mes articles sur PHP et Symfony

  7. #7
    Nouveau Candidat au Club Avatar de QuantumCobalt
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2020
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Ok alors, j'ai changé pas mal de trucs, j'ai finis par faire fonctionner quelque chose mais pas suffisant, au final je pense que c'est juste pas de mon niveau ou je ne sais pas,

    j'ai réussi à faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public function new(CacheManager $cacheManager, CategorieRepository  $cat, Request $request): Response
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $minPhoto = $cacheManager->getBrowserPath($nomPhoto, 'carre');
                dd($minPhoto);
    sauf que évidemment, bah, ça récupère juste le path, aucune photo n'est créée j'ai le chemin ou elle irait s'enregistrer mais aucune idée de comment la créer au final je tourne un peu en rond j'arrive pas à mettre la main sur la bonne classe/la bonne méthode pour appliquer le filtre et créer la photo miniature..

    Et pour te répondre à propos de la vue, sa marche déjà bien en appliquant le filtre sur la vue, le problème c'est que j'ai une galerie de plusieurs photos, donc appliquer le filtre avec une boucle sur la vue c'est pas possible ça me prend trop de temps à charger, pour ça que j'aurais voulu appliquer le filtre sur la photo au moment de l'upload et créer une seconde photo sur laquelle le filtre s'est appliqué

  8. #8
    Nouveau Candidat au Club Avatar de QuantumCobalt
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2020
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    C'est BON j'ai trouvé ma solution bon dieu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $minPhoto = $FilterService->getUrlOfFilteredImage("images/".$nomPhoto, 'carre');
    Fallait que j'injecte une autre classe j'avais pas la bonne, et avec cette méthode ma miniature se fabrique, me reste "plus" qu'à renommer celle ci, l'enregistrer dans un autre dossier que celui de base de liip et l'ajouter à ma bdd dans ma table pour pouvoir l'afficher ensuite indépendamment de l'autre

  9. #9
    Membre expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Points : 3 001
    Points
    3 001
    Par défaut
    Super ! Merci d'avoir partagé ta réponse !

    PS Peux-tu cliquer sur le bouton Résolu ?

    Merci !
    Alexandre Tranchant
    Chef de projet AMO pour le Cerema.
    Retrouvez mes articles sur PHP et Symfony

Discussions similaires

  1. Réponses: 5
    Dernier message: 05/10/2006, 10h18
  2. Utiliser les touches flèche dans un controle Edit
    Par Henri dans le forum Windows
    Réponses: 6
    Dernier message: 26/05/2006, 22h32
  3. Réponses: 2
    Dernier message: 12/05/2006, 11h07
  4. Utiliser les forms Access dans un projet ADP -> SQL SERVE
    Par _developpeur_ dans le forum Projets ADP
    Réponses: 12
    Dernier message: 09/12/2005, 12h37
  5. Réponses: 2
    Dernier message: 17/09/2005, 17h43

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