Bonjour à tous, j'ai un petit probème avec les formulaire. je m'explique
J'ai une entité evaluation, une entité Competence et une entité Score
Une evaluation peut avoir plusieurs compétence et une competence peut apparaitre dans plusieurs évaluation. j'ai dont utilisé une relation manyTomany.
l'entité Score est associé à evaluation et competence par une relation ManyToOne. J'ai dont finalement ca :
Evaluation.php

<?php

namespace App\ProfBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Evaluation
 *
 * @ORM\Table(name="evaluation")
 * @ORM\Entity(repositoryClass="App\ProfBundle\Repository\EvaluationRepository")
 */
class Evaluation
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="App\UserBundle\Entity\User")
     * @ORM\JoinColumn(nullable=false)
     */
    private $user;

    /**
     * @ORM\ManyToMany(targetEntity="App\ProfBundle\Entity\Competence", cascade={"persist"})
     */
    private $competences;

    /**
     * @ORM\ManyToOne(targetEntity="App\AdminBundle\Entity\Classe")
     * @ORM\JoinColumn(nullable=true)
     */
    private $classe;

    /**
     * @var string
     *
     * @ORM\Column(name="nom", type="string", length=255)
     */
    private $nom;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="datedebut", type="date")
     */
    private $datedebut;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="dateend", type="date")
     */
    private $dateend;

    /**
     * @var bool
     *
     * @ORM\Column(name="statut", type="boolean")
     */
    private $statut;

    /**
     * Get id
     *
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set nom
     *
     * @param string $nom
     * @return Evaluation
     */
    public function setNom($nom)
    {
        $this->nom = $nom;

        return $this;
    }

    /**
     * Get nom
     *
     * @return string
     */
    public function getNom()
    {
        return $this->nom;
    }

    /**
     * Set datedebut
     *
     * @param \DateTime $datedebut
     * @return Evaluation
     */
    public function setDatedebut($datedebut)
    {
        $this->datedebut = $datedebut;

        return $this;
    }

    /**
     * Get datedebut
     *
     * @return \DateTime
     */
    public function getDatedebut()
    {
        return $this->datedebut;
    }

    /**
     * Set dateend
     *
     * @param \DateTime $dateend
     * @return Evaluation
     */
    public function setDateend($dateend)
    {
        $this->dateend = $dateend;

        return $this;
    }

    /**
     * Get dateend
     *
     * @return \DateTime
     */
    public function getDateend()
    {
        return $this->dateend;
    }

    /**
     * Set statut
     *
     * @param boolean $statut
     * @return Evaluation
     */
    public function setStatut($statut)
    {
        $this->statut = $statut;

        return $this;
    }

    /**
     * Get statut
     *
     * @return boolean
     */
    public function getStatut()
    {
        return $this->statut;
    }
    /**
     * Set classe
     *
     * @param \App\AdminBundle\Entity\Classe $classe
     * @return Evaluation
     */
    public function setClasse(\App\AdminBundle\Entity\Classe $classe)
    {
        $this->classe = $classe;

        return $this;
    }

    /**
     * Get classe
     *
     * @return \App\AdminBundle\Entity\Classe
     */
    public function getClasse()
    {
        return $this->classe;
    }
    /**
     * Constructor
     */
    public function __construct()
    {
        $this->competences = new \Doctrine\Common\Collections\ArrayCollection();
    }

    /**
     * Add competences
     *
     * @param \App\ProfBundle\Entity\Competence $competences
     * @return Evaluation
     */
    public function addCompetence(\App\ProfBundle\Entity\Competence $competences)
    {
        $this->competences[] = $competences;

        return $this;
    }

    /**
     * Remove competences
     *
     * @param \App\ProfBundle\Entity\Competence $competences
     */
    public function removeCompetence(\App\ProfBundle\Entity\Competence $competences)
    {
        $this->competences->removeElement($competences);
    }

    /**
     * Get competences
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
    public function getCompetences()
    {
        return $this->competences;
    }

    /**
     * Set user
     *
     * @param \App\UserBundle\Entity\User $user
     * @return Evaluation
     */
    public function setUser(\App\UserBundle\Entity\User $user)
    {
        $this->user = $user;

        return $this;
    }

    /**
     * Get user
     *
     * @return \App\UserBundle\Entity\User 
     */
    public function getUser()
    {
        return $this->user;
    }
    public function __toString(){
        return $this->getNom();
    }
}

Competence.php

<?php

