Partage
  • Partager sur Facebook
  • Partager sur Twitter

Insertion document en base. Symfony 4

Bien entendu seulement le nom

Sujet résolu
20 novembre 2019 à 14:57:15

Bonjour, je suis sur un problème technique, je souhaite insérer le nom du chemin d'un dossier "upload" lors d'un envoie de formulaire.

Je vous explique, le client peut remplir un formulaire (nom, societe, telephone, email, document) 

L'envoie en base ce fait correctement mais le fichier ne va pas au bon endroit, et je me retrouve avec cette adresse : C:\xampp\tmp\phpFF7E.tmp

Je suis sur Symfony 4, j'utilise easy admin et vichuploader.

Voici les codes: 

app/config/packages/vich_uploader.yaml

vich_uploader:
    db_driver: orm

    mappings:
        product_image:
            uri_prefix: '%kernel.project_dir%/public/documents'
            upload_destination: '%kernel.project_dir%/public/documents'
app/config/packages/easy_admin.yaml

easy_admin:
    entities:
        Contact_clients:
            class: App\Entity\Contact
            list:
                fields:
                    - { property: 'nom'}
                    - { property: 'societe'}
                    - { property: 'numero'}
                    - { property: 'email'}
                    - { property: 'message'}
                    - { property: 'document', template: 'contract.html.twig', base_path: '%kernel.project_dir%/documents' }

    design:
        form_theme:
            - '@EasyAdmin/form/bootstrap_4.html.twig'
            - '@VichUploader/Form/fields.html.twig'

app/config/services.yaml

parameters:
    document_directory: '%kernel.project_dir%/documents'
app/src/controller/maincontroller

   /**
     * @Route("/", name="main")
     */
    public function index(Request $request, ObjectManager $manager)
    {


        $contact = new Contact();
        $formContact = $this->createForm(ContactType::class, $contact);

        $formContact->handleRequest($request);
        if ($formContact->isSubmitted() && $formContact->isValid()) {

            $file = $formContact->get('document')->getData();
            $file->move($this->getParameter('document_directory'));
            $manager->persist($contact);
            dump($file);
            $manager->flush();
            $this->addFlash('notice', 'Post Submitted Successfully!!!');
//            return $this->redirectToRoute('main');
        }

        return $this->render('index/index.html.twig', [
            'controller_name' => 'MainController',
            "formContact" => $formContact->createView(),


        ]);
    }
  app/src/form/ContactType

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('nom')
            ->add('societe')
            ->add('numero')
            ->add('email')
            ->add('document', FileType::class, array('label'=>'Si vous avez des fichiers à me donnez..'))
            ->add('message')
        ;
    }

Merci d'avance de votre aide.





  • Partager sur Facebook
  • Partager sur Twitter
20 novembre 2019 à 15:02:13

Salut,

après ton $file->move, il ne faudrait pas renseigner l'entité $contact avec le nouveau chemin de $file ???

-
Edité par christouphe 20 novembre 2019 à 15:05:07

  • Partager sur Facebook
  • Partager sur Twitter
20 novembre 2019 à 16:03:34

Merci de ta réponse, je ne comprend pas, aurais tu un exemple ?

Merci.

  • Partager sur Facebook
  • Partager sur Twitter
20 novembre 2019 à 16:35:01

Dans le controleur:

app/src/controller/maincontroller
 
   /**
     * @Route("/", name="main")
     */
    public function index(Request $request, ObjectManager $manager)
    {
 
 
        $contact = new Contact();
        $formContact = $this->createForm(ContactType::class, $contact);
 
        $formContact->handleRequest($request);
        if ($formContact->isSubmitted() && $formContact->isValid()) {
 
            $file = $formContact->get('document')->getData();
            $file->move($this->getParameter('document_directory'));

//ici il faut renseigner le chap document de l'entité contact
//a toi de voir si document est un string en base (c'et ce que tu as dit)
//et comment récupérer le chemin à partir de $file
$contact->setDocument($file->getpath());

            $manager->persist($contact);
            dump($file);
            $manager->flush();
            $this->addFlash('notice', 'Post Submitted Successfully!!!');
//            return $this->redirectToRoute('main');
        }
 
        return $this->render('index/index.html.twig', [
            'controller_name' => 'MainController',
            "formContact" => $formContact->createView(),
 
 
        ]);
    }



  • Partager sur Facebook
  • Partager sur Twitter
21 novembre 2019 à 12:59:50

Bonjour, je n'ai toujours pas compris MAIS j'ai avancer (édit: et réussi !? ) ! 

