Quiz 2 — Architecture & plugins
⏱️ TL;DR — 20 questions sur le cœur de Moodle et le développement de plugins (Parties 5–6). Réponds de tête, puis déplie.
1. Que contiennent les globals $DB, $USER, $CFG, $PAGE, $OUTPUT ?
Réponse
$DB = accès base (DML), $USER = utilisateur courant, $CFG = config, $PAGE = la page en cours (URL, contexte, requires), $OUTPUT = le renderer (header/footer/HTML).
2. Qu’est-ce que le « frankenstyle » ?
Réponse
La convention de nommage type_nom (ex. mod_forum, local_todolist, block_html) qui préfixe fonctions, tables, chaînes, capabilities pour éviter les collisions. À respecter partout.
3. Rôle de version.php ?
Réponse
La carte d’identité du plugin : component, version (YYYYMMDDXX, à bumper à chaque changement de schéma), requires (Moodle min), maturity. L’équivalent du package.json.
4. Pourquoi ne jamais écrire de SQL brut ?
Réponse
On passe par le DML ($DB->get_records, insert_record…) : portable entre SGBD et paramétré (pas d’injection). Pour du SQL, get_records_sql avec placeholders, jamais de concaténation.
5. À quoi sert db/install.xml (XMLDB) ?
Réponse
Il définit les tables du plugin de façon portable (MySQL/PostgreSQL), généré via l’éditeur XMLDB. Créé/supprimé automatiquement à l’install/désinstall.
6. Que déclare db/access.php ?
Réponse
Les capabilities du plugin (droits atomiques type/nom:action), avec leur contextlevel, captype, archetypes et flags de risque. Le socle de la sécurité par permission.
7. Cite les 3 étapes du pattern sécurisé d’une page.
Réponse
require_login() (session + accès), fixer le contexte (context_*::instance) + $PAGE->set_*, puis require_capability($cap, $context). Ensuite $OUTPUT->header()/footer().
8. À quoi servent required_param et les PARAM_* ?
Réponse
À lire et assainir les entrées (required_param('id', PARAM_INT)). On ne touche jamais $_GET/$_POST bruts. Le type PARAM est la première défense.
9. À quoi sert le sesskey ?
Réponse
C’est le jeton anti-CSRF : require_sesskey() sur toute action qui modifie un état via un lien. La Form API le gère automatiquement.
10. Quand choisir local_ plutôt que block_ ou mod_ ?
Réponse
local = fonctionnalité transverse (pas liée à un cours). block = affichage contextuel dans une colonne. mod = activité de cours (le plus riche). Choisir le bon type évite de tout refaire.
11. Actions/hooks : à quoi servent-ils ?
Réponse
À étendre le cœur sans le modifier : le cœur déclenche des hooks/callbacks auxquels ton plugin s’accroche. C’est la philosophie « tout est extensible » (comme les actions/filtres WordPress).
12. Pourquoi utiliser la Form API (moodleform) ?
Réponse
Elle génère des formulaires sécurisés : sesskey/CSRF automatique, validation, types PARAM_*. On ne bricole jamais un <form> à la main.
13. Comment séparer logique et affichage (Output API) ?
Réponse
Un renderable/templatable porte les données (export_for_template), un renderer appelle un template Mustache (auto-échappé, thémable). HTML hors du contrôleur = testable et surchargeable.
14. Que fait db/upgrade.php ?
Réponse
Il migre la base entre versions sans perte de données (if ($oldversion < NNN) + upgrade_plugin_savepoint). La migration Prisma de Moodle. Déclenché après un bump de version.
15. Où doivent vivre les chaînes de texte ?
Réponse
Dans lang/en/component.php, appelées via get_string('cle', 'component'). Aucune chaîne en dur. pluginname est obligatoire. Base de l’i18n.
16. Comment lire/écrire un réglage de plugin ?
Réponse
get_config('component', 'name') / set_config(...), alimentés par settings.php (Settings API). Les réglages vivent dans la table de config, pas dans une table à toi.
17. Pourquoi « purger les caches » est-il un réflexe de dev ?
Réponse
Moodle cache définitions de plugins, langue, thèmes. Après tout changement de version.php/db//lang/template, il faut purger sinon tu débogues une version périmée.
18. Qu’est-ce que moodledata ?
Réponse
Le dossier de stockage de fichiers (uploads, caches, sessions), hors de la racine web (sécurité). Moodle = base de données + moodledata + code. Sauvegarder = les trois.
19. Pourquoi un plugin doit-il un « privacy provider » ?
Réponse
Le Privacy API (RGPD) : déclarer les données perso stockées, les exporter et les supprimer sur demande. Sans lui, le plugin est signalé non conforme (refus de publication).
20. Pourquoi ne jamais « hacker le cœur » ?
Réponse
Chaque mise à jour de Moodle écraserait tes modifications, et c’est un risque de sécurité. Tout est faisable par plugin/hook/surcharge ; sinon, on propose un patch au cœur.
Quiz suivant : Quiz 3 — Frontend & thèmes.