namespace App\ProfBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Competence
 *
 * @ORM\Table(name="competence")
 * @ORM\Entity(repositoryClass="App\ProfBundle\Repository\CompetenceRepository")
 */
class Competence
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="App\ProfBundle\Entity\Matiere")
     * @ORM\JoinColumn(nullable=true)
     */
    private $matiere;

    /**
     * @ORM\ManyToOne(targetEntity="App\UserBundle\Entity\User")
     * @ORM\JoinColumn(nullable=false)
     */
    private $user;
    /**
     * @var string
     *
     * @ORM\Column(name="nom", type="string", length=255)
     */
    private $nom;

    /**
     * @var bool
     *
     * @ORM\Column(name="statut", type="boolean")
     */
    private $statut;

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set nom
     *
     * @param string $nom
     * @return Competence
     */
    public function setNom($nom)
    {
        $this->nom = $nom;

        return $this;
    }

    /**
     * Get nom
     *
     * @return string 
     */
    public function getNom()
    {
        return $this->nom;
    }

    /**
     * Set statut
     *
     * @param boolean $statut
     * @return Competence
     */
    public function setStatut($statut)
    {
        $this->statut = $statut;

        return $this;
    }

    /**
     * Get statut
     *
     * @return boolean 
     */
    public function getStatut()
    {
        return $this->statut;
    }

    /**
     * Set matiere
     *
     * @param \App\ProfBundle\Entity\Matiere $matiere
     * @return Competence
     */
    public function setMatiere(\App\ProfBundle\Entity\Matiere $matiere)
    {
        $this->matiere = $matiere;

        return $this;
    }

    /**
     * Get matiere
     *
     * @return \App\ProfBundle\Entity\Matiere 
     */
    public function getMatiere()
    {
        return $this->matiere;
    }

    /**
     * Set user
     *
     * @param \App\UserBundle\Entity\User $user
     * @return Competence
     */
    public function setUser(\App\UserBundle\Entity\User $user)
    {
        $this->user = $user;

        return $this;
    }

    /**
     * Get user
     *
     * @return \App\UserBundle\Entity\User 
     */
    public function getUser()
    {
        return $this->user;
    }
    public function __toString(){
        return $this->getNom();
    }
}

Score.php

<?php

namespace App\EleveBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Score
 *
 * @ORM\Table(name="score")
 * @ORM\Entity(repositoryClass="App\EleveBundle\Repository\ScoreRepository")
 */
class Score
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="App\UserBundle\Entity\User")
     * @ORM\JoinColumn(nullable=false)
     */
    private $user;

    /**
     * @ORM\ManyToOne(targetEntity="App\ProfBundle\Entity\Competence")
     * @ORM\JoinColumn(nullable=false)
     */
    private $competence;

    /**
     * @ORM\ManyToOne(targetEntity="App\ProfBundle\Entity\Evaluation")
     * @ORM\JoinColumn(nullable=false)
     */
    private $evaluation;

    /**
     * @var int
     *
     * @ORM\Column(name="Score", type="integer")
     */
    private $score;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="date", type="datetime")
     */
    private $date;

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set score
     *
     * @param integer $score
     * @return Score
     */
    public function setScore($score)
    {
        $this->score = $score;

        return $this;
    }

    /**
     * Get score
     *
     * @return integer 
     */
    public function getScore()
    {
        return $this->score;
    }

    /**
     * Set date
     *
     * @param \DateTime $date
     * @return Score
     */
    public function setDate($date)
    {
        $this->date = $date;

        return $this;
    }

    /**
     * Get date
     *
     * @return \DateTime 
     */
    public function getDate()
    {
        return $this->date;
    }

    /**
     * Set user
     *
     * @param \App\UserBundle\Entity\User $user
     * @return Score
     */
    public function setUser(\App\UserBundle\Entity\User $user)
    {
        $this->user = $user;

        return $this;
    }

    /**
     * Get user
     *
     * @return \App\UserBundle\Entity\User 
     */
    public function getUser()
    {
        return $this->user;
    }

    /**
     * Set competence
     *
     * @param \App\ProfBundle\Entity\Competence $competence
     * @return Score
     */
    public function setCompetence(\App\ProfBundle\Entity\Competence $competence)
    {
        $this->competence = $competence;

        return $this;
    }

    /**
     * Get competence
     *
     * @return \App\ProfBundle\Entity\Competence 
     */
    public function getCompetence()
    {
        return $this->competence;
    }

    /**
     * Set evaluation
     *
     * @param \App\profBundle\Entity\Evaluation $evaluation
     * @return Score
     */
    public function setEvaluation(\App\profBundle\Entity\Evaluation $evaluation)
    {
        $this->evaluation = $evaluation;

        return $this;
    }

    /**
     * Get evaluation
     *
     * @return \App\profBundle\Entity\Evaluation 
     */
    public function getEvaluation()
    {
        return $this->evaluation;
    }
}

