Bonjour à tous,
Je rencontre un gros problème d'architecture et j'ai besoin de votre aide pour, peut-être, m'aiguiller vers d'autres pistes auxquelles je n'ai pas pensé (sachant que j'ai toujours eu l'habitude de ne pas réussir à me contenter de solutions bancales, et que j'ai beaucoup de mal à vivre avec quelque chose qui ne me convient pas architecturalement parlant).
Voici la problématique : j'ai besoin, pour mon site, de leçons qui sont constituées de plusieurs éléments prédéfinis du point de vue HTML. J'ai fait ressortir deux types d'éléments principaux : les exercices, avec lesquels l'utilisateur doit donc pouvoir être capable de vérifier ses réponses et d'avoir un feedback approprié (assimilable à un message d'erreur), et d'autre part des "textes", c'est-à-dire, par exemple, une liste de vocabulaire, un dialogue écrit...
A l'intérieur de ces deux groupes j'ai défini précisément les différents éléments. Par exemple, dans le groupe "texte", j'ai un élément Dialog :
La plupart des éléments texte sont basés sur le même modèle, seuls la classe, le h2 et les instructions diffèrent.
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 <div id="element_number" class="dialog"> <h2>Dialogue</h2> <p class="instructions"> Lisez attentivement le dialogue ci-dessous, écoutez-le plusieurs fois et tentez de repérez les mots importants, sans lire la traduction (onglet suivant). </p> <dl> <dt>Personnage 1</dt> <dd>Dialogue 1.</dd> <dt>Personnage 2</dt> <dd>Dialogue 2.</dd> <dt>Personnage 3</dt> <dd>Dialogue 3.</dd> </dl> </div>
Concernant les exercices, j'ai par exemple des vrais/faux, des QCM, des exercices de traduction... Par exemple :
Bref, le markup de la plupart des éléments d'une leçon sont faits et le tout me semble relativement propre... reste maintenant à coder tout ça.
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 <div id="element_number" class="missing_word"> <h2>Exercice : mots manquants</h2> <p class="instructions"> Complétez chaque phrase avec les mots qui conviennent suivant la traduction donnée (chaque espace vide correspond à exactement un mot). </p> <dl> <dt>Comment vas-tu ?</dt> <dd> How <input type="text" size="10" name="element_6_0_0"> you ? </dd> <dt>Ça va bien, merci.</dt> <dd> <input type="text" size="10" name="element_6_1_0"> fine, <input type="text" size="10" name="element_6_1_1">. </dd> </dl> <a href="#">Vérifier</a><br> <a href="#">Afficher la correction</a> </div>
La première chose à laquelle j'ai pensé pour le stockage tout d'abord, c'est d'avoir mon modèle Lesson qui contient les éléments de la leçon, puis la leçon est sérialisée pour être enregistrée en base (ce qui va sérialiser les éléments de la leçon). Tout d'abord est-ce une bonne solution de passer par la sérialisation ? C'est la solution la plus simple que je vois.
Mon plus gros soucis et là ou je vous sollicite c'est... comment créer les éléments ? J'ai de nombreuses idées en tête, mais aucune de me convient. Je vous les énumère ci-dessous :
EDIT : je rajouterais que concrètement à Zend_Form ou un élément correspond à un champ, mon élément de leçon comme je l'appelle est un type d'exercice ou de texte (dialogue, QCM...), chaque élément pouvant contenir un nombre n de couples (question/réponse(s)).
- De par la nature des exercices (soumission de valeurs, vérifications, affichage de message d'erreur si faux) j'ai tout de suite pensé à utiliser Zend_Form. En plus je peux ainsi bénéficier de la puissance des décorateurs pour formater le code. Mais quelle est la solution la plus propre... Créer mes propres éléments, un élément correspondant à un type d'exercice (vrai/faux, QCM...) ? Ou alors utiliser les éléments fournis mais passer par des décorateurs personnalisés qui me permettraient de spécifier mes couples questions/réponses... ?
Quid des autres éléments de type texte de la leçon ? D'après moi tous les éléments d'une leçon devraient partager une classe de base commune, mais faire hériter une leçon de grammaire de Zend_Form me pose problème...
La solution Zend_Form me pose également problème car pour l'instant, je ne l'ai utilisé qu'avec des formulaires aux champs pré-définis. Ici, chaque formulaire, chaque élément de ce formulaire, doit avoir un nom généré correct (j'ai une hiérarchie de element_num, puis pour chaque élément element_num_num, et ainsi de suite...).- L'autre solution à laquelle j'avais pensé est un peu plus complexe, et en y réfléchissant j'ai eu un peu l'impression de réinventer Zend_Form finalement, mais l'architecture est plus logique je trouve. En gros, j'ai mon modèle Model_Lesson qui comme tout à l'heure contient un ensemble d'éléments de leçon.
Le modèle offrirait plusieurs fonctions pour créer/retirer des éléments et générer les bons noms. Les éléments dériveraient tous d'une classe de base Model_Lesson_ElementAbstract, puis deux classes Model_Lesson_ExerciseAbstract et Model_Lesson_TextAbstract (ces deux classes héritant de Model_Lesson_ElementAbstract).
Puis j'aurais plusieurs classes héritant de Model_Lesson_ExerciseAbstract, en l'occurrence une classe pour le type d'exercice, idem pour TextAbstract.
Puis, pour dessiner la leçon, des view helpers, ou alors des fonctions render dans toutes ces classes pour renvoyer le markup HTML.
Mais j'ai l'impression de réécrire un peu Zend_Form dans certains côtés...
EDIT : une dernière solution auquel je viens de penser mais que je trouve toujours très "moyenne" serait d'utiliser des subforms : un formulaire global engloberait tous les éléments de la leçon, et chaque subform un type bien précis (par exemple un subform contenant un dialogue, un autre contenant des vrais/faux...). Dans ce cas là, un élément reviendrait à un élément au sens de Zend_Form. Mais par contre, toujours ce soucis conceptuel de faire hériter d'un formulaire un élément contenant un dialogue ou des notes explicatives...
Désolé pour la longueur du post, mais depuis deux semaines que je cherche, je ne cesse de tourner autour de ces deux solutions qui ne me satisfassent qu'à moitié, et peut-être qu'il y a d'autres solutions plus simples/logiques.
Merci de votre aide !
Partager