Skip to Content
MoodlePartie 1 — Découvrir MoodleLe vocabulaire Moodle : construire votre modèle mental

Chapitre 2 — Le vocabulaire Moodle : construire votre modèle mental

Partie 1 : Découvrir Moodle — Chapitre 2/5 Objectif : maîtriser tout le lexique Moodle. Pour chaque terme : le libellé de l’interface française, le terme anglais (celui de la documentation et des forums), et le terme utilisé dans le code (noms de classes, de tables, de plugins). En fin de chapitre : un modèle mental complet pour développeur web.


Sommaire du chapitre

  1. Pourquoi le vocabulaire est la moitié du travail
  2. Le site et la page d’accueil
  3. Catégories et cours
  4. Sections et formats de cours
  5. Activités et ressources : la distinction fondamentale
  6. Les blocs
  7. Tableau de bord et pages personnelles
  8. Utilisateurs et profils
  9. L’inscription (enrolment) : le concept le plus mal compris
  10. Rôles, capacités et contextes : l’idée générale
  11. Cohortes
  12. Groupes et groupements
  13. Le carnet de notes
  14. Achèvement, restriction d’accès et progression
  15. Badges
  16. Compétences
  17. Vocabulaire transverse : le reste de l’iceberg
  18. Le grand tableau de correspondance FR / EN / code
  19. Le modèle mental complet pour un développeur web
  20. Synthèse

1. Pourquoi le vocabulaire est la moitié du travail

Moodle a 24 ans, une communauté mondiale, et une interface traduite en plus de 100 langues. Conséquence : chaque concept porte au moins trois noms — celui de l’interface française (qui a parfois changé au fil des versions de traduction), celui de l’interface anglaise (la référence de toute la documentation), et celui du code (tables SQL, classes PHP, noms de plugins), qui est parfois un troisième mot hérité de 2002.

Un exemple pour fixer les idées : ce que l’interface française appelle une « inscription » s’appelle enrolment en anglais, et dans le code vous manipulerez des plugins enrol_*, des tables enrol et user_enrolments, et une API enrol_get_users_courses(). Si vous cherchez « inscription » dans le code, vous ne trouverez rien ; si vous cherchez « registration », vous trouverez… la création de compte, qui est un tout autre sujet. Sans le triptyque FR/EN/code, on se noie.

Ce chapitre est conçu comme la référence que vous garderez ouverte pendant des mois. Prenez le temps de le lire entièrement une fois, puis revenez-y en dictionnaire.

💡 Pour un dev React : c’est l’équivalent d’apprendre le vocabulaire de Next.js (route segments, server components, middleware, ISR…) — sauf que le domaine est plus vaste et le vocabulaire trilingue. Investissement obligatoire, rentabilisé dès la première semaine.


2. Le site et la page d’accueil

2.1 Le site (site)

Interface FRle site, la plateforme
Anglaissite
Code$SITE (variable globale), constante SITEID (= 1), table course ligne id=1

Une installation Moodle = un site. Un site a un nom complet (full site name), un nom abrégé (short name), une configuration globale (des milliers de réglages stockés dans les tables config et config_plugins) et un seul domaine (l’URL racine, $CFG->wwwroot, est fixée dans la configuration — la changer implique une procédure spécifique).

Détail architectural savoureux que vous devez connaître dès maintenant : le site lui-même est techniquement un cours — la ligne id = 1 de la table course. C’est un choix de 2002 qui a traversé les âges : la page d’accueil du site est implémentée comme un cours spécial (format site), ce qui lui permet d’accueillir des activités et des blocs comme n’importe quel cours. D’où la constante SITEID que vous croiserez partout dans le code : elle vaut 1 et sert à tester « suis-je dans un vrai cours ou au niveau du site ? ».

⚠️ Piège : Moodle LMS est mono-tenant : une installation = un site = une communauté d’utilisateurs, un thème principal, une configuration. Si un client veut « plusieurs portails de marque différents avec des utilisateurs isolés », les réponses honnêtes sont : plusieurs installations, ou Moodle Workplace (multi-tenant natif), ou des contorsions à base de cohortes/thèmes par catégorie qui n’offrent qu’une isolation cosmétique, pas une isolation de sécurité.

2.2 La page d’accueil (frontpage)

Interface FRPage d’accueil (parfois « Accueil du site »)
AnglaisFront page / Site home
Codele cours SITEID, réglages $CFG->frontpage*, contexte de cours du site

La frontpage est la page visible sur l’URL racine du site. Elle est configurable dans l’administration : on peut y afficher une liste de cours, des catégories, des annonces du site, une section de contenu libre, des blocs. Depuis Moodle 4.x, la navigation principale l’appelle « Accueil » (Home), par opposition au « Tableau de bord » (Dashboard) qui est la page personnelle de l’utilisateur connecté. Beaucoup de sites masquent presque tout de la frontpage et redirigent les utilisateurs connectés directement vers leur tableau de bord (réglage Start page for users / « Page d’accueil pour les utilisateurs »).


3. Catégories et cours

3.1 Les catégories de cours (course categories)

Interface FRCatégories de cours
AnglaisCourse categories
Codetable course_categories, classe core_course_category, contexte CONTEXT_COURSECAT

