Form checkbox

Par Beezkit, il y a 6 ans


Bonjour,

Je souhaiterais ajouter une checkbox (boolean) pour chaque utilisateur affiché dans mon formulaire, mais j'avoue je ne sais pas du tout comment m'y prendre. Quelqu'un serait m'expliquer cela ?

Merci à tous.

11 réponses

Beezkit, il y a 6 ans

Bonjour,

Malgré cela je n'y arrive pas, peut etre je m'y prend mal.
Je m'explique j'ai une liste d'eleve, pour chaque éléve je dois noter leurs présence.

Voici mon entité de feuille de présence :

<?php namespace App\Entity; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity(repositoryClass="App\Repository\TimesheetRepository") */ class Timesheet { /** * @ORM\Id() * @ORM\GeneratedValue() * @ORM\Column(type="integer") */ private $id; /** * @ORM\Column(type="datetime") * * @var \DateTime */ private $createdAt; /** * @ORM\ManyToOne(targetEntity="App\Entity\School") * @ORM\JoinColumn(nullable=false) */ private $Schools; /** * @ORM\ManyToOne(targetEntity="App\Entity\Classroom") * @ORM\JoinColumn(nullable=false) */ private $Classrooms; /** * @ORM\ManyToMany(targetEntity="App\Entity\Student", inversedBy="timesheets") */ private $Students; /** * @ORM\ManyToOne(targetEntity="App\Entity\Sessions", inversedBy="timesheets") * @ORM\JoinColumn(nullable=false) */ private $Sessions; /** * @ORM\Column(type="boolean") */ private $presence; public function __construct() { $this->createdAt = new \DateTime('now'); $this->Students = new ArrayCollection(); } public function getId(): ?int { return $this->id; } public function getCreatedAt(): ?\DateTimeInterface { return $this->createdAt; } public function setCreatedAt(\DateTimeInterface $createdAt): self { $this->createdAt = $createdAt; return $this; } public function getSchools(): ?School { return $this->Schools; } public function setSchools(?School $Schools): self { $this->Schools = $Schools; return $this; } public function getClassrooms(): ?Classroom { return $this->Classrooms; } public function setClassrooms(?Classroom $Classrooms): self { $this->Classrooms = $Classrooms; return $this; } /** * @return Collection|Student[] */ public function getStudents(): Collection { return $this->Students; } public function addStudent(Student $student): self { if (!$this->Students->contains($student)) { $this->Students[] = $student; } return $this; } public function removeStudent(Student $student): self { if ($this->Students->contains($student)) { $this->Students->removeElement($student); } return $this; } public function getSessions(): ?Sessions { return $this->Sessions; } public function setSessions(?Sessions $Sessions): self { $this->Sessions = $Sessions; return $this; } public function getPresence(): ?bool { return $this->presence; } public function setPresence(bool $presence): self { $this->presence = $presence; return $this; } }

1ere question, est ce que mon entité est bonne ?

arcoss 3x, il y a 6 ans

Bonjour,
Je ne vois pas d'erreur dans ton entité mais j'ai une question tu utilises bootstrap ?

Devdeb22, il y a 6 ans

Oui ton entité est bonne, maintenant il te faut faire le formType qui rempli cet entité

Beezkit, il y a 6 ans

Super merci, par contre j'arrive pas dans mon formType a faire répeter autant de fois ma checkbox "presence" que j'ai d'utilisateur.

<?php namespace App\Form; use App\Entity\Timesheet; use App\Entity\Student; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Component\Form\Extension\Core\Type\CheckboxType; use Symfony\Component\Form\Extension\Core\Type\CollectionType; class TimesheetType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('presence', CheckboxType::class, [ 'label' => 'Présent', 'required' => false, 'attr' => ['class' => 'form-control'], 'value' => 0, ]) ; } public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults([ ]); } }
Devdeb22, il y a 6 ans

Attends si j'ai bien compris tu veux noter la présence de Chaque utilisateur et la stocker dans la bdd ?

Beezkit, il y a 6 ans

En gros je veux lister mes users dans mon formulaire et ajouter à chacun d'eux une checkbox pour définir leurs présence ou non.
Donc oui c'est ce que je souhaite.

Devdeb22, il y a 6 ans

ok je vois que ta variable students dans ton entité Timesheet est en relation ManyToMany or un étudiant ne peut être présent que dans une seule classe à la fois.
Donc je te conseille de changer cette relation ManyToMany en ManyToOne en tout cas c'est ce que personnellement j'aurai fait.

Ensuite une fois cela fait
Il faut faire 3 choses
1 créer un controlleur qui récupère l'ensemble des éléves pour les envoyer à la vue.
2 Dans la vue vue, créer une boucle twig qui affiche le formulaire (Un formulaire classique) avec chaque élève.
Et enfin 3 créer une méthode dans le controlleur qui récupère la requete envoyer par le formulaire et la traite.

De cette manière tu vas pouvoir saisir tous tes élèves d'un coup et enregister la présence ou non de tous les élèves d'un coup.

Beezkit, il y a 6 ans

J'ai vu qu'il y a aussi la relation manyToMany avec attributs ? qu'en pense tu ? Car j'ai exactement le même soucis pour toujours une liste d'eleves a qui je dois attribuer une note à chacun d'entre eux

Devdeb22, il y a 6 ans

Oui je comprends, la question est : Est-ce que tu veux associer un attribut à la présence (exemple une note à la présence) car si tu ne veux pas associer un attribut à la présence, une relation relation ManyToMany avec attributs ne servirai pas à grand chose pour la présence.
D'autant plus q'une relation ManyToMany avec attributs n'est rien d'autre qu'une relation OneToManyToOne.

Dis plus simplement, c'est comme si tu avais 3 tables :

Une table Eleve
Une table NoteEleve
Une table Note
Il y a une relation OneToMany entre Eleve et NoteEleve
Et une relation une relation ManyToOne entre NoteEleve et Note

Ainsi la table NoteEleve est une table intermédiaire dans laquelle tu vas y stocker la note, l'élève et de plus tu peux aussi y ajouter des attributs comme les appreciations des profs par exemple.

Beezkit, il y a 6 ans

Cela ma l'aire pas mal en faite ? j'aurais une table intermediaire qui stockera l'id de mon évaluation, l'id de mon élèves ainsi que ses notes etc