Skip to Content
MoodlePartie 16 — Quiz (auto-évaluation)Quiz 2 — Architecture & plugins

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.