Skip to content

MelisCmsMcqEngine

Données, services, instantanés XML, évaluation et rendu front-office du système de QCM (quiz). Package melisplatform/melis-cms-mcq-engine.

Présentation

MelisCmsMcqEngine est la couche données et services du système de QCM : il possède les tables de base de données, les services pour les questions, réponses, QCM, groupes et catégories, l'instantané XML qui fige chaque test assemblé, le sélecteur de questions par modèle aléatoire, l'évaluation score / taux de réussite, ainsi que le rendu front-office du quiz. L'interface back-office qui le pilote est MelisCmsMcq — le moteur lui-même n'a pas d'écrans propres. On peut le comparer au duo MelisEngine ↔ MelisCms, mais pour les quiz.

Le test assemblé est stocké sous forme de mcq_xml afin que le rendu et la notation lisent un instantané autonome, et non une jointure en direct, préservant ainsi le QCM exact qu'un utilisateur a constitué même si les questions sous-jacentes sont modifiées ultérieurement.

Activation

Ajouter à config/melis.module.load.php :

php
return [
    // …
    'MelisCmsMcqEngine',
];

Prérequis : melisplatform/melis-cms (^5.3), melisplatform/melis-cms-tags (^5.3), laminas/laminas-paginator, PHP ^8.1|^8.3. Le module embarque dbdeploy: true, ses tables sont donc créées/mises à jour automatiquement. Chaîne d'installation : melis-cms-mcqmelis-cms-mcq-enginemelis-cms + melis-cms-tags.

Services principaux

Tous les services étendent le service générique de MelisCore et déclenchent des événements *_start / *_end. Les alias sont enregistrés dans config/module.config.php.

Alias de serviceRôle
MelisCmsMcqServiceQCM : enregistrer, supprimer, lister, générer/récupérer le XML du QCM, mélanger l'ordre, évaluer les réponses (notation).
MelisCmsMcqQuestionsServiceQuestions : CRUD, génération XML, panier, sélecteur par modèle aléatoire.
MelisCmsMcqAnswersServiceRéponses : CRUD, vérification de la bonne réponse, nombre de réponses par question.
MelisCmsMcqGroupsServiceGroupes de QCM : CRUD, assemblage groupes+questions pour un QCM, désactivation des QCM liés.
MelisCmsMcqQuestionCategoryServiceCatégories de questions (table melis_cms_mcq_question_groups) : CRUD.

Méthodes sélectionnées

MelisCmsMcqService

MéthodeRôle
getMcq($mcqId)Retourne le XML du QCM assemblé ; mélange l'ordre des questions si mcq_random_order est activé.
generateMcqXml($mcqProperties, $mcqTrans, $groupsData)Construit le XML complet du test à partir des groupes et questions, et le stocke dans mcq_xml.
evaluateAnswers($mcqXml, $userAnswers, $passingPercentage)Note une soumission de type QCM ; ignore les questions ouvertes ; retourne le score et la réussite/échec.
getMcqList / saveMcqItem / deleteMcqByIdListe / enregistrement / suppression standard.

MelisCmsMcqQuestionsService

MéthodeRôle
generateQuestionXml()Construit l'instantané XML par question lors de l'enregistrement.
updateMcqQuestionDataXml()Rafraîchit l'instantané de la question dans chaque QCM qui l'utilise.
getRandomQuestionIds($difficultyId, $categoryId, $tagId, $numberOfQuestions, $excludedIds)Sélectionne automatiquement N identifiants de questions par difficulté / catégorie / tag.
generateRandomQuestions($userId, $difficultyId, $categoryId, $tags, $numberOfQuestions, $langId, $alreadySelected)Sélecteur aléatoire de niveau supérieur avec liste d'exclusion.
getQuestionsBasketList / processBasketQuestionsGère le panier de questions par utilisateur.

Front office

ÉlémentRôle
View helper renderMcqQuestions (McqQuestionRendererHelper)Convertit mcq_xml en tableau et affiche le quiz via le template choisi. Pas de MelisTemplatingPlugin — c'est le template hôte qui décide du placement.
Template par défautview/templates/default-preview-template.phtml
Factory d'élément de formulaire McqPreviewTemplatesSelectAlimente un select avec les templates enregistrés sous mcq_preview_templates dans app.interface.php.

Autres factories d'éléments de formulaire utilisées par le back-office : McqQuestionCategoriesSelect, McqQuestionsDifficultySelect, QuestionsTypesSelect.

Tables de base de données

Note de nommage. Les « catégories de questions » du back-office correspondent à melis_cms_mcq_question_groups (service MelisCmsMcqQuestionCategoryService). Les « groupes de QCM » du back-office correspondent à melis_cms_mcq_groups (service MelisCmsMcqGroupsService). Deux tables « group » distinctes — ne pas les confondre.

TableContenu
melis_cms_mcqUn QCM/test : mcq_status, mcq_code, mcq_random_order, mcq_xml (instantané du test assemblé), mcq_passing_rate, dates/utilisateurs.
melis_cms_mcq_transNom du QCM par langue (mcqt_name).
melis_cms_mcq_questionsUne question : mcqq_status, mcqq_code, mcqq_type, mcqq_group_id, mcqq_difficulty_id, mcqq_xml (instantané question+réponses).
melis_cms_mcq_questions_transTexte de la question, mcqqt_candidate_note, mcqqt_corrector_note par langue.
melis_cms_mcq_answersUne réponse : mcqa_question_id, mcqa_status, mcqa_correct_answer, mcqa_code.
melis_cms_mcq_answers_transTexte de la réponse par langue (mcqat_answer_text).
melis_cms_mcq_question_typesTypes de questions : 1 = QCM, 2 = Question ouverte.
melis_cms_mcq_questions_difficulty (+_trans)Niveaux de difficulté : 1 = Facile, 2 = Moyen, 3 = Difficile.
melis_cms_mcq_question_groups (+_trans)Catégories de questions (mcqqg_id, mcqqg_code, mcqqgt_name).
melis_cms_mcq_groups (+_trans)Groupes de QCM (mcqg_id, mcqg_mcq_id, mcqg_code, mcqgt_name), liés à un QCM spécifique.
melis_cms_mcq_questions_listLien questions ↔ QCM (mcmql_mcq_id, mcmql_question_id).
melis_cms_mcq_groups_listLien des groupes au sein d'un QCM (ajouté par migration).
melis_cms_mcq_questions_tags_listLiens question ↔ tag (MelisCmsTags).
melis_cms_mcq_basketsPanier de questions par utilisateur.

Exemple

php
$sm = $this->getServiceLocator();

// --- Récupérer et afficher un quiz ---
$mcqSvc = $sm->get('MelisCmsMcqService');
$mcqXml = $mcqSvc->getMcq($mcqId); // mélange si mcq_random_order est activé

// Dans un template phtml :
echo $this->renderMcqQuestions(
    'MelisCmsMcqEngine/default-template',
    $mcqXml,
    $langId
);

// --- Noter une soumission ---
$result = $mcqSvc->evaluateAnswers($mcqXml, $userAnswers, 50);
// $result['global'] => ['score', 'pass', 'total', 'checked', 'skipped']
// $result['details'] => résultat par question

// --- Modèle aléatoire : sélection automatique de N questions ---
$qSvc = $sm->get('MelisCmsMcqQuestionsService');
$ids  = $qSvc->getRandomQuestionIds(
    $difficultyId,
    $categoryId,
    $tagId,
    $numberOfQuestions,
    $excludedIds
);

Fichiers clés

ÉlémentChemin
Câblage du module + alias de servicesvendor/melisplatform/melis-cms-mcq-engine/config/module.config.php
Config plugin (groupes par défaut, templates de prévisualisation)vendor/melisplatform/melis-cms-mcq-engine/config/app.interface.php
Service QCM (XML, notation)vendor/melisplatform/melis-cms-mcq-engine/src/Service/MelisCmsMcqService.php
Service questions (panier, modèle aléatoire)vendor/melisplatform/melis-cms-mcq-engine/src/Service/MelisCmsMcqQuestionsService.php
Service réponsesvendor/melisplatform/melis-cms-mcq-engine/src/Service/MelisCmsMcqAnswersService.php
Service groupesvendor/melisplatform/melis-cms-mcq-engine/src/Service/MelisCmsMcqGroupsService.php
Service catégories de questionsvendor/melisplatform/melis-cms-mcq-engine/src/Service/MelisCmsMcqQuestionCategoryService.php
Passerelles de tablesvendor/melisplatform/melis-cms-mcq-engine/src/Model/Tables/
Factories d'éléments de formulairevendor/melisplatform/melis-cms-mcq-engine/src/Form/Factory/
View helpervendor/melisplatform/melis-cms-mcq-engine/src/View/Helper/McqQuestionRendererHelper.php
Template front par défautvendor/melisplatform/melis-cms-mcq-engine/view/templates/default-preview-template.phtml
Installation DB + migrationsvendor/melisplatform/melis-cms-mcq-engine/install/dbdeploy/

Voir aussi : Référence des modules · MelisCmsMcq · MelisCms