Voici le code : 

 $contact = new Contact();
        $formContact = $this->createForm(ContactType::class, $contact);

        $formContact->handleRequest($request);
        if ($formContact->isSubmitted() && $formContact->isValid()) {
            $file =$contact->getDocument();
            $fileName= md5(uniqid()).'.'.$file->guessExtension();
            $file = $formContact->get('document')->getData();
            $file->move($this->getParameter('document_directory'), $fileName);
            $contact->setNom($fileName);
            $manager->persist($contact);
            $manager->flush();
            $this->addFlash('notice', 'Post Submitted Successfully!!!');
//            return $this->redirectToRoute('main');

Alors l'import ce fait bien dans mon dossier "public/documents" et j'ai la bonne extension. 

En base j'ai bien le nom du fichier, maintenant il me reste à afficher les documents dans le back office, car pour l'instant le chemin est incomplet, et je ne sais pas comment régler cela.

No route found for "GET /admin/c997fd476ae2c50fd0e19181f1cd99e0.pdf" (from "http://localhost/bluedev/public/admin/?action=list&entity=Contact_clients")


Je pense que je peut mettre le sujet en résolu, qu'en pensez vous ? 

-
Edité par Jeffbzh3 21 novembre 2019 à 13:14:55

  • Partager sur Facebook
  • Partager sur Twitter
21 novembre 2019 à 13:29:41

Salut !

Pour ma part, dans ce genre de cas, j'ai créé un écouteur Doctrine qui redéfinit le chemin absolu du fichier dans l'entité lors de la récupération depuis la base de données. Le code est ici. C'est encore du Symfony 3.4, mais je vais pouvoir passer à du 5 d'ici la semaine prochaine. Ça ne changera pas grand chose, sinon que je souhaite convertir à de vrais EntityListener plutôt que de simples écouteurs globaux Doctrine, histoire de ne pas avoir à tester moi quelle classe a été manipulée pour savoir quoi lancer — je suis toujours incapable de les faire fonctionner sous 3.4.

-
Edité par Ymox 30 décembre 2019 à 23:16:42

  • Partager sur Facebook
  • Partager sur Twitter
21 novembre 2019 à 13:30:09

$contact->seNom() c'est le nom du contact, pas le nom du document... En plus tu nous montres pas l'entité Contact, donc nous ne sommes qu'en supposition là
  • Partager sur Facebook
  • Partager sur Twitter
21 novembre 2019 à 13:45:31

Merci de vos réponse, Ymox je suis encore très novice je sort d'un bac +2 (6 mois d'école ^^" ) donc je comprend pas grand chose !

Christouph, oui j'ai modifier, je m'en suis rendu compte de mon erreur.

Donc pour l'instant l'insertion ce fait comme je le veux, j'ai bien le nom du document en base, mais le chemin du liens n'est pas correct, sur la doc de Symfony, il disent de faire un template dédier a la visualisation de document 

app/template/contract.html.twig

<a href="{{ field_options.base_path ~ '/' ~ value}}">Voir la pièce jointe (PDF)</a>
app/config/packages/easy_admin.yaml

easy_admin:
    entities:
        Contact_clients:
            class: App\Entity\Contact
            list:
                fields:
                     [...]
                    - { property: 'document', template: 'contract.html.twig', base_path: '%kernel.project_dir%' }

et le chemin que j'obtiens est celui ci :

href="C:\xampp\htdocs\bluedev/5fb1b4b5cda5434d26b1e31bc75a014e.pdf"

puis dans la barre de recherche une fois cliquer :

http://localhost/bluedev/public/admin/C:/xampp/htdocs/bluedev/5fb1b4b5cda5434d26b1e31bc75a014e.pdf

Sachant que le liens ne marche pas, je suis obligé d'aller dans l'inspecteur pour pouvoir cliquer sur le liens.

Le chemin correct je pense, serais :

http://localhost/bluedev/public/documents/5fb1b4b5cda5434d26b1e31bc75a014e.pdf






  • Partager sur Facebook
  • Partager sur Twitter
21 novembre 2019 à 13:56:37

Ton problème vient du fait que tu mets le chemin ABSOLU du serveur (dans ton cas c:\....blablabla) alors qu'il faut le chemin ADSOLU de l'application http://blablablabla/blabla/monPdf.pdf

  • Partager sur Facebook
  • Partager sur Twitter
21 novembre 2019 à 14:41:21

D'accord, merci, je vais plancher la dessus =) Merci.

EDIT :

J'ai réussi : 

 $formContact->handleRequest($request);
        if ($formContact->isSubmitted() && $formContact->isValid()) {
            $file =$contact->getDocument();
            $fileName='/bluedev/public/documents/'.md5(uniqid()).'.'.$file->guessExtension();
            $file = $formContact->get('document')->getData();
            $file->move($this->getParameter('document_directory'), $fileName);
            $contact->setDocument($fileName);
            $manager->persist($contact);
            $manager->flush();
            $this->addFlash('notice', 'Post Submitted Successfully!!!');

A la ligne 4 j'ai rajouter : " '/bluedev/public/documents/'. "

Et voilà ça marche =) 

Merci de votre aide !!  :D

-
Edité par Jeffbzh3 21 novembre 2019 à 19:15:17

  • Partager sur Facebook
  • Partager sur Twitter
23 avril 2023 à 14:21:54

Bonjour ,

Comment insérer des document ou de audio sur le EasyAdmin 4 ,pour le Symfony 6

  • Partager sur Facebook
  • Partager sur Twitter
23 avril 2023 à 15:57:39

Bonjour,

Le message qui suit est une réponse automatique activée par un membre de l'équipe. Les réponses automatiques leur permettent d'éviter d'avoir à répéter de nombreuses fois la même chose, ce qui leur fait gagner du temps et leur permet de s'occuper des sujets qui méritent plus d'attention.
Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter la personne en question par Message Privé.

Pour plus d'informations, nous vous invitons à lire les règles générales du forum

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter

Pas d'aide concernant le code par MP, le forum est là pour ça :)