Les catégories forment un arbre hiérarchique (profondeur illimitée) qui range les cours : par exemple Université > UFR Sciences > Licence Informatique > L3 > Semestre 5. Une catégorie peut contenir des sous-catégories et des cours. Points importants :

  • Les catégories sont un nœud de délégation : on peut attribuer des rôles au niveau d’une catégorie (par exemple, nommer un « gestionnaire » de l’UFR Sciences qui pourra administrer tous les cours en dessous). C’est le mécanisme central de la décentralisation administrative.
  • Certains réglages et objets peuvent vivre au niveau catégorie : cohortes, banques de questions (via les contextes), référentiels de compétences, filtres.
  • Chaque catégorie a un champ idnumber (identifiant externe libre) qui sert aux synchronisations avec le système d’information.

💡 Pour un dev React : pensez « arborescence de dossiers avec ACL héritées », comme les dossiers d’un Google Drive d’organisation : le droit accordé sur un dossier se propage à tout ce qu’il contient. La table utilise une colonne path matérialisée (du type /1/8/42) — un classique materialized path — pour requêter efficacement les sous-arbres.

3.2 Le cours (course)

Interface FRCours
AnglaisCourse
Codetable course, get_course(), contexte CONTEXT_COURSE, format via plugins format_*

Le cours est l’unité centrale de Moodle — l’espace où tout se passe. Un cours :

  • appartient à une catégorie ;
  • possède un nom complet (fullname), un nom abrégé (shortname, unique sur le site), un idnumber externe optionnel, des dates de début/fin, un résumé, une image de cours ;
  • est découpé en sections (voir §4) contenant des activités et ressources (voir §5) ;
  • a ses propres participants (via les inscriptions, §9), groupes (§12), carnet de notes (§13), banque de questions, badges, compétences ;
  • a un format (thématique, hebdomadaire… §4.2) et des réglages d’apparence, d’achèvement, de fichiers.

Ne projetez pas trop vite vos intuitions : un « cours » Moodle peut représenter une UE universitaire sur un semestre, un module de formation professionnelle de deux heures, un espace collaboratif d’équipe pédagogique, un espace d’examen, ou un bac à sable. C’est un conteneur générique d’apprentissage avec inscriptions et suivi.

💡 Pour un dev React : le cours est à Moodle ce que le « project/workspace » est à Linear, Notion ou Slack : l’unité d’appartenance, de permissions et de contenu. Membership (inscription) + rôles par workspace (enseignant/étudiant) + contenu structuré (sections/activités) + activité trackée (logs, notes).


4. Sections et formats de cours

4.1 Les sections (course sections)

Interface FRSections (selon le format : « Sections », historiquement « Thèmes »/« Semaines »)
AnglaisCourse sections (topics / weeks)
Codetable course_sections, classe section_info, API core_courseformat

Une section est une tranche verticale de la page de cours : un bloc titré contenant une liste ordonnée d’activités et de ressources. La section 0 (« générale ») est particulière : elle apparaît en tête de cours et accueille traditionnellement les annonces et la présentation. Depuis Moodle 4.x, les sections peuvent être affichées « une par page » avec navigation linéaire (améliorée en 5.x, notamment la navigation entre activités), réordonnées par glisser-déposer dans l’index de cours, et depuis les versions 4.5/5.x on gère aussi des sous-sections (subsections, via le module mod_subsection introduit en 4.5) — une demande vieille de quinze ans.

4.2 Les formats de cours (course formats)

Interface FRFormat de cours
AnglaisCourse format
Codeplugins format_* (format_topics, format_weeks, format_singleactivity, format_social)

Le format détermine comment le cours est structuré et rendu. Formats du cœur :

FormatFRComportement
format_topicsThématique (« Sections personnalisées »)Sections libres, nommées manuellement — le format par défaut et le plus utilisé
format_weeksHebdomadaireUne section par semaine, datée automatiquement à partir de la date de début du cours
format_singleactivityActivité uniqueLe cours entier EST une seule activité (ex. : un unique SCORM ou un unique forum)
format_socialSocialUn forum central en page de cours (héritage direct du Moodle originel de 2002)

Le format est un type de plugin à part entière : le répertoire de plugins regorge de formats tiers très populaires (Tiles, Grid, Collapsed Topics…) qui changent radicalement la présentation. C’est souvent la première demande de personnalisation d’un client. Depuis Moodle 4.0, l’API des formats (core_courseformat) a été refondue avec un rendu piloté par composants JavaScript et une réactivité de l’édition très supérieure — les vieux formats tiers non portés sur cette API sont à fuir.


5. Activités et ressources : la distinction fondamentale

C’est LE couple de termes à maîtriser absolument.

5.1 Définitions

RessourceActivité
Interface FRRessourceActivité
AnglaisResourceActivity
IdéeContenu consulté passivementTâche où l’étudiant agit et laisse une trace
ExemplesFichier, Dossier, Page, Livre, URL, Zone de texte et média (ex-« étiquette »)Devoir, Test, Forum, Wiki, Atelier, Leçon, Glossaire, Base de données, Sondage, H5P, SCORM, Paquetage IMS, Outil externe (LTI), BigBlueButton, Feedback, Chat
Produit des données ?Non (au mieux un log de consultation)Oui : soumissions, tentatives, messages, notes
Notable dans le carnet de notes ?NonSouvent oui

5.2 Dans le code : tout est « module »

Voici le point crucial : dans le code, activités et ressources sont exactement la même chose — des modules d’activité (activity modules), c’est-à-dire des plugins de type mod :

Codeplugins mod_* (mod_assign, mod_quiz, mod_forum, mod_resource, mod_page, mod_url…), table modules (la liste des types installés), table course_modules (les instances placées dans les cours)

