IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Formulaire imbriqués qui ne fonctionnent pas [1.x]


Sujet :

Symfony PHP

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 8
    Points : 10
    Points
    10
    Par défaut Formulaire imbriqués qui ne fonctionnent pas
    Boujour à tous! Je développe une application où je dois remplir des bordereaux de notes pour une classe.
    Les différentes classes que je gère sont:
    Exam pour la composition, Student pour l'étudiant, Mark pour la note et ClassRoom pour la classe.

    Je souhaite faire le réaliser l'édition des notes en une seule fois j'ai pensé faire une combinaison de formulaires de type Mark en un seul formulaire.

    J'ai donc redefini le formulaire Mark de base afin d'afficher comme label le nom de l'étudiant comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class MarkForm extends BaseMarkForm
    {
      public function configure()
      {
          parent::configure();
          $this->useFields(array('value'));
          $student =$this->getObject()->getStudent();
          $completeName = $student->getCompleteName();
          $this->widgetSchema->setLabels(array(
              'value' => $completeName
          ));
      }
    }
    et j'ai combiné les MarkForm comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    class ExamMarksCollectionForm extends BaseForm {
        public function configure() {
            $exam = $this->getOption('exam');
            if (!$exam) {
                throw new InvalidArgumentException('You must provide an Exam object');
            }
     
            $class = $exam->getCourse()->getClassRoom();
            $students = $class->getOrderedStudentList(true);
            $subForm = new sfForm();
            foreach($students as $student){
                $mark = new Mark();
                $mark->Student = $student;
                $mark->Exam = $exam;
                $form = new MarkForm($mark);
                $subForm->embedForm($student->getId(), $form);
            }
            $this->embedForm('marks', $subForm);
        }
    }
    le code de l'action qui traite le formulaire est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    public function executeCreate(sfWebRequest $request){
          $this->exam = $this->getRoute()->getObject();
     
          $this->form = new ExamMarksCollectionForm(null, array(
              'exam' => $this->exam
          ));
     
          $this->processForm($request, $this->form);
          $this->setTemplate('edit');
      }
     
      protected  function processForm(sfWebRequest $request, sfForm $form){
          $form->bind($request->getParameter($form->getName()),
                  $request->getFiles($form->getName()));
          if ($form->isValid()){
              $form->save();
              $this->redirect('mark_index');
          }
      }
    le modèle des données est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    Student:
      inheritance:
        extends: sfGuardUser
        type: concrete
      columns:
        matricule: { type: string(50), notnull: false, unique: true }
        class_room_id: { type: integer, notnull: false}
      relations:
        ClassRoom: {onDelete: CASCADE, local: class_room_id, foreign: id, foreignAlias: Students}
     
    ClassRoom:
      actAs:
        Sluggable:
          fields: [ code ] 
          unique: true
          canUpdate: true
      columns:
        code: { type: string(10), notnull: true, unique: true }
        label: { type: string(255), notnull: true, unique: true }
      relations:
        Disciplines: { foreignAlias: ClassRooms, class: Discipline, refClass: Course }
     
    Professor:
      columns:
        name: { type: string(255), notnull: true }
        surname: { type: string(255), notnull: true }
     
    Discipline:
      columns:
        label: { type: string(255), notnull: true, unique: true }
     
    Course:
      columns:
        id: { type: integer, primary: true, autoincrement: true }
        discipline_id: { type: integer }
        class_room_id: { type: integer }
        professor_id: { type: integer, notnull: true }
      relations:
        Professor: { onDelete: CASCADE, local: professor_id, foreign: id, foreignAlias: Courses }
        ClassRoom: { foreignAlias:  Courses }
        Discipline: { foreignAlias: Courses }
     
    Program:
      columns:
        start: { type: timestamp, notnull: true }
        end:  { type: timestamp, notnull: true }
        course_id: { type: integer, notnull: true }
      relations:
        Course: { onDelete: CASCADE, local: course_id, foreign: id, foreignAlias: Programs }
     
    CourseProgram:
      inheritance:
        extends: Program
        type: concrete
      columns:
        place: { type: string(20), notnull: true }
     
    Exam:
      inheritance:
        extends: Program
        type: concrete
      relations:
        Students: { foreignAlias: Exams, class: Student, refClass: Mark  }
     
    Mark:
      columns:
        student_id: { type: integer, primary: true }
        exam_id: { type: integer, primary: true }
        value: { type: float, notnull: false }
      relations:
        Student: { foreignAlias: Marks }
        Exam: { foreignAlias: Marks }
    Malheureusement le formulaire est retourné et les champs sont marqués comme requis.
    Le problème est peut-être au niveau de $form->bind mais j'ai essayé toutes les combinaison possibles sans résultat. I need help!

  2. #2
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    Avant de rentrer dans le détail du formulaire, je pense qu'il faut stabiliser le schéma.

    Il y a un lien qui est mal défini dans la table ClassRoom vers Dicsiplines, il fait référence à une refClass, ce qui s'utilise pour shunter des tables de liaison n-n dans une relation n-n, mais ici, le liens fait référence à une entité Course qui n'est pas une entité de liaison n-n. Donc le lien ne peut être compris par doctrine, ce qui ne peut que rendre plus difficile toute utilisation du schéma.

  3. #3
    Membre à l'essai
    Inscrit en
    Septembre 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 8
    Points : 10
    Points
    10
    Par défaut Raison du choix de modélisation et solution à mon problème
    Citation Envoyé par Michel Rotta Voir le message
    Avant de rentrer dans le détail du formulaire, je pense qu'il faut stabiliser le schéma.

    Il y a un lien qui est mal défini dans la table ClassRoom vers Dicsiplines, il fait référence à une refClass, ce qui s'utilise pour shunter des tables de liaison n-n dans une relation n-n, mais ici, le liens fait référence à une entité Course qui n'est pas une entité de liaison n-n. Donc le lien ne peut être compris par doctrine, ce qui ne peut que rendre plus difficile toute utilisation du schéma.
    La raison pour laquelle j'ai fait une relation n-n entre ClassRoom et Discipline (à prendre comme Matière) est qu'une même matière peut être enseignée dans plusieurs salles. Il me fallait donc une classe pour recueillir la relation et j'ai pas trouvé mieux comme nom que Course (j'avoue que ça peut prêter à confusion de penser ). Je me suis donc dis qu'un cours est une matière enseignée dans une classe par un professeur donné (raison du lien 1-n avec Professor).

    Pour en revenir à mon problème la solution que j'ai trouvé pour résoudre mon problème est:
    1- Modifier la classe Exam pour qu'elle créé pour chaque nouvel exam les objets de type Mark qui correspondent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    class Exam extends BaseExam
    {
        public function save(Doctrine_Connection $conn = null) {
            parent::save($conn);
            if ($this->isNew()){
                $class = $this->getCourse()->getClassRoom();
                $students =  $class->getOrderedStudentList(true);
                foreach ($students as $student){
                    $mark = new Mark();
                    $mark->setExamId($this->getId());
                    $mark->setStudentId($student->getId());
                    $mark->save();
                }
            }
     
        }
    }
    2- Redéfinir le formulaire de type MarkForm

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    class MarkForm extends BaseMarkForm
    {
      public function configure()
      {
          parent::configure();
          $this->useFields(array('value'));
          $student =$this->getObject()->getStudent();
          $completeName = $student->getCompleteName();
          $this->widgetSchema->setLabels(array(
              'value' => $completeName
          ));
          $this->validatorSchema['value'] = new sfValidatorNumber(array(
              'required' => false,
              'min' => 0,
              'max' => 20
          ), array(
              'max' => 'Ce champ devrait être inférieur ou égal à 20',
              'min' => 'Ce champ doit être supérieur ou égal à 0',
              'invalid' => 'Valeur invalide'
          ));
      }
    }
    3- Ensuite créer un formulaire qui étend le formulaire ExamForm et le lier à tous les objets de type Mark qui correspondent grâce à sfFormDoctrinet::embedRelation().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class ExamMarksForm extends ExamForm{
     
        public function configure(){
            parent::configure();
            $this->useFields(array());
            $this->embedRelation('Marks');
        }
    }
    Et ça marche!!! Si il y d'autres idées d'implémentation je suis quand même preneur car c'est quand même (je trouves) contourner le problème.
    Merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Formulaire qui ne fonctionne pas
    Par makaphrodite dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 23/05/2009, 13h17
  2. formulaire php qui ne fonctionne pas
    Par kate59 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 19/04/2008, 13h40
  3. Validation formulaire qui ne fonctionne pas
    Par dom59111 dans le forum Langage
    Réponses: 6
    Dernier message: 25/10/2007, 10h18
  4. [MySQL] Un formulaire qui ne fonctionne pas comme il faut (problèmes avec stripslashes & com)
    Par vincent.b dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 30/04/2007, 20h02
  5. Réponses: 10
    Dernier message: 30/03/2007, 17h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo