From 6f208133e3451394d9c9edbb65f876e08d8a4593 Mon Sep 17 00:00:00 2001 From: Zakarya BENJABALLAH Date: Thu, 9 Feb 2023 10:23:12 +0100 Subject: [PATCH 1/3] =?UTF-8?q?Ajout=20relation=20=C3=A9l=C3=A8ve=20atelie?= =?UTF-8?q?r=20pour=20inscription?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 9 +++++- migrations/Version20230209092109.php | 33 ++++++++++++++++++++++ src/Entity/Atelier.php | 39 +++++++++++++++++++++++++- src/Entity/User.php | 42 +++++++++++++++++++++++----- 4 files changed, 114 insertions(+), 9 deletions(-) create mode 100644 migrations/Version20230209092109.php diff --git a/README.md b/README.md index d807762..8d6ae50 100644 --- a/README.md +++ b/README.md @@ -78,4 +78,11 @@ symfony console d:f:l Pas de commandes, juste du code dans AtelierController ### Question 10 et 11 -Pas de commandes. \ No newline at end of file +Pas de commandes. + +### Question 12 +```bash +symfony console make:entity +symfony console make:migration +symfony console d:m:m +``` \ No newline at end of file diff --git a/migrations/Version20230209092109.php b/migrations/Version20230209092109.php new file mode 100644 index 0000000..fc17dda --- /dev/null +++ b/migrations/Version20230209092109.php @@ -0,0 +1,33 @@ +addSql('CREATE TABLE user_atelier (user_id INTEGER NOT NULL, atelier_id INTEGER NOT NULL, PRIMARY KEY(user_id, atelier_id), CONSTRAINT FK_B9B60629A76ED395 FOREIGN KEY (user_id) REFERENCES user (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE, CONSTRAINT FK_B9B6062982E2CF35 FOREIGN KEY (atelier_id) REFERENCES atelier (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE)'); + $this->addSql('CREATE INDEX IDX_B9B60629A76ED395 ON user_atelier (user_id)'); + $this->addSql('CREATE INDEX IDX_B9B6062982E2CF35 ON user_atelier (atelier_id)'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('DROP TABLE user_atelier'); + } +} diff --git a/src/Entity/Atelier.php b/src/Entity/Atelier.php index 1bbe61e..2035da6 100644 --- a/src/Entity/Atelier.php +++ b/src/Entity/Atelier.php @@ -3,6 +3,8 @@ namespace App\Entity; use App\Repository\AtelierRepository; +use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\Common\Collections\Collection; use Doctrine\ORM\Mapping as ORM; #[ORM\Entity(repositoryClass: AtelierRepository::class)] @@ -19,10 +21,18 @@ class Atelier #[ORM\Column(length: 1024, nullable: true)] private ?string $description = null; - #[ORM\ManyToOne(inversedBy: 'ateliersFormÃÃÃes')] + #[ORM\ManyToOne(inversedBy: 'ateliersForm���es')] #[ORM\JoinColumn(nullable: false)] private ?User $instructeur = null; + #[ORM\ManyToMany(targetEntity: User::class, mappedBy: 'formationsSuivies')] + private Collection $eleves; + + public function __construct() + { + $this->eleves = new ArrayCollection(); + } + public function getId(): ?int { return $this->id; @@ -63,4 +73,31 @@ class Atelier return $this; } + + /** + * @return Collection + */ + public function getEleves(): Collection + { + return $this->eleves; + } + + public function addEleve(User $eleve): self + { + if (!$this->eleves->contains($eleve)) { + $this->eleves->add($eleve); + $eleve->addFormationsSuivie($this); + } + + return $this; + } + + public function removeEleve(User $eleve): self + { + if ($this->eleves->removeElement($eleve)) { + $eleve->removeFormationsSuivie($this); + } + + return $this; + } } diff --git a/src/Entity/User.php b/src/Entity/User.php index 507d85b..98739b6 100644 --- a/src/Entity/User.php +++ b/src/Entity/User.php @@ -38,11 +38,15 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface private ?string $prenom = null; #[ORM\OneToMany(mappedBy: 'instructeur', targetEntity: Atelier::class, orphanRemoval: true)] - private Collection $ateliersFormÃÃÃes; + private Collection $ateliersForm���es; + + #[ORM\ManyToMany(targetEntity: atelier::class, inversedBy: 'eleves')] + private Collection $formationsSuivies; public function __construct() { - $this->ateliersFormÃÃÃes = new ArrayCollection(); + $this->ateliersForm���es = new ArrayCollection(); + $this->formationsSuivies = new ArrayCollection(); } public function getId(): ?int @@ -143,15 +147,15 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface /** * @return Collection */ - public function getAteliersFormÃÃÃes(): Collection + public function getAteliersForm���es(): Collection { - return $this->ateliersFormÃÃÃes; + return $this->ateliersForm���es; } public function addAteliersFormE(Atelier $ateliersFormE): self { - if (!$this->ateliersFormÃÃÃes->contains($ateliersFormE)) { - $this->ateliersFormÃÃÃes->add($ateliersFormE); + if (!$this->ateliersForm���es->contains($ateliersFormE)) { + $this->ateliersForm���es->add($ateliersFormE); $ateliersFormE->setInstructeur($this); } @@ -160,7 +164,7 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface public function removeAteliersFormE(Atelier $ateliersFormE): self { - if ($this->ateliersFormÃÃÃes->removeElement($ateliersFormE)) { + if ($this->ateliersForm���es->removeElement($ateliersFormE)) { // set the owning side to null (unless already changed) if ($ateliersFormE->getInstructeur() === $this) { $ateliersFormE->setInstructeur(null); @@ -169,4 +173,28 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface return $this; } + + /** + * @return Collection + */ + public function getFormationsSuivies(): Collection + { + return $this->formationsSuivies; + } + + public function addFormationsSuivie(atelier $formationsSuivie): self + { + if (!$this->formationsSuivies->contains($formationsSuivie)) { + $this->formationsSuivies->add($formationsSuivie); + } + + return $this; + } + + public function removeFormationsSuivie(atelier $formationsSuivie): self + { + $this->formationsSuivies->removeElement($formationsSuivie); + + return $this; + } } From 022156c06a2e6b9ea0b1bac26a3f38036db68ad9 Mon Sep 17 00:00:00 2001 From: Zakarya BENJABALLAH Date: Thu, 9 Feb 2023 10:27:55 +0100 Subject: [PATCH 2/3] Ajout role apprenti --- config/packages/security.yaml | 1 + src/Entity/User.php | 1 + 2 files changed, 2 insertions(+) diff --git a/config/packages/security.yaml b/config/packages/security.yaml index 507945f..8196f0a 100644 --- a/config/packages/security.yaml +++ b/config/packages/security.yaml @@ -11,6 +11,7 @@ security: property: email role_hierarchy: ROLE_INSTRUCTOR: ROLE_USER + ROLE_APPRENTI: ROLE_USER firewalls: dev: pattern: ^/(_(profiler|wdt)|css|images|js)/ diff --git a/src/Entity/User.php b/src/Entity/User.php index 98739b6..e56617c 100644 --- a/src/Entity/User.php +++ b/src/Entity/User.php @@ -85,6 +85,7 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface // guarantee every user at least has ROLE_USER $roles[] = 'ROLE_USER'; $roles[] = 'ROLE_INSTRUCTOR'; + $roles[] = 'ROLE_APPRENTI'; return array_unique($roles); } From 6121abb241cde3b7b22216a1315d9e5f583f4568 Mon Sep 17 00:00:00 2001 From: Zakarya BENJABALLAH Date: Thu, 9 Feb 2023 10:57:57 +0100 Subject: [PATCH 3/3] =?UTF-8?q?Ajout=20inscription=20et=20d=C3=A9sinscript?= =?UTF-8?q?ion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Controller/AtelierController.php | 21 +++++++++++++++++++++ templates/atelier/show.html.twig | 19 ++++++++++++++----- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/src/Controller/AtelierController.php b/src/Controller/AtelierController.php index 711ce0e..92e6354 100644 --- a/src/Controller/AtelierController.php +++ b/src/Controller/AtelierController.php @@ -6,6 +6,7 @@ use App\Entity\Atelier; use App\Form\AtelierType; use App\Repository\AtelierRepository; use App\Services\MarkdownAtelier; +use Doctrine\Persistence\ManagerRegistry; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; @@ -59,6 +60,7 @@ class AtelierController extends AbstractController { return $this->render('atelier/show.html.twig', [ 'atelier' => $markdownAtelier->parse($atelier), + 'inscrit' => $atelier->getEleves()->contains($this->getUser()), ]); } @@ -99,4 +101,23 @@ class AtelierController extends AbstractController return $this->redirectToRoute('app_atelier_index', [], Response::HTTP_SEE_OTHER); } + + #[IsGranted('ROLE_APPRENTI')] + #[Route('/{id}/inscrire', name: 'app_atelier_inscription', methods: ['POST'])] + public function inscription(Request $request, Atelier $atelier, ManagerRegistry $doctrine): Response + { + $entityManager = $doctrine->getManager(); + $atelier->addEleve($this->getUser()); + $entityManager->flush(); + return $this->redirectToRoute('app_atelier_show', ["id"=>$atelier->getId()], Response::HTTP_SEE_OTHER); + } + #[IsGranted('ROLE_APPRENTI')] + #[Route('/{id}/desinscrire', name: 'app_atelier_desinscrire', methods: ['POST'])] + public function desinscrire(Request $request, Atelier $atelier, ManagerRegistry $doctrine): Response + { + $entityManager = $doctrine->getManager(); + $atelier->removeEleve($this->getUser()); + $entityManager->flush(); + return $this->redirectToRoute('app_atelier_show', ["id"=>$atelier->getId()], Response::HTTP_SEE_OTHER); + } } diff --git a/templates/atelier/show.html.twig b/templates/atelier/show.html.twig index 70fdad9..f3c7336 100644 --- a/templates/atelier/show.html.twig +++ b/templates/atelier/show.html.twig @@ -21,19 +21,28 @@ Email instructeur - {{ atelier.instructeur.email}} + {{ atelier.instructeur.email }}
{% if app.user and app.user == atelier.instructeur %} - Modifier + Modifier {% endif %} Retour à la liste {% if app.user and app.user == atelier.instructeur %} - {{ include('atelier/_delete_form.html.twig') }} + {{ include('atelier/_delete_form.html.twig') }} + {% endif %} + {% if not inscrit %} +
+ +
+ {% else %} +
+ +
{% endif %}
-{% endblock %} - +{% endblock %} \ No newline at end of file