La distinction activité/ressource n’est qu’une catégorie d’affichage dans le sélecteur d’ajout (chaque module déclare s’il se considère ressource ou activité via une constante de « purpose »/archétype). Architecturalement, mod_page (une ressource) et mod_quiz (l’activité la plus complexe de Moodle) sont deux plugins du même type.

5.3 Le « course module » : l’indirection à comprendre une fois pour toutes

Quand un enseignant ajoute un Test à son cours, Moodle crée deux enregistrements liés :

  1. Une ligne dans la table du module (quiz) : l’instance métier, avec ses réglages propres (durée, notes, méthode de correction…).
  2. Une ligne dans la table course_modules : le course module (abrégé partout cm), qui matérialise le placement de cette instance dans un cours — sa section, sa visibilité, ses restrictions d’accès, ses réglages d’achèvement, son mode de groupe.

L’ID que vous voyez dans l’URL (/mod/quiz/view.php?id=123) est l’ID du course module, pas celui du quiz. Cette dualité cmid / instanceid est le piège n° 1 du débutant Moodle, source d’innombrables bugs.

⚠️ Piège : ne confondez jamais cm->id (l’ID dans course_modules, celui des URLs) et cm->instance (l’ID dans la table quiz, assign, etc.). Les deux sont des entiers, les deux « marchent » parfois par coïncidence sur un site de dev fraîchement installé (quand les compteurs sont proches), puis tout explose en production. Chaque module a par ailleurs son propre contexte (CONTEXT_MODULE), troisième identifiant distinct.

💡 Pour un dev React : les modules d’activité sont les « apps » d’un store installées dans un workspace : le type (mod_quiz ≈ l’app), l’instance (ce quiz précis ≈ le document), le course module (son emplacement, sa visibilité, ses droits ≈ le nœud dans l’arborescence). Une normalisation relationnelle assez élégante, en fait.

5.4 Les modules d’activité standard de Moodle 5.2

Pour votre culture (chaque nom code = plugin mod_<nom>) : assign (Devoir), quiz (Test), forum (Forum), resource (Fichier), folder (Dossier), page (Page), book (Livre), url (URL), label (Zone texte et média), glossary (Glossaire), wiki (Wiki), workshop (Atelier), lesson (Leçon), choice (Sondage), feedback (Feedback), data (Base de données), scorm (Paquetage SCORM), imscp (Paquetage IMS), lti (Outil externe), h5pactivity (H5P), bigbluebuttonbn (BigBlueButton), subsection (Sous-section), chat (Chat, en voie de retrait), qbank (Banque de questions, module dédié depuis 4.5/5.x). Les anciens modules survey et chat ont été dépréciés/retirés dans les versions 4.x–5.x.


6. Les blocs

Interface FRBlocs
AnglaisBlocks
Codeplugins block_* (block_calendar_month, block_html, block_myoverview…), tables block_instances, block_positions

Un bloc est un widget rectangulaire placé en périphérie d’une page — depuis le thème Boost, essentiellement dans le tiroir de blocs (block drawer) qui s’ouvre à droite, et sur certaines pages comme le tableau de bord. Exemples : calendrier, événements à venir, derniers messages, HTML libre, progression, activités récentes.

Points de repère :

  • Les blocs sont un type de plugin historique en perte d’importance : les thèmes modernes (Boost) les ont marginalisés visuellement, et le tableau de bord 5.2 en réduit encore le rôle. Ne concevez plus une fonctionnalité en pariant sur « l’utilisateur ajoutera le bloc » — beaucoup ne découvrent jamais le tiroir.
  • Un bloc peut être placé à différents niveaux (site, catégorie, cours, page d’activité, tableau de bord) et sa visibilité paramétrée par page ; le placement est stocké dans block_instances avec le contexte parent.
  • Le tableau de bord historique était entièrement fait de blocs (dont block_myoverview, « Vue d’ensemble des cours », et block_timeline) ; la refonte 5.2 recompose ces informations dans une page plus intégrée.

💡 Pour un dev React : les blocs sont les widgets d’un dashboard à la iGoogle/Notion — configurables, positionnables, avec instance et préférences par utilisateur. Si un client vous demande « un petit encart qui affiche X sur le tableau de bord », la réponse classique est un plugin block_*.


7. Tableau de bord et pages personnelles

Interface FRTableau de bord
AnglaisDashboard
Codepage /my/, réglages my_pages, blocs myoverview/timeline, refonte core_my en 5.x

Le tableau de bord est la page d’atterrissage personnelle de l’utilisateur connecté : vue de ses cours, échéances à venir (timeline), progression, événements. Il a été refondu en Moodle 5.2 (phase 1 d’un chantier pluri-versions) : présentation centrée sur les échéances et l’action immédiate, moins dépendante du système de blocs. Historiquement, chaque utilisateur pouvait personnaliser son tableau de bord (ajouter/déplacer des blocs) et l’administrateur définir un tableau par défaut, réinitialisable pour tous.

À distinguer de deux cousines :

  • « Mes cours » (My courses, /my/courses.php) : page listant tous les cours de l’utilisateur, entrée dédiée de la navigation principale depuis Moodle 4.0.
  • Le profil (voir §8) : la page publique/semi-publique décrivant l’utilisateur.

8. Utilisateurs et profils

Interface FRUtilisateur, profil
AnglaisUser, profile
Codetable user, $USER (session), contexte CONTEXT_USER, champs de profil personnalisés dans user_info_field/user_info_data