finalement, une seule valeur est envoyé par l'utilisateur, il s'agit de l'attribut score. le reste doit être gérer automatiquement

j'arrive à gerer la date en mettant la date actuelle et l'utilisateur en mettant l'utilisateur courant mais je n'arrive pas à gerer automatiquement setCompetence et setEvaluation

public function pageAction(Request $request)
    {
        $em = $this->getDoctrine()->getManager();
        $user = $this->getUser();
        $id= $request->get('id');
        $affiliation=$user->getAffiliation();
        //recupération des informations utilises
        $evaluations = $em->getRepository('AppProfBundle:Evaluation')->findBy(
            array('user' =>$affiliation));
        $scores = $em->getRepository('AppEleveBundle:Score')->findAll();
        $score = new Score();
        // ce que j'arrive à gerer automatiquement 
        $user = $this->getUser();
        $score->setUser($user);
        $score->setDate(new \DateTime());

        $form = $this->createForm('App\EleveBundle\Form\ScoreType', $score);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $em->persist($score);
            $em->flush();

            return $this->redirectToRoute('app_eleve_page');
        }

        return $this->render('AppEleveBundle:Default:jungle.html.twig', array(
            'score' => $score,
            'form' => $form->createView(),
            'evaluations' => $evaluations,
            'scores' => $scores,
            'id'=>$id
        ));
    }

QUelqu'un peut-il m'aider?

21 réponses


Bonjour,

que veux tu faire, mettre des valeurs par défaut à ton new Score ?
Comment veux tu mettre automatiquement les valeurs, tu ne peux pas, l'user ayant plusieurs competences et plusieurs evaluations, ton systeme ne peut pas choisir tout seul lesquelles lier à score. Tu est obligé de laisser le choix à l'utilisateur dans le formulaire.

peux tu mettre aussi App\EleveBundle\Form\ScoreType ?

Je voudrai automatiquement mettre les valeurs de la competence qui est évalué ainsi que l'évaluation à la quelle appartient cette competence
voilà scoreType

<?php

namespace App\EleveBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class ScoreType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('score')
            ->add('date', 'datetime')
            ->add('user')
            ->add('competence')
            ->add('evaluation')
        ;
    }

    /**
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'App\EleveBundle\Entity\Score'
        ));
    }
}

alors déjà il faut que tu indique d'une façon ou une autre la comptence qui est concernée, ce qui n'est pas le cas.
je ne sais pas comment tu arrive sur ce controller ( route ) peux tu y passer l'id de la competence.
Deuxieme probleme, dans ton entity competence il n'y a de reference aux evaluations
Troisieme probleme, entre competence et evaluation c'est une relation ManyToMany, donc pour une competence plusieurs evaluation, comment choisir l'evaluation a lier à score de façon automatique ?

// il faut que tu indique d'une façon ou une autre la comptence qui est concernée, ce qui n'est pas le cas. je ne te comprends pas????

Et bien, dans ton controller comment fais tu pour recuperer la competence voulue ? il faut bien que tu la determine. elle ne va pas arriver par magie. Il faudrait faire quelque chose du genre :

public function pageAction (Request $request, $competenceId) // <= ajouter l'id de la competence dans l'url - route
{
        ....
        $competence = $this->getDoctrine()->getRepository(Competence::class)->find($competenceId);
        ...
}

Par contre cela devient insoluble pour l'evaluation.
La seule chose à faire, c'est de recuperer les évaluations liées à cette competence et en faire un select dans ton formulaire de Score.

il faut que tu modifies tes entités competence et evaluation :

class Competence {
/**
* @ORM\ManyToMany(targetEntity="App\UserBundle\Entity\Evaluation", inversedBy="competences")
* @ORM\JoinTable(name="evaluations_competences")
*
*/
private $evaluations
...
public function __construct() {
    $this->evaluations = new ArrayColection();
}
...
}
class Competence {
/**
* @ORM\ManyToMany(targetEntity="App\UserBundle\Entity\Competence", mappedBy="competences")
*
*/
private $competences
...
public function __construct() {
    $this->competences = new ArrayColection();
}
...
}

