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

ORM PHP Discussion :

Schema.yml, erreur lors de la création des tables [Doctrine]


Sujet :

ORM PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 30
    Points : 12
    Points
    12
    Par défaut Schema.yml, erreur lors de la création des tables
    Bonjour,

    J'utilise symfony 1.4.8 et je débute...

    Je dois créer pour une école, un site internet qui permet aux élèves de suivre des exercices sur une matière donnée et j'ai besoin d'aide car j'ai l'erreur suivante :

    SQLSTATE[HY000] : General error : 1005 can't create table mabase.#sql-8f4_f' (errno: 150). Failing Query: "ALTER TABLE exercice ADD CONSTRAINT exercice_activite_id_activite_id FORIEGN KEY (activite_id) REFERENCES activite(id) ON DELETE CASCADE".
    Ce que je cherche à faire dans mon schéma :

    L'élève choisit un objectif (par ex. Math) et une durée de cours (15 min).
    Selon ces deux paramètres, le site propose une liste d'activités (déterminée par l'admin, par ex. opération, numérotation etc... ).
    Pour une activité donnée (par ex. opération), le site impose à l'élève de choisir x exercices parmi ceux disponibles (3 exercices addition parmi les 10, 5 exercices multiplication parmi les 15 etc...).
    Le nombre d'activités et d'exercices à l'intérieur de celles-ci est fonction du temps dont dispose l'élève et est déterminé à l'avance par l'admin.

    Voici mon schema.yml :

    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
    Objectif:
      columns:
        id:          { type: integer(4), primary: true, autoincrement: true, unsigned: true }
        name:        { type: string(255), notnull: true }
        image:       { type: string(255) }
        description: { type: clob }
     
    Duration:
      columns:
        id:           { type: integer(4), primary: true, autoincrement: true, unsigned: true }
        period :      { type: integer, size: 2 }
      relations:
        Objectifs:
          foreignAlias: Durations
          class:        Objectif
          refClass:     Cours
          local:        duration_id
          foreign:      objectif_id
     
    Cours:
      columns:
        id:           { type: integer(4), primary: true, autoincrement: true, unsigned: true }
        objectif_id:  { type: integer(4), primary: true, unsigned: true }
        duration_id:  { type: integer(4), primary: true, unsigned: true }
      relations:
        Objectif:     { onDelete: CASCADE, local: objectif_id, foreign: id, foreignAlias: Courss }
        Duration:     { onDelete: CASCADE, local: duration_id, foreign: id, foreignAlias: Courss }
     
    Activite:
      columns:
        id:           { type: integer(4), primary: true, autoincrement: true, unsigned: true }
        name:         { type: string(255), notnull: true }
      relations:
        Courss:
          foreignAlias: Activites
          class:        Cours
          refClass:     CoursActivite
          local:        activite_id
          foreign:      cours_id
     
    Exercice:
      columns:
        id:           { type: integer(4), primary: true, autoincrement: true, unsigned: true }
        activite_id:  { type: integer(4) }
        file:         { type: string(255) }
      relations:
        Activite:     { onDelete: CASCADE, local: activite_id, foreign: id, foreignAlias: Exercices }
     
    CoursActivite:
      columns:
        cours_id:         { type: integer(4), primary: true, unsigned: true }
        activite_id:      { type: integer(4), primary: true, unsigned: true }
        nbexercices:      { type: integer(4) }
      relations:
        Cours:            { onDelete: CASCADE, local: cours_id, foreign: id, foreignAlias: CoursActivites }
        Activite:         { onDelete: CASCADE, local: activite_id, foreign: id, foreignAlias: CoursActivites }
    Je vous remercie vraiment par avance pour l'aide que vous pourrez m'apporter car je suis bien bloqué...

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    Si vous pouviez me donner une idée pour créer le fichier fixtures.yml car je ne vois pas comment faire pour le modèle Cours par exemple. Merci.

  3. #3
    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 passer sur les fixatures, je proposerais de fixer (!) le schéma.

    Remarques :

    • Il vaut mieux éviter la syntaxe { } souvent un peu lourde.
    • Si aucune clef n'est créée, doctrine (l'ORM de symfony) en crée une automatiquement, (nom id; entier long, auto-incrémenté) le mieux est de lui laisser faire.
    • Il faut créer les champs de référence pour les liens, ton erreur vient du fait que les champs duration_id et objectif_id n'existent pas dans le schéma des tables.
    • Si tu utilises les noms par défaut, une relation 1-n, la plus courante, ce définit sur le côté n avec pour seul paramètre le foreignAlias
    • Pour la simplicité du code objet généré il est important de bannir les "s" de terminaisons donc jamais de pluriel et un nom comme "cours" est difficilement gérable. Par convention, un "s" signifie que la méthode objet va retourner une série d'enregistrement et pas un seul. Après comprendre getCours() et getCourss() est vite un casse tête source d'erreur...
    • Les colonnes clefs de liaison (cf "objectif_id" dans la table "cours") ne doivent pas faire partie de la clef. D'une manière général, la clef ne doit comprendre qu'un champs avec Doctrine 1.2, seul exception pour les tables de liaisons dans une relation n-n.
    • La table "cours" n'a pas de champs valeur (autre que les clefs de liaisons) les cours n'ont pas de nom ? de description ?
    • Table "Duration" je ne suis pas sur de comprendre la fonction de la propriété "period".
    • J'ai un peu de mal à dépêtrer le sac de nœuds dans les relations entre les tables "Objectif", "Duration" et "Cours". Cela pourrait ressembler à un essais de liaison n-n entre "Objectif" et "Duration" mais alors la table intermédiaire devrait logiquement s'appeler "ObjectifDuration" ou similaire, le nom "Cours" laisse entendre qu'elle est porteuses d'information qui n'y figurent pas.
    • Table "Exercice". Tu veux stocker les exercices dans un fichier séparé ? Sous quel forme ? Pourquoi pas un cblob ?
    • Oups, une deuxième tentative de relation n-n avec la table "CoursActivité" pour pivot. Ce qui ferait de la table "Cours" une table pivot (table de liaison dans une relation n-n) une table en relation avec une autre liaison n-n et une sorte de liaison n²-n² entre "Activité" et "Duration" ! Ce n'est pas possible en terme base de donnée, en tout cas, pas avec doctrine.

    Je pense qu'il faut en premier lieu fixer le schéma. Ensuite les fixatures iront seules.

    Questions complémentaires :

    • Pas d’authentification pour les élèves ? Ils peuvent refaire à l'inifini le même exercice ?
    • D'où pas de suivi de résultats non plus ?
    • Tu dis : "Le nombre d'activités et d'exercices à l'intérieur de celles-ci est fonction du temps dont dispose l'élève et est déterminé à l'avance par l'admin.". Mais où les informations sont-elle stockées ? Y a-t-il une seul possibilité de détermination ? Ou une par classe ?

    Je pense qu'il reste quelques questions à ce poser sur la structure de la base.

    J'aurais volontiers affiché un schéma rectifié mais le sac de nœuds dans les relations ne me permet pas de sortir un exemple pertinent. Pas encore .
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    Merci pour votre réponse.
    Je me sens un peu

    Alors je vais tenter d'apporter plus de précisions :

    L'élève choisit un objectif : soit math, soit français, soit anglais.
    Il choisit le temps que doit durer son cours (15, 30, 45 min, 1h : la fameuse periode de la table duration). Certains objectifs excluent la durée de 15 min par exemple.
    Un fois cela choisit, le site lui propose une séance type, composée d'un certain nombre d'activités et pour chaque activité, un certain nombre d'exercices à réaliser.
    Pour chaque activité, l'élève est libre de choisir les exercices parmi ceux liés à cette activité. Le site lui impose donc seulement le nombre d'exercices par activité.

    Exemple :
    Choix : Objectif1, 30 min.
    Activité A : 2 exercices à choisir parmi 20.
    Activité B : 1 exercices à choisir parmi 10.
    Activité C : 3 exercices à choisir parmi 5.

    Choix : Objectif2, 45 min.
    Activité A : 5 exercices à choisir parmi 20.
    Activité B : 2 exercices à choisir parmi 10.
    Activité D : 1 exercices à choisir parmi 5.
    Activité G : 1 exercices à choisir parmi 15.

    Choix : Objectif3, 15 min.
    Activité C : 3 exercices à choisir parmi 5.

    En espérant avoir été plus clair et qu'ainsi vous pourrez m'aider

  5. #5
    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
    Un peu plus, mais il reste certaines zones d'ombre.

    On peut ressortir qu'il y a quatre entités dans le raisonnement :
    • On a des objectifs. Par contre sont-ils aussi généraliste que mathématique ou plus spécialisés "les fractions" ? Dans ce dernier cas il y aurait une classe d'objectifs.
    • Ensuite j'ai l'impression qu'il y a quelque chose de sous entendu mais de présent qui serait un "déroulement pédagogique" associé à une durée. Peut-ils y avoir plusieurs déroulement pédagogique d'une même durée pour un même objectif ?
    • Les activités permettent de détailler un déroulement pédagogique. Elle sont constituées d'une activité (!) et d'un nombre d’exercices précis à choisir dans une liste d’exercices possibles.
    • Enfin, les exercices, partie qui demande une réponse de l'élève. (Il la saisi comment la réponse ?)


    Questions sur les liens a établir entre ces différentes entités, les affirmations suivantes correspondent-elles à la vérité :

    • Un objectif est lié à un ou plusieurs déroulement pédagogique. Un déroulement pédagogique est lui toujours lié à un objectif unique.
    • Un déroulement pédagogique est lié à une ou plusieurs actions. Une action est toujours lié à un déroulement pédagogique unique.
    • Une action est liée à un ou plusieurs exercices. Un exercice est toujours lié à une action unique.

    Il est possible que ces affirmations soient fausse et qu'un exercice puisse être lié à plusieurs action différentes par exemple.

    Ensuite il serait bénéfique pour la compréhension de répondre aux questions complémentaires de ma précédente intervention. Suivant les réponses données, cela peut modifier la structure du schéma très sensiblement.
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    En fait pour être plus précis, il s'agit de cours de sport en vidéo. Voir document joint pour les plans de cours en fonction des objectifs... Je pense que cela va vous parler.

    Pas d’authentification pour les élèves ? Ils peuvent refaire à l'inifini le même exercice ?
    Il y aura une identification de l'élève, déléguée à sfDoctrineGuardPlugin et sfDoctrineApplyPlugin. Les élèves peuvent effectivement refaire les exercices à l'infini. Il faudra qu'il puisse enregistrer la construction de sa séance (l'objectif et le temps choisi, et la liste des exercices choisis par l'élève, pour chaque activité proposée).

    Mais où les informations sont-elle stockées ? Y a-t-il une seul possibilité de détermination ? Ou une par classe ?
    Dans la BDD, sont stockés pour chaque objectif et chaque durée, les activités proposées par le professeur. Ces activités peuvent appartenir à plusieurs objectifs. Par contre les exercices appartiennent à une seule activité.

    Je suis à votre disposition pour vous apporter plus de renseignements.
    Fichiers attachés Fichiers attachés

  7. #7
    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
    Je suis dessus depuis midi. Je poste dés que j'ai un début de schéma viable.
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    Merci beaucoup Michel pour votre temps !

  9. #9
    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
    Je ne consacre autant de temps que si j'y trouve un intérêt intellectuel (que de l'égoïsme !)

    On est passé de 5 entités à l'origine à 19... J'ai modélisé pour être sur que là où je vais corresponde à là où tu souhaites aller. Un accessit pour ce schéma, c'est celui où j'ai eu le plus de liaisons n-n justifiée : 8 (quoique j'ai des doutes sur une qui risque de migrer).

    Je joins le schéma


    J'ai séparé en quatre parties :

    1) La partie sécurité, essentiellement sfGuard. A noter que la table sf_guard_user prendra trois aspect par les notions d'héritages de doctrine, "sf_guard_user" pour travailler les accès, "eleve" pour gérer les élèves et les attributs qui leur sont propres et enfin "professeur" pour les professeur (ben oui).

    2) La partie organisation scolaire, la plus simple avec la description d'une classe, du professeur en charge (un professeur peut avoir plusieurs classes), les séances autorisée pour cette classe (une séance peut ce trouver dans plusieurs classe, une classe peut avoir plusieurs séances) et les élèves de la classe (un élève ne peut avoir qu'une classe).

    3) La partie séance, la plus touffue. A noter que ton plans de cours types m'a fait rétrograder la notion d'objectif au profit de la séance qui me semble l'élément principale. La séance est attaché à un objectif (qui lui peut avoir de multiple séances). La séance est constituée d'actions, dans ton commentaire tu me dits qu'une action est propre à une séance, mais j'aurais tendance à ne pas te croire (c'est fou ces informaticiens), d'expérience, je suis convaincu qu'un jour proche il faudra pouvoir utiliser une même action dans plusieurs séance différentes, d'où une liaison n-n. L'action est elle même constitué par des vidéos et leur description. Pour les mêmes raison qu'au dessus, la liaison est de type n-n, une vidéo peut se retrouver dans plusieurs actions. Une action est aussi constituée d’exercices, là aussi je ne te crois pas et je prévoie qu'un même exercices puisse être rattaché à plusieurs actions (une action pouvant avoir plusieurs exercices). A noter que j'ai ajouté une table pour des schémas explicatif en image de l'exercice mais ce n'était pas dans ta description. Ici, par contre, un schéma est rattaché à un seul exercice qui lui peut avoir plusieurs schéma.

    4) La dernière partie, l'historique. Assez simple, à chaque choix d'une séance (et de l'objectif qui va avec) on crée une entrée dans la table. Accessoirement un élève peut choisir plusieurs fois la même séance, mais avec des exercices différents. La liaison entre l'historique et les exercices est une simple liaison n-n, par l’exercice ont peut retrouver l'action et donc les classer et imprimer en fonction. Je pense que c'est suffisant, mais n'en suis pas sur, c'est mon hésitation sur les 8 liaisons n-n.

    A toi maintenant de voir si ce schéma peut te correspondre.

    J'ai des questions (encore) en fonction de ce que tu as dits ou pas et qui pourrait légèrement modifier le schéma proposé :
    • l'application envisagée est-elle pour un intranet ou pour internet (installée en local dans une école ou un collège ou sur un serveur externe pour que tous professeurs puisse s'en servir) ? Dans le cas d'une publique il faudrait probablement prévoir des "classes types" pour faciliter le travail des professeurs non intervenants. Peut-être aussi envisager un forum pour que les professeurs non intervenants puissent discuter avec les créateurs des séances (pas d'inquiétudes, cela existe tout fait dans symfony). Il faudra aussi probablement étoffer la notion de classe avec celle d'établissement pour qu'un élève puisse faire la différence entre une 4ème C de deux établissements différents. Et prévoir une validation des inscriptions par classe...
    • L'historique est basé sur la séance et pas l'objectif mais je pense que c'est plus costaud informatiquement parlant.
    • Valider le schéma proposé.


    Après il ne reste plus qu'à convertir le schéma en shema.yml ce qui reste la partie la plus simple... Et on pourra voir pour les fixatures ce qui dans une semaine passera pour une plaisanterie quant il faudra développer le bordel Mais non
    Images attachées Images attachées  
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  10. #10
    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
    Réponse de richard_m
    L'application est pour internet. Il faut faire au plus simple : pas de gestion de classes d'élèves ou d'établissement et de multi-professeur.
    On a un seul professeur qui est l'administrateur. Donc une simple liste d'users et un super admin pour la création de nouveaux objectifs par exemple.

    Une action (par exemple cardio-training) peut être incluse dans plusieurs séances : on retrouve effectivement cardio-training pour l'objectif "affiner sa silhouette" et pour l'objectif "être en forme" par exemple.

    Concernant l'action (par exemple cardio-training), elle ne comporte que des vidéos qui lui sont propres. Une vidéo ne peut être liée à une action "échauffement" et à une action "cardio-training".

    On peut supprimer la table schéma puisque les vidéos sont assez explicatives. Voir même la table Exercice puisqu'on aura pour la vidéo un nom, une description et un durée ce qui est suffisant. Le but étant d'enchainer automatiquement la diffusion des vidéos afin de faire une séance de sport de X minutes.

    Pour la séance enregistrée par l'utilisateur, il doit pouvoir lui donner un nom afin de la retrouver facilement et gérer ses séances enregistrées.
    J'ai allégé le schéma. Hors tables de sfGuard on tombe a 6 tables plus 3 de liaisons.

    Je ne comprend pas très bien l'hébergement sur internet (visible par l'ensemble du monde) et le fait que le professeur soit seul a utiliser avec ça classe, ce qui collerait plutôt avec un hébergement en intranet.

    Les vidéos sont maintenant rattachées à une seul action.

    J'ai gardé la notion d'exercice si non la gestion de l'historique perdait presque tout son sens.

    Vu que c'est destiné à une organisation unique, je pense que sfGuard suffira pour la gestion des accès.

    Le schéma modifié ci-dessous quel est ton avis ?
    Images attachées Images attachées  
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    Merci pour votre réponse attendue.

    Je ne comprends pas l'intérêt de la table Exercice puisque l'ensemble des exercices est sous forme vidéo : cela fait pour moi doublon et les exercices ne sont pas liés à la table vidéos.
    Lors d'un rappel de séance, l'utilisateur aura à disposition les vidéos classées par action pour la séance enregistrée. Ne peut-on faire directement le lien avec la table Parcour et la table Video ? En effet l'utilisateur peut suivre à nouveau sa séance enregistrée (enchainement de vidéos) ou la modifier en remplaçant telle vidéo par une autre.
    Votre avis ?

  12. #12
    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
    J'avais compris que les vidéo étaient toutes toujours utilisées dans une action, un peu comme un cours magistral et que les exercices proposés étaient dérivés de l'explication vidéo, pour être librement choisi.

    Mais on peut parfaitement modifier le schéma, cela no pose aucun problème, si cela répond à ce que l'application doit faire c'est même la meilleur solution
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    Pouvez-vous svp me donner le schéma.yml et un exemple de fixtures.yml avec ces dernières modifications (c'est-à-dire sans la table Exercice) ?
    En vous remerciant par avance

  14. #14
    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
    Donc notre schéma définitif (?)


    et le shema.yml qui va avec (un peu long mais le plugin qui doit me transformé le dessin en yaml ne marche pas dans la dernière version, j'ai du reprendre à la main
    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
     
    Parcour:
      actAs:
        Timestampable:    ~
      fields:
        name:
          type:           string(255)
          notnull:        true
        date:             timestamp
        sceance_id:       integer
        eleve_id:         integer
      relations:
        user:
          class:          sfGuardUser
          local:          eleve_id
          foreign:        id
          foreignAlias:   parcours
        sceance:
          foreignAlias:   parcours
     
    Sceance:
      actAs:
        Timestampable:    ~
      fields:
        name:
          type:           string(255)
          notnull:        true
        description:      string(1000)
        duration:         time
        enabled:          boolean
        objectif_id:      integer
      relations:
        objectif:
          foreignAlias:   sceances
     
    Objectif:
      fields:
        Name:
          type:           string(255)
          notnull:        true
        description:      string(1000)
     
    Action:
      fields:
        Name:
          type:           string(255)
          notnull:        true
        description:      string(1000)
      relations:
        sceances:
          class:          sceance
          refClass:       SceanceAction
          foreignAlias:   actions
     
    SceanceAction:
      fields:
        sceance_id:
          type:           integer
          primary:        true
        action_id:
          type:           integer
          primary:        true
      relations:
        sceance:
          foreignAlias:   SceanceActions
        action:
          foreignAlias:   SceanceActions
     
    Video:
      fields:
        Name:
          type:           string(255)
          notnull:        true
        description:      string(1000)
        file:             string(255)
        diration:         time
        action_id:        integer
      relations:
        action:
          foreignAlias:   videos
        parcours:
          class:          parcour
          refClass:       ParcourVideo
          foreignAlias:   videos
     
    ParcourVideo:
      fileds:
        parcour_id:
          type:           integer
          primary:        true
        video_id:
          type:           integer
          primary:        true
      relations:
        parcour:
          foreignAlias:   ParcourVideos
        video:
          foreignAlias:   ParcourVideos
    Attention, il faut avoir installé correctement sfGuard avant d'essayer de générer ce shema.
    Attention, shema non testé.

    Essaye d'installer et de générer. En principe tu ne devrais pas avoir de problèmes pour les fixatures de départ, on verra pour les fixatures sur les n-n.
    Images attachées Images attachées  
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    J'essaie cela de suite !

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    Voici le schéma utilisé sans le user pour l'instant.

    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    detect_relations: true
     
    Parcour:
      actAs:
        Timestampable:    ~
      columns:
        name:
          type:           string(255)
          notnull:        true
        date:             timestamp
        seance_id:       integer
      relations:
        seance:
          foreignAlias:   parcours
     
    Seance:
      actAs:
        Timestampable:    ~
      columns:
        name:
          type:           string(255)
          notnull:        true
        description:      string(1000)
        duration:         time
        enabled:          boolean
        objectif_id:      integer
      relations:
        objectif:
          foreignAlias:   seances
     
    Objectif:
      columns:
        Name:
          type:           string(255)
          notnull:        true
        description:      string(1000)
        consigne:		  clob
     
    Action:
      columns:
        Name:
          type:           string(255)
          notnull:        true
        description:      string(1000)
      relations:
        seances:
          class:          seance
          refClass:       SeanceAction
          foreignAlias:   actions
     
    SeanceAction:
      columns:
        seance_id:
          type:           integer
          primary:        true
        action_id:
          type:           integer
          primary:        true
      relations:
        seance:
          foreignAlias:   SeanceActions
        action:
          foreignAlias:   SeanceActions
     
    Video:
      columns:
        Name:
          type:           string(255)
          notnull:        true
        description:      string(1000)
        file:             string(255)
        diration:         time
        action_id:        integer
      relations:
        action:
          foreignAlias:   videos
        parcours:
          class:          parcour
          refClass:       ParcourVideo
          foreignAlias:   videos
     
    ParcourVideo:
      columns:
        parcour_id:
          type:           integer
          primary:        true
        video_id:
          type:           integer
          primary:        true
      relations:
        parcour:
          foreignAlias:   ParcourVideos
        video:
          foreignAlias:   ParcourVideos
    Pourriez-vous svp m'indiquer un exemple de fixtures.yml ?
    Merci par avance

  17. #17
    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
    Dans ton schema retire le "detect_relation: true" dans la mesure où tu les mets déjà explicitement.

    Le fixture sont le jeu d'essai. Donc des données que tu veux pouvoir recharger dans les tables à chaque fois.

    Il n'y a pas de fixtures type, dans la mesure où cela dépend de l'application en cours de développement.

    Donc pour la table séance on aura
    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
     
    objectif:
      obj_relax:  // c'est le nom de l'enregistrement on va réutiliser pour les liens.
        nom: relaxation
        description: Je décris la relaxation
      obj_muscu:
        nom: musculation
        description: Je décris la musculation 
     
    séance:
      sc_relax_01:
        nom: Relaxation sur 15 minutes
        description: Toujours ici qu'on met du texte
        duration: 00:15:00
        enable: true
        objectif: obj_relax
      sc_relax_02_off:
        nom: Relaxation sur 15 minutes en OFF
        description: Toujours ici qu'on met du texte
        duration: 00:15:00
        enable: false
        objectif: obj_relax
      sc_relax_03:
        nom: Relaxation sur 45 minutes 
        description: Toujours ici qu'on met du texte
        duration: 00:45:00
        enable: on
        objectif: obj_relax
      sc_muscu_01:
        nom: Musculation sur 30 minutes
        description: Toujours ici qu'on met du texte
        duration: 00:30:00
        enable: on
        objectif: obj_muscu
     
    action:
      act_relax_01:
        nom: Action échauffement relax
        description: encore du texte !
        seances: [ sc_relax_01, sc_relax_03 ]
        videos: // sur le coup, on créer directement dans la table vidéo
          vid_act_relax_01_01:
             nom: le nom de la vidéo
             description: tiens ! du texte.
             file: http://sss.sss/sss/sss.sss
             duration: 0:2:0
      act_muscu_01:
        nom: action échauffement muscu
        description: devines !
        seances: [ sc_muscu_01 ] //c'est un tableau, les [] sont donc obligatoires
        videos: 
          vid_act_muscu_01_001: //ce nom DOIT être unique pour la table video
            nom: le nom de cette vidéo
            description: je préfère ne pas y penser
            file: http:// .. .. ..
            duration 0:2:30
          vid_act_muscu_01_002:
            nom: un autre nom 
            description: j'y ai pensé avec regrets
           file: http:// .. .. ..
            duration 0:1:15
    Un exemple avec un peu tous les cas. A toi de faire le tiens.

    Attention, pour les liaisons on utilise le nom de la liaison et pas le nom du champs. Si le nom à un "s" terminal, c'est qu'il peut y avoir plusieurs entregistrement, donc le nom doit être entre [] sauf si on entre les enregistrements directement, cf vidéos dans action
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

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

Discussions similaires

  1. Eviter les erreurs lors de l'utilisation des compo Tsocket
    Par Coussati dans le forum Composants VCL
    Réponses: 5
    Dernier message: 01/02/2006, 19h14
  2. Réponses: 1
    Dernier message: 26/05/2005, 12h24
  3. Réponses: 7
    Dernier message: 22/02/2005, 13h07
  4. message d'erreur lors de la création de la base
    Par ber_jp dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 20/05/2004, 12h15
  5. message d'erreur lors de la création d'une base
    Par franculo_caoulene dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 16/04/2004, 15h47

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