Le compte utilisateur est global au site (rappel : mono-tenant). Chaque utilisateur a : identifiant de connexion (username), méthode d’authentification (plugin auth_* : manuelle, LDAP, CAS, SAML2, OAuth 2, etc. — l’authentification est un sujet distinct de l’inscription !), nom/prénom/courriel, préférences (langue, fuseau horaire, préférences de notification), avatar, et des champs de profil personnalisés définissables par l’administrateur (l’équivalent d’un schéma extensible clé-valeur).

La page de profil existe en deux saveurs : profil de site et profil « dans un cours » (accessible via les participants d’un cours, montrant les informations pertinentes à ce cours). La visibilité des champs est finement contrôlée.

⚠️ Piège : « créer un compte » (authentification) et « donner accès à un cours » (inscription) sont deux mécanismes totalement disjoints dans Moodle, gérés par deux familles de plugins différentes (auth_* vs enrol_*). Un utilisateur peut avoir un compte et n’être inscrit à aucun cours ; c’est l’état par défaut après création. Cette séparation, très propre conceptuellement, surprend tous les débutants qui cherchent « le » réglage d’accès.


9. L’inscription (enrolment) : le concept le plus mal compris

Interface FRInscription (aux cours) ; « méthodes d’inscription »
AnglaisEnrolment (orthographe britannique dans tout Moodle ; enrollment américain quasi absent)
Codeplugins enrol_*, tables enrol (les méthodes activées dans un cours) et user_enrolments (les inscriptions individuelles)

L’inscription est le lien d’appartenance entre un utilisateur et un cours : « Alice est inscrite au cours de Biologie ». C’est ce lien qui fait apparaître le cours dans « Mes cours » d’Alice, la rend visible dans les participants, lui crée une ligne de carnet de notes, etc. L’inscription est portée par des méthodes d’inscription (enrolment methods), qui sont des plugins :

PluginFRUsage
enrol_manualInscription manuelleL’enseignant/gestionnaire inscrit les utilisateurs un à un
enrol_selfAuto-inscriptionL’utilisateur s’inscrit lui-même (avec ou sans clef d’inscription)
enrol_cohortSynchronisation de cohortesToute la cohorte X est inscrite automatiquement (voir §11)
enrol_databaseBase de données externeSynchronisation depuis le SI (scolarité) — le pilier des universités
enrol_ldapLDAPSynchronisation depuis l’annuaire
enrol_metaLien méta-coursLes inscrits du cours A sont automatiquement inscrits au cours B
enrol_guestAccès anonymeConsultation sans inscription (lecture seule, pas de traces)
enrol_paypal, enrol_feePaiementVente de cours (avec la Payment API depuis 3.11)
enrol_ltiPublication LTILe cours est consommé comme outil LTI par une autre plateforme

Chaque inscription porte un statut (active/suspendue), des dates de début/fin éventuelles, et détermine avec quel rôle l’utilisateur entre dans le cours (le rôle par défaut de la méthode, typiquement « Étudiant »). Un même utilisateur peut être inscrit au même cours par plusieurs méthodes simultanément (cas réel : inscription SI + inscription manuelle), ce qui produit des situations subtiles lors des désinscriptions.

💡 Pour un dev React : user_enrolments est votre table de jointure memberships dans une app multi-workspace (user_id, workspace_id, status, via = invitation/SSO/import). La particularité Moodle : la provenance de l’appartenance est un plugin de plein droit, avec sa logique de synchronisation, ses tâches cron et son cycle de vie. C’est ce qui rend possible « brancher les inscriptions sur n’importe quel SI » sans toucher au cœur.


10. Rôles, capacités et contextes : l’idée générale

Le système de permissions de Moodle mérite (et aura) une partie entière de cette documentation. Ici, plantons seulement les trois concepts et le vocabulaire, car tout le reste du produit y fait référence.

10.1 Les trois briques

ConceptFRENCodeIdée
RôleRôleRoletable role, role_assignmentsUn paquet nommé de permissions : Étudiant, Enseignant, Enseignant non éditeur, Gestionnaire, Administrateur… entièrement personnalisables et duplicables
CapacitéCapacitéCapabilitytable capabilities, chaînes du type mod/assign:gradeUne permission atomique : « corriger des devoirs », « voir les notes cachées », « gérer les blocs ». Il y en a plus de 700. Chaque rôle définit pour chaque capacité : Autoriser / Empêcher / Interdire / Non défini
ContexteContexteContexttable context, classes context_system, context_coursecat, context_course, context_module, context_block, context_userLe « lieu » où un rôle est attribué et où une capacité est évaluée. Les contextes forment un arbre : Système > Catégorie > Cours > Module/Bloc (+ contexte Utilisateur)

10.2 La phrase à retenir

On attribue un rôle à un utilisateur dans un contexte, et les permissions héritent le long de l’arbre des contextes. « Bob est Enseignant dans le cours de Chimie » ; « Carla est Gestionnaire dans la catégorie UFR Droit » (donc dispose de ses capacités dans tous les cours en dessous) ; « Diane est Administratrice au niveau système ». Il n’y a pas de rôle global intrinsèque : être « enseignant » n’existe pas dans l’absolu, on est enseignant quelque part. (Seul le compte administrateur principal échappe au système.)

