diff --git a/config/services.yaml b/config/services.yaml index c77d5e2..f77bd4b 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -5,6 +5,7 @@ # https://symfony.com/doc/current/best_practices.html#use-parameters-for-application-configuration parameters: app.jwtsecret : '%env(JWT_SECRET)%' + cv_directory: '%kernel.project_dir%/public/cv' services: # default configuration for services in *this* file _defaults: diff --git a/src/Controller/InternController.php b/src/Controller/InternController.php index 7e08ded..61a14c7 100644 --- a/src/Controller/InternController.php +++ b/src/Controller/InternController.php @@ -13,9 +13,12 @@ use App\Form\InternType; use App\Repository\InternRepository; use Doctrine\ORM\EntityManagerInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; +use Symfony\Component\DependencyInjection\Attribute\Autowire; +use Symfony\Component\Form\Extension\Core\Type\FileType; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Attribute\Route; +use Symfony\Component\Validator\Constraints\File; #[Route('/intern')] final class InternController extends AbstractController @@ -54,6 +57,59 @@ final class InternController extends AbstractController ]); } + #[Route('/{id}/resume', name: 'app_intern_resume', methods: ['GET', 'POST'])] + public function addResume(Request $request, Intern $intern, EntityManagerInterface $entityManager, #[Autowire('%cv_directory%')] string $cvDirectory): Response + { + // Création d'un formulaire spécifique pour le CV plutôt que d'utiliser InternType entier + $form = $this->createFormBuilder($intern) + ->add('resume', FileType::class, [ + 'label' => 'CV : ', + 'mapped' => false, // Ne pas lier directement à l'entité + 'constraints' => [ + new File([ + 'maxSize' => '1024k', + 'mimeTypes' => [ + 'application/pdf', + 'application/x-pdf', + ], + 'mimeTypesMessage' => 'Merci de bien vouloir envoyer un fichier PDF valide.', + ]) + ], + ]) + ->getForm(); + + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $cvFile = $form->get('resume')->getData(); + + if ($cvFile) { + // Génération d'un nom de fichier unique + $newFilename = $intern->getId().'_'.date("d-m-Y").'_'.random_int(0,99999999).'.pdf'; + + // Déplacement vers le répertoire de stockage + $cvFile->move( + $cvDirectory, + $newFilename + ); + + // Mise à jour de l'entité avec le nom du fichier + $intern->setResume($newFilename); + $intern->setResumeName($cvFile->getClientOriginalName()); // Conserver le nom original du fichier + } + + $entityManager->flush(); + + return $this->redirectToRoute('app_intern_index', [], Response::HTTP_SEE_OTHER); + } + + return $this->render('intern/resume.html.twig', [ + 'intern' => $intern, + 'form' => $form->createView(), + ]); + } + + #[Route('/{id}', name: 'app_intern_delete', methods: ['POST'])] public function delete(Request $request, Intern $intern, EntityManagerInterface $entityManager): Response { diff --git a/src/Entity/Intern.php b/src/Entity/Intern.php index daaf428..fce4461 100644 --- a/src/Entity/Intern.php +++ b/src/Entity/Intern.php @@ -12,12 +12,15 @@ use Doctrine\ORM\Mapping as ORM; class Intern extends UserApp { - #[ORM\Column(type: Types::TEXT,nullable: true)] + #[ORM\Column(type: Types::TEXT, length: 255, nullable: true)] private ?string $coverLetter = null; - #[ORM\Column(length: 255,nullable: true)] + #[ORM\Column(type: Types::TEXT, length: 255, nullable: true)] private ?string $resume = null; + #[ORM\Column(type: Types::TEXT, length: 255, nullable: true)] + private ?string $resumeName = null; + /** * @var Collection */ @@ -74,6 +77,18 @@ class Intern extends UserApp return $this; } + public function getResumeName(): ?string + { + return $this->resume; + } + + public function setResumeName(string $resumeName): static + { + $this->resumeName = $resumeName; + + return $this; + } + /** * @return Collection */ diff --git a/src/Form/InternType.php b/src/Form/InternType.php index a2b7931..3e973c2 100644 --- a/src/Form/InternType.php +++ b/src/Form/InternType.php @@ -4,8 +4,11 @@ namespace App\Form; use App\Entity\Intern; use Symfony\Component\Form\AbstractType; +use Symfony\Component\Form\Extension\Core\Type\FileType; +use Symfony\Component\Form\Extension\Core\Type\TextareaType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; +use Symfony\Component\Validator\Constraints\File; class InternType extends AbstractType { @@ -20,7 +23,9 @@ class InternType extends AbstractType ->add('tel') ->add('address') ->add('mail') - ->add('coverLetter') + ->add('coverLetter', TextareaType::class, [ + 'required' => false, + ]) ->add('resume') ; } diff --git a/templates/intern/resume.html.twig b/templates/intern/resume.html.twig new file mode 100644 index 0000000..d8f2682 --- /dev/null +++ b/templates/intern/resume.html.twig @@ -0,0 +1,23 @@ +{% extends 'base.html.twig' %} + +{% block title %}Resume{% endblock %} + +{% block body %} +
+

Ajouter / Modifier le CV

+ +
+ {{ form_start(form, {'attr': {'enctype': 'multipart/form-data'}}) }} + +
+ {{ form_widget(form) }} +
+ + + + {{ form_end(form) }} +
+
+{% endblock %} diff --git a/templates/profile/intern.html.twig b/templates/profile/intern.html.twig index 2447be0..754bff0 100644 --- a/templates/profile/intern.html.twig +++ b/templates/profile/intern.html.twig @@ -8,6 +8,11 @@

Téléphone : {{ app.user.tel }}

Email : {{ app.user.mail }}

+
+ Ajouter / Modifier le CV + +

Vos diplômes :