Quiz 3 — Frontend & thèmes
⏱️ TL;DR — 20 questions sur le JavaScript, les templates, l’Output API et les thèmes (Parties 7–8). Réponds de tête, puis déplie.
1. Qu’est-ce qu’un module AMD dans Moodle ?
Réponse
Un module JavaScript ES6 (dans amd/src/, transpilé vers amd/build/) exportant des fonctions (souvent init). Le système JS modulaire natif de Moodle — pas de <script> en dur.
2. Comment charge-t-on un module AMD depuis PHP ?
Réponse
$PAGE->requires->js_call_amd('component/module', 'init', $args) — charge le module et appelle sa fonction, avec des arguments passés en JSON. Le pont PHP → JS.
3. Pourquoi les templates Mustache sont-ils « logique-less » ?
Réponse
Ils ne contiennent que du balisage + des placeholders ({{var}} auto-échappés, {{#tasks}}…{{/tasks}}). La logique reste en PHP (export_for_template). Sécurité XSS gratuite + séparation nette.
4. Peut-on rendre un template Mustache côté JavaScript ?
Réponse
Oui, avec core/templates (renderForPromise) : le même template sert côté PHP et côté client → UI dynamique sans dupliquer le markup. Proche du rendu React.
5. À quoi sert core/str ?
Réponse
À charger les chaînes de langue côté JS (asynchrone) : pas de texte en dur, i18n respectée jusque dans le JavaScript. L’équivalent JS de get_string().
6. À quoi sert la « pix API » ?
Réponse
À afficher des icônes thémables et accessibles ($OUTPUT->pix_icon('t/check', $alt)). Tes icônes vont dans pix/. Évite les <img> en dur.
7. Que sont un « renderable » et un « templatable » ?
Réponse
Un renderable est un objet à afficher ; templatable ajoute export_for_template() qui produit les données simples que Mustache consomme. L’Output API sépare données et vue.
8. Quel est le thème par défaut, et que fait un thème enfant ?
Réponse
Le thème par défaut est Boost. Un thème peut hériter d’un parent (comme Boost) et ne surcharger que ce qu’il change (SCSS, templates, réglages).
9. Comment personnaliser le style d’un thème sans tout réécrire ?
Réponse
Via les réglages du thème (couleur, logo) et un champ SCSS brut (Boost), ou en héritant de Boost et en surchargeant des variables/templates. Purger le cache thème ensuite.
10. Que doivent implémenter get_content() et applicable_formats() d’un bloc ?
Réponse
get_content() renvoie l’objet {text, footer} du bloc (avec cache interne) ; applicable_formats() déclare où le bloc est ajoutable (course-view, my, site…).
11. Comment configurer un bloc par instance ?
Réponse
Via edit_form.php (des champs config_*), accessibles ensuite par $this->config->xxx. Chaque bloc posé a sa config.
12. À quoi servent addinstance et myaddinstance ?
Réponse
Ce sont les capabilities de bloc : addinstance = ajouter dans un cours, myaddinstance = ajouter au tableau de bord. Elles décident qui peut poser le bloc.
13. À quoi sert Grunt dans le dev frontend Moodle ?
Réponse
À builder l’AMD (amd/src/ → amd/build/, minifié) et à linter le JS (ESLint). En dev, $CFG->cachejs = false sert la source directement.
14. Comment passer des données PHP au JavaScript proprement ?
Réponse
En 3e argument de js_call_amd(..., [$data]) (sérialisé JSON), reçu par la fonction JS. Pas de variable globale ni de <script> inline.
15. Pourquoi l’accessibilité (WCAG) compte-t-elle en éducation ?
Réponse
Obligation légale fréquente + inclusion : navigation clavier, ARIA, contraste, alt. Moodle vise WCAG ; tes blocs/thèmes doivent suivre. Fait partie de la qualité.
16. Un thème peut-il varier selon le contexte ?
Réponse
Oui : le thème peut différer par appareil, catégorie ou cours selon la config du site. Le sélecteur de thème gère ces cas.
17. Comment un thème surcharge-t-il un template d’un plugin ?
Réponse
En fournissant un template Mustache de même nom ; $PAGE->get_renderer() et le moteur de templates cherchent d’abord côté thème. C’est ce qui rend l’affichage thémable.
18. React est-il natif dans Moodle ?
Réponse
Non : Moodle a son propre système (Mustache + AMD + core JS). Mais certains thèmes/plugins intègrent React. Ta compétence React s’applique surtout côté headless/LTI (Parties 9–10).
19. Où placer les icônes SVG d’un plugin ?
Réponse
Dans le dossier pix/ du plugin (ex. pix/icon.svg), servies via la pix API. Cohérentes avec le thème et accessibles.
20. Pourquoi mon JS ne change-t-il pas malgré ma modification ?
Réponse
Le cache JS est actif. En dev, mets $CFG->cachejs = false (+ themedesignermode = true) ; en prod, il faut rebuilder (Grunt) et purger. Confusion classique.
Quiz suivant : Quiz 4 — Web services & LTI.