💡 Pour un dev React : c’est un RBAC hiérarchique avec héritage et overrides — imaginez les permissions GitHub (org > team > repo) ou un système de policies avec scopes imbriqués, en plus granulaire. Le contexte est la clef de voûte de tout Moodle : chaque page, chaque fichier, chaque appel de permission est rattaché à un contexte. Intégrez dès maintenant le réflexe : « dans quel contexte suis-je ? » est la première question de tout développeur Moodle, comme « dans quel segment de route suis-je ? » en Next.js.

⚠️ Piège : le rôle « Administrateur » n’est pas un rôle comme les autres (c’est un statut à part, site administrators, qui court-circuite les vérifications), et le rôle affiché n’implique rien : les noms de rôles sont renommables librement. Ne codez jamais une logique du type « si le rôle s’appelle Teacher » ; on teste toujours des capacités, jamais des noms de rôles. Vous verrez cela en détail en Partie 2.


11. Cohortes

Interface FRCohortes
AnglaisCohorts
Codetables cohort, cohort_members, API cohort_* (lib cohort/lib.php)

Une cohorte est un groupe d’utilisateurs au niveau du site ou d’une catégorie — indépendant de tout cours. Exemple : la cohorte « L3-Info-2026 » contient les 180 étudiants de la promotion. Usage principal : l’inscription par cohorte (enrol_cohort) — on synchronise la cohorte sur les 12 cours du semestre, et chaque ajout/retrait dans la cohorte se propage automatiquement. Les cohortes servent aussi aux dérogations de visibilité, à l’affectation d’audiences (tableaux de bord, plans de compétences) et aux règles dans divers plugins. Elles sont alimentées manuellement, par import CSV, ou automatiquement (LDAP, web services, plugins de synchronisation).

⚠️ Piège : ne confondez pas cohortes (niveau site/catégorie, servent surtout à inscrire en masse) et groupes (niveau cours, servent à séparer les participants à l’intérieur d’un cours, §12). C’est LA confusion classique. Moyen mnémotechnique : cohorte = « promo » (existe avant et en dehors des cours) ; groupe = « TD n° 3 » (n’a de sens que dans un cours donné).


12. Groupes et groupements

12.1 Les groupes (groups)

Interface FRGroupes
AnglaisGroups
Codetables groups, groups_members, API groups_* (lib group/lib.php)

Un groupe vit à l’intérieur d’un cours et partitionne ses participants : « TD1 », « TD2 », « Équipe projet A ». Les activités et le cours ont un mode de groupe (group mode) :

ModeFREffet
NOGROUPSPas de groupesTout le monde ensemble
SEPARATEGROUPSGroupes séparésChaque groupe ne voit que lui-même (forums cloisonnés, devoirs filtrés par groupe pour la correction…)
VISIBLEGROUPSGroupes visiblesChacun travaille dans son groupe mais peut voir les autres

Le mode peut être forcé au niveau du cours (il s’impose alors à toutes les activités) ou réglé activité par activité. Les groupes servent aussi aux devoirs de groupe (une remise pour toute l’équipe), à la restriction d’accès (« visible seulement par le groupe TD2 »), au filtrage du carnet de notes et des rapports.

12.2 Les groupements (groupings)

Interface FRGroupements
AnglaisGroupings
Codetables groupings, groupings_groups

Un groupement est un ensemble de groupes (un groupe de groupes). Utilité : quand un cours a plusieurs systèmes de découpage simultanés. Exemple : le cours a les groupes TD1–TD6 et les équipes-projet A–H. On crée le groupement « TD » (contenant TD1–TD6) et le groupement « Projets » (contenant A–H) ; on peut alors dire « ce devoir fonctionne avec le groupement Projets » ou « cette activité n’est accessible qu’au groupement TD ». Sans groupements, les deux découpages se mélangeraient.

💡 Pour un dev React : groupes = tags de partition sur les membres d’un workspace ; groupements = namespaces de tags. C’est un système à deux niveaux, pas plus (pas de groupes de groupements).


13. Le carnet de notes

Interface FRCarnet de notes (et « Notes »)
AnglaisGradebook (grades)
CodeAPI grade_* (lib lib/gradelib.php), tables grade_items, grade_grades, grade_categories, grade_outcomes ; rapports gradereport_*, méthodes d’agrégation, échelles dans scale

Le carnet de notes est le sous-système le plus redouté de Moodle — puissant et complexe. Chaque cours a le sien. Concepts :

  • Élément d’évaluation (grade item, table grade_items) : une colonne du carnet. Créé automatiquement par chaque activité notable (un Test crée son grade item ; sa note s’y synchronise), ou manuellement (note de participation saisie à la main).
  • Note (grade, table grade_grades) : la cellule — la note d’un utilisateur pour un item, avec note brute, note finale (après éventuel recalcul/surcharge), feedback, états caché/verrouillé/surchargé (overridden).
  • Catégories de notes (grade categories) : arbre qui regroupe les items (« Contrôle continu », « Examen ») avec une méthode d’agrégation par catégorie : moyenne pondérée, moyenne simple, naturelle (somme), médiane, note la plus haute… et des options retorses (abandonner les n plus basses, exclure les notes vides…).
  • Échelles (scales) : notations non numériques (« Insuffisant / Satisfaisant / Excellent »), définies au niveau site ou cours.
  • Lettres (grade letters) : mapping pourcentage → lettre (A, B, C…).
  • Barèmes avancés (advanced grading) : rubriques (rubrics) et guides d’évaluation pour noter les devoirs critère par critère (sous-système grading, distinct mais connecté).
  • Rapports : vue Évaluateur (Grader report, le tableau complet), Utilisateur (ce que voit l’étudiant), Vue d’ensemble, export/import (CSV, XML, Excel).

