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


Salut
C'est simple quand tu crée ton entité, il te faut mettre bolean dans type de champs

Et dans ton fichier FormType.php il faut que tu suivent les infos qu'il y'a sur cette page.

https://symfony.com/doc/current/reference/forms/types/checkbox.html

avec ça tu devrait trouver ton bonheur !

Beezkit
Auteur

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 ?

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

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

Beezkit
Auteur

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([
        ]);
    }
}

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

Beezkit
Auteur

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.

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
Auteur

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

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
Auteur

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