dans ton controller :

       ....
        $competence = $this->getDoctrine()->getRepository(Competence::class)->find($competenceId);
        ...
        $evaluations = $competence->getEvaluations();

tu peux supprimer

tu peux supprimer

existe t il un depot github de ton projet ?

Non, je ne sais pas si j'ai la permission de le faire car, il s'agit d'un projet tutoré, je peux cependant t'envoyer le code pour que tu fasse tes remarques. mais comment?

Ce que je propose c'est de Zipper sans les vendor, mettre sur la page d'accueil étudiant le lien de téléchargement, tu regardes et tu me fais des remarques et corrections si possbible, ca te conviens? si oui j'envoie la version sans vendor pour allèger

vas y, fais le et je regarde

Slt, j'étais pas connecté, je te l'envoie dans 30 min environ.

@nico j'ai envoyé, à la page d'accueil, cliques sur le lien avec mon mail. fais moi signe dès recupération pour que j'efface

tu peux effacer

D'accord, c'est fait, tu peux utiliser l'adresse qui est marqué pour me transferer les modifs. entre autre, j'ai tester le code que tu m'a envoyé, mais ca n'a pas marché. j'ai vraiment besoin d'aide à ce niveau, c'est le point d'achèvement de mon projet

Salut, j'ai recupérer l'évaluation en cours à partir de son Id

$idevaluation= $request->get('id');
$evaluation = $this->getDoctrine()->getManager()->getRepository('AppProfBundle:Evaluation')->find($idevaluation);
$score->setEvaluation($evaluation);

j'ai l'erreur

Expected argument of type "App\ProfBundle\Entity\Evaluation", "NULL" given 

que faire?

Bonjour,

rapidement :
passes-tu 'id' dans ta requête ?
ensuite c'est $request->query->get('id'); si tu passes id dans l'url comme : http://mon.domaine/nom/url?id=5
ou function monAction($id, ...) { ... } pour une url comme : http://mon.domaine/nom/url/5 définie dans tes règles de routing
dans les deux cas ci dessus dans ton template twig:

 <a href="{{ path("nom_de_ma_route", {id: objet.id}) }}">cliquer ici</a>

*dans ton controller après une requête à la base vérifie toujours de la valeur retournée, au moins qu'elle ne soit pas nulle ex :

$evaluation = $this->getDoctrine()->getManager()->getRepository('AppProfBundle:Evaluation')->find($idevaluation);
if($evaluation == null){
    // ici traitement si $evaluation est nulle
    // peut être une redirection
    // l'affichage d'un message flash
    // une page d'erreur 404 Not Found
    // ...
}

Normalement, l'id est transmis par URL depuis ma vue twig sous forme http://mon.domaine/nom/url/{id}, ca devrait marcher non?

alors tu doit avoir :

function monAction($id, ...){   // <= OUI 
    // $id = $request->get("id");        <= NON !!
    $evaluation = $this->getDoctrine()->getManager()->getRepository('AppProfBundle:Evaluation')->find($id);
    if($evaluation == null){
    // ici traitement si $evaluation est nulle
    // peut être une redirection
    // l'affichage d'un message flash
    // une page d'erreur 404 Not Found
    // ...
    }
    // suite du controller si $evaluation est OK

}

D'accord, je fais ce que tu dis et je te fais un feelback après

Volà ce que j'ai

public function pageAction($id, Request $request)
    {
        $em = $this->getDoctrine()->getManager();
        $user = $this->getUser();
        $affiliation=$user->getAffiliation();
        $evaluations = $em->getRepository('AppProfBundle:Evaluation')->findBy(
            array('user' =>$affiliation));
        $scores = $em->getRepository('AppEleveBundle:Score')->findAll();
        $evaluation = $this->getDoctrine()->getManager()->getRepository('AppProfBundle:Evaluation')->find($id);
        if($evaluation == null){
            return $this->redirectToRoute('app_eleve_page');  
        }
        $score = new Score();
        $user = $this->getUser();
        $score->setUser($user);
        $score->setDate(new \DateTime());
        $score->setEvaluation($evaluation);

        $form = $this->createForm('App\EleveBundle\Form\ScoreType', $score);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $em->persist($score);
            $em->flush();

            return $this->redirectToRoute('app_eleve_page');
        }

ca renvoie la même erreur

Expected argument of type "App\ProfBundle\Entity\Evaluation", "NULL" given