Le flux à retenir : l’activité note → pousse vers le carnet → le carnet agrège → l’étudiant voit (selon les réglages de visibilité). La note « dans l’activité » et la note « dans le carnet » peuvent différer (surcharge dans le carnet, recalculs, verrouillages) — source infinie de tickets de support.

⚠️ Piège : si un enseignant modifie une note directement dans le carnet, elle devient surchargée (overridden) et l’activité ne peut plus la mettre à jour — le lien de synchronisation est rompu pour cette cellule. Des générations d’enseignants ont « perdu » des notes ainsi. En tant que dev, quand on vous signale « la note ne se met pas à jour », vérifiez d’abord le drapeau overridden.


14. Achèvement, restriction d’accès et progression

Trois mécanismes voisins souvent confondus :

MécanismeFRENCodeRôle
Achèvement d’activitéAchèvement d’activitéActivity completionAPI completion, tables course_modules_completionDéfinit quand une activité est « terminée » : manuellement (case cochée par l’étudiant) ou par conditions (consultée, note obtenue, note de passage, remise effectuée…)
Achèvement de coursAchèvement de coursCourse completiontable course_completionsLe cours est « terminé » quand des conditions sont réunies (activités X, Y achevées, note finale, durée, validation manuelle…)
Restriction d’accèsRestriction d’accès / accès conditionnelRestrict access / availabilityAPI core_availability, plugins availability_* (date, note, groupe, profil, achèvement…), champ JSON availability de course_modulesConditionne la visibilité/disponibilité d’une activité ou section : « visible seulement après le 15 mars ET si le Quiz 1 est réussi ET pour le groupe TD2 » (conditions combinables en arbres ET/OU)

Ensemble, achèvement + restrictions permettent de construire des parcours conditionnels (du séquençage pédagogique) sans une ligne de code. La progression affichée aux étudiants (pourcentages, barres) découle des données d’achèvement.

💡 Pour un dev React : la restriction d’accès est un moteur de règles déclaratif dont les conditions sont… des plugins (availability_*). Le JSON stocké ressemble à s’y méprendre à un arbre de conditions à la react-querybuilder. Si un client demande une condition exotique (« accessible seulement depuis le réseau du campus »), la réponse est un petit plugin availability — un des types de plugins les plus simples à écrire.


15. Badges

Interface FRBadges
AnglaisBadges
Codetables badge, badge_issued, badge_criteria, lib lib/badgeslib.php

Les badges sont des reconnaissances numériques conformes au standard Open Badges (métadonnées vérifiables embarquées dans l’image du badge) : un visuel + un émetteur + des critères + une preuve. Deux niveaux : badges de site et badges de cours. Attribution manuelle (par rôle habilité) ou automatique sur critères : achèvement d’activités, achèvement de cours, compétence validée, champ de profil, autres badges obtenus, cohorte. Les utilisateurs peuvent exporter leurs badges vers des sacs à badges externes (backpacks) compatibles.


16. Compétences

Interface FRCompétences
AnglaisCompetencies
CodeAPI core_competency (tables competency, competency_framework, competency_plan, competency_usercomp…)

Le sous-système de compétences (depuis Moodle 3.1) outille l’approche par compétences (CBE, Competency-Based Education) :

  • Référentiel de compétences (competency framework) : arbre de compétences défini au niveau site/catégorie, avec échelles de maîtrise (« Non acquis / En cours / Acquis »).
  • Compétences liées aux cours et activités : un cours déclare les compétences qu’il travaille ; une activité peut, à son achèvement, déclencher une action (attacher une preuve, demander une évaluation, valider la compétence).
  • Plans de formation (learning plans) : ensemble de compétences assigné à un utilisateur ou une cohorte, suivi dans le temps, évaluable par des évaluateurs.
  • Preuves d’apprentissage antérieur (prior learning evidence) : pièces jointes justifiant une maîtrise.

C’est un module apprécié en formation professionnelle et dans le secondaire ; dans le supérieur français, son adoption progresse avec l’approche par compétences des maquettes.


17. Vocabulaire transverse : le reste de l’iceberg

Termes que vous rencontrerez dès la première semaine, à connaître au moins de nom :

FR (interface)ENCodeEn une phrase
Banque de questionsQuestion bankquestion_* tables, plugins qtype_*, qbank_*Réservoir de questions (choix multiple, appariement, cloze…) réutilisables dans les Tests ; organisé par catégories, versionné depuis 4.0, et doté de son propre module (mod_qbank) depuis les versions récentes
FiltresFiltersplugins filter_*Transformations appliquées au texte affiché (lecteurs multimédia auto, LaTeX→MathJax, liens automatiques vers le glossaire…)
Éditeur de texteText editorplugins editor_* (défaut : editor_tiny depuis 4.1)L’éditeur riche (TinyMCE 6+) ; Atto, l’ancien éditeur maison, a été retiré dans les versions 5.x
DépôtsRepositoriesplugins repository_*Sources de fichiers dans le sélecteur (upload, fichiers privés, URL, serveurs de fichiers, Google Drive…) branchées sur la File API
Sélecteur de fichiersFile pickercore_files, draft areasLa modale de choix de fichiers ; les fichiers sont stockés dédupliqués par hash de contenu dans le moodledata, jamais dans la base
CalendrierCalendarcore_calendar, table eventÉvénements de site/cours/groupe/utilisateur + échéances générées par les activités ; export/abonnement iCal
Messagerie personnelleMessagingcore_messageMessages directs et conversations de groupe internes
NotificationsNotificationsAPI message (providers/processors message_*)Chaque événement notable peut notifier par web, courriel, mobile (push) ; préférences fines par utilisateur
AnnoncesAnnouncementsmod_forum (forum « news »)Le forum spécial d’annonces créé automatiquement dans chaque cours
TagsTagscore_tagÉtiquetage transversal (cours, utilisateurs, questions, activités…)
Journaux / logsLogslogstore_* (défaut logstore_standard), events APIChaque action émet un événement (event) consigné ; base des rapports et de l’analytique
RapportsReportsreport_*, core_reportbuilderRapports d’activité, de participation, journaux + Générateur de rapports (report builder) personnalisables depuis 4.0
Sauvegarde / restaurationBackup / restorecore_backup (format .mbz)Export/import de cours complets ou d’activités ; base aussi de la duplication et de l’import entre cours
CorbeilleRecycle bintool_recyclebinRécupération des cours/activités supprimés (temporaire)
ThèmeThemeplugins theme_* (défaut theme_boost)L’habillage : SCSS Bootstrap 5, templates Mustache surchargeables, réglages de marque
Pack de langueLanguage packdossiers lang/, AMOSTraductions ; chaque chaîne a une clef (get_string) et est surchargeable localement
Cron / tâchesCron, scheduled & ad hoc tasks\core\task\*, tables task_scheduled, task_adhocLe « job runner » : synchronisations, envois de mails, nettoyages — vital, à exécuter chaque minute
Web servicesWeb serviceswebservice_*, fonctions externalL’API d’intégration : fonctions exposées (REST…), jetons, services — utilisée par l’app mobile
MobileMoodle Apptool_mobile, support core_courseformat mobileL’app officielle (Ionic/Angular) qui consomme les web services
H5PH5Pcore_h5p, mod_h5pactivityContenus interactifs (vidéos interactives, jeux, quiz) intégrés nativement depuis 3.9
SCORMSCORMmod_scormStandard d’e-learning packagé (héritage industrie) ; Moodle joue les paquets SCORM 1.2/2004
LTILTImod_lti (consommateur), enrol_lti (fournisseur)Le standard d’interconnexion entre plateformes et outils pédagogiques (LTI 1.3 / Advantage)
Inscription en attente / accès invitéGuest accessenrol_guestConsultation sans inscription
Aperçu IAAIsous-système core_ai, plugins aiprovider_*/aiplacement_*Depuis 4.5/5.x : fournisseurs d’IA (OpenAI, Azure, et en 5.2 AWS Bedrock, Gemini…) branchés sur des « placements » (génération de texte/image, résumés, assistance)

18. Le grand tableau de correspondance FR / EN / code

La table de référence à imprimer :

Interface FRAnglais (docs/forums)Dans le code
Site / plateformeSite$SITE, SITEID, cours id 1
Page d’accueilFront page / Site homecours SITEID, $CFG->frontpage*
Catégorie de coursCourse categorycourse_categories, core_course_category, CONTEXT_COURSECAT
CoursCoursetable course, CONTEXT_COURSE, get_course()
SectionSection (topic / week)course_sections, section_info
Format de coursCourse formatplugins format_*, API core_courseformat
RessourceResourceplugins mod_* (archétype ressource)
ActivitéActivityplugins mod_*
(élément de cours)Course module (cm)course_modules, cm_info, cmid, CONTEXT_MODULE
BlocBlockplugins block_*, block_instances
Tableau de bordDashboard/my/, core_my
Mes coursMy courses/my/courses.php
UtilisateurUsertable user, $USER, CONTEXT_USER
AuthentificationAuthenticationplugins auth_*
InscriptionEnrolmentplugins enrol_*, enrol, user_enrolments
RôleRolerole, role_assignments
CapacitéCapabilitycapabilities, has_capability()
ContexteContexttable context, classes context_*
CohorteCohortcohort, cohort_members, enrol_cohort
GroupeGroupgroups, groups_members
GroupementGroupinggroupings, groupings_groups
Carnet de notesGradebookgrade_items, grade_grades, grade_categories, gradelib.php
Élément d’évaluationGrade itemgrade_items
ÉchelleScaletable scale
Barème avancé / rubriqueAdvanced grading / rubricsous-système grading, gradingform_*
AchèvementCompletioncourse_modules_completion, course_completions
Restriction d’accèsRestrict access / availabilitycore_availability, availability_*
BadgeBadgebadge, badge_issued, Open Badges
CompétenceCompetencycore_competency, competency_*
Banque de questionsQuestion bankquestion*, qtype_*, qbank_*, mod_qbank
TestQuizmod_quiz
DevoirAssignmentmod_assign (l’ancêtre mod_assignment est mort depuis longtemps)
SondageChoicemod_choice
Feedback (questionnaire)Feedbackmod_feedback
LeçonLessonmod_lesson
AtelierWorkshopmod_workshop
Zone texte et média (ex-étiquette)Text and media area (ex-label)mod_label
FiltreFilterfilter_*
ThèmeThemetheme_*
DépôtRepositoryrepository_*
Tâche programméeScheduled task\core\task\scheduled_task
JournalLoglogstore_*, events

⚠️ Piège de traduction : la traduction française officielle a évolué au fil des versions (« étiquette » → « zone de texte et média », « paramètres » ↔ « réglages », « salle des profs » pour certains forums historiques…). Quand vous cherchez de l’aide, cherchez toujours avec le terme anglais : les forums anglophones et la documentation développeur sont 20 fois plus fournis, et le terme anglais est stable. Réflexe : interface FR → basculer son propre compte en anglais (préférences > langue) pour retrouver le libellé canonique.


19. Le modèle mental complet pour un développeur web

Assemblons tout. Voici Moodle traduit en concepts de votre monde :

19.1 Le mapping global

Concept MoodleAnalogie monde JS/SaaSNuances
SiteL’instance déployée (single-tenant)Pas de multi-tenancy dans LMS (→ Workplace)
CatégoriesArborescence de dossiers avec ACL héritées (Drive, GitHub orgs)Nœuds de délégation administrative
CoursWorkspace / project (Slack, Notion, Linear)Avec inscriptions, notes, suivi intégrés
SectionsPages/colonnes structurant le workspaceOrdonnées, conditionnables
Modules d’activité (mod_*)Apps installables d’un app store interneLe type de plugin roi ; ressources = apps read-only
Course module (cm)Le nœud d’installation d’une app dans un workspaceLa dualité cmid/instanceid !
BlocsWidgets de dashboardEn déclin
Authentification (auth_*)Providers NextAuth/Auth.jsQui peut entrer dans le site
Inscription (enrol_*)Table memberships + logique de provisioningQui appartient à quel workspace, et via quoi
Rôles + capacités + contextesRBAC hiérarchique à la GitHub (org > team > repo) avec policies granulaires700+ permissions atomiques, overrides par nœud
CohortesGroupes d’annuaire (Azure AD groups) utilisés pour le provisioningNiveau site/catégorie
Groupes / groupementsPartitions et namespaces de partitions dans un workspaceNiveau cours uniquement
Carnet de notesUn moteur de spreadsheet réactif par cours (colonnes = grade items, formules = agrégations)Avec pipeline activité → carnet
Achèvement + restrictionsMachine à états + feature flags conditionnels par nœud de contenuArbre de conditions JSON, conditions = plugins
BadgesCredentials vérifiables (Open Badges ≈ JWT badgé)Standard ouvert
CompétencesUn système de skills/OKR mappé sur le contenuRéférentiels + plans + preuves
Web servicesUne API à la tRPC (fonctions nommées + schémas de paramètres)Pas REST-ressources, pas GraphQL
Événements + logstoreEvent bus + event store (analytics)Tout le produit émet des events
Tâches programmées/adhocCron jobs + job queue (BullMQ)Le cron Moodle est vital
Fichiers (File API)Object storage à la S3 avec déduplication par hash + métadonnées par contexteJamais de fichiers en base ; « draft areas » = uploads temporaires
ThèmesDesign tokens + surcharge de templates (theming shadcn poussé à l’extrême)SCSS Bootstrap 5 + Mustache
Plugins (30+ types)Un écosystème npm interne avec des « types » contraints par interfaceConventions strictes de nommage et de structure

19.2 Les quatre axes qui organisent tout

Pour ne jamais vous perdre, retenez que toute donnée/fonctionnalité Moodle se positionne sur quatre axes :

  1. L’axe structurel : Site → Catégories → Cours → Sections → Course modules. C’est l’arbre du contenu.
  2. L’axe des permissions : l’arbre des contextes (Système → Catégorie → Cours → Module/Bloc), calqué sur le premier, où se résolvent rôles et capacités.
  3. L’axe des personnes : Utilisateurs → (cohortes) → inscriptions → (groupes/groupements). Qui est là, comment il est arrivé, comment il est partitionné.
  4. L’axe du suivi : événements/logs → achèvement → notes → badges/compétences. Ce que les gens ont fait et ce que ça vaut.

Chaque fois que vous découvrirez une nouvelle fonctionnalité, posez ces quatre questions : où vit-elle dans l’arbre ? dans quel contexte s’évaluent ses permissions ? quels utilisateurs voit-elle et via quoi ? quelles traces produit-elle ? Vous aurez compris 80 % de la fonctionnalité avant d’avoir lu sa doc.


20. Synthèse

  • Chaque concept Moodle a trois noms (interface FR, anglais, code) : travaillez toujours avec le terme anglais comme pivot.
  • Le site est mono-tenant et — bizarrerie fondatrice — est lui-même le cours id 1 (SITEID).
  • Catégories (arbre, délégation) > cours (le workspace central) > sections > activités/ressources, qui sont dans le code une seule et même chose : des plugins mod_*, placés dans les cours via les course modules (dualité cmid/instanceid — le piège n° 1).
  • Authentification (auth_*) ≠ inscription (enrol_*) : entrer dans le site ≠ appartenir à un cours.
  • Rôles + capacités + contextes : on attribue un rôle dans un contexte ; les permissions héritent le long de l’arbre. On teste des capacités, jamais des noms de rôles.
  • Cohortes (niveau site, inscription en masse) ≠ groupes (niveau cours, partition interne) ; les groupements sont des ensembles de groupes.
  • Le carnet de notes agrège les notes poussées par les activités ; une note surchargée à la main ne se synchronise plus.
  • Achèvement + restrictions d’accès = parcours conditionnels sans code ; badges et compétences couronnent le suivi.
  • Le modèle mental en quatre axes : structure, permissions, personnes, suivi.

📚 Aller plus loin :

Chapitre suivant : 03 — Visite guidée de l’interface 5.2, où nous mettons des images mentales sur tous ces mots : connexion, tableau de bord refondu, page de cours, mode édition, navigation et administration.