[Astuce] [Moodle 2.X-3.X] Affichage d'une pseudo fenêtre d'alerte sans modification de code

[Astuce] [Moodle 2.X-3.X] Affichage d'une pseudo fenêtre d'alerte sans modification de code

par Patrick Lemaire,
Nombre de réponses : 12
Avatar Développeurs de plugins Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs

Bonjour à toutes et à tous,

L'astuce du jour vous propose de diffuser à vos usagers une information sous la forme d'une pseudo fenêtre dont le contenu sera codée en HTML (incluant donc tout type de média hébergé publiquement), comme l'annonce d'une opération de maintenance, d'une modification majeure..., depuis n'importe quelle page de votre plateforme Moodle, a priori quelque soit le thème graphique employé et depuis la version 2.X de Moodle et supérieure, sans modification du code PHP.

Cliquer pour agrandir...

Pourquoi faire ?

Ne vous est-il pas déjà arrivé de vouloir informer l'ensemble des usagers de vos plateformes d'un message capital ?
Problème : tous ne passent pas forcément par la page d'accueil (pas obligatoirement activée d'ailleurs), ou encore votre thème préféré n'inclut pas de zone suffisamment "incontournable" pour abriter ce genre de message, personne ne prend plus connaissance des alertes du tableau de bord,...
Et oui ! Rappelez-vous la fois où, suite à une opération de maintenance, dont l'information avait pourtant été diffusée à grands cris, un examen avait été violemment crashé en plein vol après l'arrêt programmé du serveur... L'écho des plaintes résonnent encore parfois dans vos oreilles par les nuits de pleine lune !
Bref !
No panic !

La solution que je vous propose ici recourt aux contenus "HTML additionnel", disponibles, sauf erreur, depuis la version 2.0 de Moodle dans "Administration du site > Présentation > HTML additionnel". A l'origine, ces paramètres avaient été prévus pour accueillir les codes Analytics (cf MDL-25597) mais ils peuvent faire bien plus que cela. La stratégie est de placer du code javascript dans l'entête, puis de positionner le message d'information à l'aide de codes HTML dans le corps de la page et de déclencher automatiquement le "surgissement" de ce message à l'ouverture de la page. Comme on est élégant, et qu'on ne veut surtout pas que ce message revienne à chaque fois qu'on sollicite une page, il est prévu 2 mécanismes :
  • le premier fait que si on recharge cette page, le message disparait pour 24h...
  • le second fait que si on coche une case spécifique au bas de la fenêtre d'annonce, on choisit volontairement de ne plus voir se message.

Comment fait-on ?

Dans HEAD (additionalhtmlhead), on insère le code suivant :
<SCRIPT LANGUAGE="JavaScript">

// Nombre de jours pendant lesquels le message ne doit plus s'afficher
// si on coche la case
// (0 indiquera un durée infinie)
var expDays = 10;

function GetCookie (name) {
   var nameEQ = name + "=";
   var ca = document.cookie.split(';');
   for(var i=0;i < ca.length;i++) {
   var c = ca[i];
   while (c.charAt(0)==' ') c = c.substring(1,c.length);
   if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
   }
   return null;
 }

function SetCookie (name, value, days) {
   if (days) {
   var date = new Date();
   date.setTime(date.getTime()+(days*24*60*60*1000));
   var expires = "; expires="+date.toGMTString();
   }
   else var expires = "";
   document.cookie = name+"="+value+expires+"; path=/";
}

function DeleteCookie (name) {
   SetCookie(name,"",-1);
}

function checkCount() {
   var count = GetCookie('nbInfoAff');
   var infoChecked = GetCookie('infoChecked');
   if (count == null) {
   count=1;
   SetCookie('nbInfoAff', count, 1);
   if (infoChecked!='OK') {
   document.getElementById('message').style.display = 'block';
   }
   }
}

function checkCGV() {
   document.getElementById('message').style.display = 'none';
   SetCookie('infoChecked', 'OK', expDays);
   }

window.onload=checkCount
</script>
On peut ajouter, toujours dans HEAD, un peu de styles CSS pour faire plus beau (à adapter selon vos goûts) mais surtout pour imposer le placement de la pseudo-fenêtre en plein au milieu de l'écran :

<style type="text/css">
 #message {
 color:#09c;
 background:rgba(0,0,0,.9);
 padding:15px;
 border-radius:5px;
 box-shadow: 5px 5px 12px #555;
opacity:0.9;
 margin-top: -300px;
 margin-left: -300px;
width: 600px;
 top: 50%;
 left: 50%;
 position: fixed;
 display:none;
 z-index: 100;
 font-family:Arial, Helvetica, sans-serif;
 text-align:justify;
}
</style>

Puis dans la partie "Lorsque BODY est ouvert ( additionalhtmltopofbody)" :

<div id="message">
Mon message hyper-important !!! Tu pourras pas dire qu'on ne t'avait pas prévenu !
  <br />
<input type="checkbox" id="cgv" name="cgv" onclick="checkCGV();"/>J'ai pris connaissance de ce message. Je ne souhaite plus son affichage.
</div>

Plusieurs remarques :

  • Ce bricolage s'appuie sur un cookie stocké localement ! Il est donc propre à un navigateur et non au profil de l'usager. Si celui-ci coche la fameuse case, au boulot par exemple, mais utilise ensuite un autre navigateur, chez lui, le message revient.
  • Il est fortement conseillé d'indiquer une durée dans expDays. En effet, cette variable permet au navigateur de détruire la valeur qui mémorise la "case cochée" stockée dans le cookie. Si cette variable n'est jamais supprimée, alors, si on veut plus tard ré-utiliser ce mécanisme, le message n'apparait plus.
  • Le code HTML du message supporte tous les médias (images, vidéos,...) possibles et imaginables, à condition d'être accessibles à un usager sans authentification. Il est donc possible d'enrichir vos messages avec de jolis effets.
Cette astuce est partagée sans garantie, à vos risques et périls ! Je vous recommande vivement de vous faire la main sur une machine de test. Si vous avez des suggestions d'amélioration, partagez-les ! clin d’œil


A bientôt,
Patrick

Moyenne des évaluations Utile (6)
En réponse à Patrick Lemaire

Re: [Astuce] [Moodle 2.X-3.X] Affichage d'une pseudo fenêtre d'alerte sans modification de code

par Daniel Méthot,
Avatar Moodleurs particulièrement utiles

Bonjour,

Merci Patrick !

Voilà une astuce tellement bien documentée que malgré mon aversion pour les codes (j'ai du en faire une indigestion dans une vie antérieure...) je vais certainement tester cela.

Car à vrai dire c'est presque du copier/coller.

Et de cela je suis encore capable malgré mon âge presque doublement canonique grand sourire

Daniel

En réponse à Daniel Méthot

Re: [Astuce] [Moodle 2.X-3.X] Affichage d'une pseudo fenêtre d'alerte sans modification de code

par Daniel Méthot,
Avatar Moodleurs particulièrement utiles

Bonjour Patrick,

Sur mon site de test la box ne s'est affichée qu'une seule fois. Navigateurs : Chromium et Firefox.

Et pourtant je n'ai pas coché la demande de ne plus afficher.

Daniel

En réponse à Daniel Méthot

Re: [Astuce] [Moodle 2.X-3.X] Affichage d'une pseudo fenêtre d'alerte sans modification de code

par Patrick Lemaire,
Avatar Développeurs de plugins Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs

Bonjour Daniel,

C'est là où ce script se veut non invasif. En effet, le message disparait pour ne pas devenir trop intrusif si la page est rechargée mais il reviendra le lendemain.

Autre point pas évident à saisir... Le paramètre expDays gère le nombre de jours pendant lesquels la "campagne" d'information est en cours. Par exemple, tu veux qu'une info soit diffusée pendant 15 jours mais que si un individu coche la case, il ne la revoit pas pendant ce laps de temps. Imaginons que j'ai pris connaissance du message, je coche la case, je ne le verrai plus jusqu'au terme de la campagne. C'est alors qu'on doit retirer le code dans les contenus "HTML additionnel" car sinon, le message fait sa réapparition.
Je n'ai pas trouvé d'autre solution moins commode que celle-ci pour que le code fonctionne plusieurs fois. Sinon, il est aussi possible de changer le nom de la variable qui sert à vérifier que le message a été lu au moment du lancement d'une nouvelle campagne. Mais c'est moche pensif

Je ne sais pas si c'est plus clair ainsi...

A bientôt,
Patrick

En réponse à Patrick Lemaire

Re: [Astuce] [Moodle 2.X-3.X] Affichage d'une pseudo fenêtre d'alerte sans modification de code

par Séverin Terrier,
Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs

Bonjour Patrick,

Merci pour cette astuce utile, et ce pas à pas détaillé sourire

Ainsi que pour les précisions complémentaires clin d’œil

Séverin

En réponse à Séverin Terrier

Re: [Astuce] [Moodle 2.X-3.X] Affichage d'une pseudo fenêtre d'alerte sans modification de code

par Daniel Méthot,
Avatar Moodleurs particulièrement utiles

Bonjour Patrick,

J'ai déjà eu le loisir d'utiliser deux fois ton dispositif très pratique pour afficher occasionnellement un message important.

Je suppose que quand on veut ne plus rien afficher il est indispensable d'effacer tout le code contenant le message ?

Puis de le rétablir plus tard en cas de besoin?

Ma question: Serait-il possible de modifier juste un paramètre de ce code pour que selon le cas le dispositif soit actif ou inactif ?

Afin d'éviter les copier/coller d'une sauvegarde du code ...

Daniel

En réponse à Patrick Lemaire

Re: [Astuce] [Moodle 2.X-3.X] Affichage d'une pseudo fenêtre d'alerte sans modification de code

par Emilie Lenel,

Merci Patrick pour ton astuce !!

Sur notre plateforme, on exploite les "alertes" du thème essential pour informer des opérations de maintenance.  Mais on avait du modifier le layout de la page MY / page personnelle pour que ce soit vu par tous les utilisateurs (mais certains pointent directement sur leur cours sans passer par le my..).  Il faudrait que l'on voit pour pousser l'alerte sur les cours en modifiant le layout ou alors envisager ta fenêtre d'alerte (on va tester!).

A+

PS: tu as eu du monde à ta distribution de croquettes ? :D

En réponse à Emilie Lenel

Re: [Astuce] [Moodle 2.X-3.X] Affichage d'une pseudo fenêtre d'alerte sans modification de code

par Daniel Méthot,
Avatar Moodleurs particulièrement utiles

Bonjour,

Après test, le message ne s'affiche qu'une fois par jour.

Il semble que ce soit normal. Pourquoi pas en effet?

Ne pourrait-on pas le rendre permanent (et éventuellement affiché sur tout le site*) jusqu'à ce qu'on clique sur la case à cocher ?

Par ailleurs si on veut ajouter une image ou/et changer les couleurs, je suppose qu'on doit agir ici:

<style type="text/css">
#message {
color:#09c;
background:rgba(0,0,0,.9);
padding:15px;
border-radius:5px;
box-shadow: 5px 5px 12px #555;
opacity:0.9;
margin-top: -300px;
margin-left: -300px;
width: 600px;
top: 50%;
left: 50%;
position: fixed;
display:none;
z-index: 100;
font-family:Arial, Helvetica, sans-serif;
text-align:justify;
}
</style>

Mais pourquoi les couleurs sont-elles proposées soit en rgba soit en #...?

Et que signifie ce .9 comme quatrième variable?

J'en pose des questions de béotien n'est-ce pas ?

Daniel

* Car sur certains sites on est immédiatement dirigé vers le "tableau de bord" (anciennement "ma page") ou vers ses cours. Mais c'est vrai aussi qu'on passe en général par la page d'accueil avant connexion. Quoique...

En réponse à Daniel Méthot

Re: [Astuce] [Moodle 2.X-3.X] Affichage d'une pseudo fenêtre d'alerte sans modification de code

par stephane ngov,

Bonjour Daniel,


le rgba c'est pour la transparence

 background:rgba(Rouge,Vert,Bleu,.1);  // opaque

 background:rgba(Rouge,Vert,Bleu,0);  // transparent

En réponse à Daniel Méthot

Re: [Astuce] [Moodle 2.X-3.X] Affichage d'une pseudo fenêtre d'alerte sans modification de code

par Patrick Lemaire,
Avatar Développeurs de plugins Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs

Bonjour Daniel,

Pour moi, l'info ne doit pas devenir obligatoire... mais c'est une question de position. Dans ce cas, il suffit de virer la partie qui cherche le compteur d'affichage alors inutile.

Donc à la place de

   if (count == null) {
   count=1;
   SetCookie('nbInfoAff', count, 1);
   if (infoChecked!='OK') {
   document.getElementById('message').style.display = 'block';
   }
   }
Il faudrait

if (infoChecked!='OK') {
document.getElementById('message').style.display = 'block';
}
Et nettoyer les éléments devenus superflus... Mais à tester !!!

A bientôt,
Patrick

En réponse à Patrick Lemaire

Re: [Astuce] [Moodle 2.X-3.X] Affichage d'une pseudo fenêtre d'alerte sans modification de code

par Daniel Méthot,
Avatar Moodleurs particulièrement utiles

Merci Patrick,

Ça marche.

Je préfère que cette fenêtre soit permanente jusqu'à ce que la personne clique pour la supprimer définitivement.

Ce dispositif est plus efficace que les alertes incluses dans le thème Essential que j'utilise.

  1. C'est plus visible.
  2. On peut le supprimer définitivement.
  3. La période d'affichage peut être choisie sans nouvelle intervention.

Je ne manquerai pas d'utiliser ta solution très utile à l'occasion.

"© Patrick Lemaire" à placer sur la fenêtre peut-être ?

Voici ce que cela donne...

alerte

Daniel

En réponse à Daniel Méthot

Re: [Astuce] [Moodle 2.X-3.X] Affichage d'une pseudo fenêtre d'alerte sans modification de code

par Patrick Lemaire,
Avatar Développeurs de plugins Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs

De rien Daniel. Un plaisir grand sourire

Nous l'utilisons chez nous pour prévenir d'événements très importants, voire incontournables, avec parcimonie donc. Mais je ne souhaitais pas rendre la validation obligatoire. C'est selon...

Autre argument, et il me semble de taille, cette alerte est affichée même si l'usager a gardé une adresse directe en favoris. Ainsi, sans repasser par la case "tableau de bord" ou "page d'accueil", l'info lui parvient. ET SANS MODIFIER LE CODE !!!

Content que cette astuce puisse être utile.

A bientôt,
Patrick

En réponse à Patrick Lemaire

Re: [Astuce] [Moodle 2.X-3.X] Affichage d'une pseudo fenêtre d'alerte sans modification de code

par Daniel Méthot,
Avatar Moodleurs particulièrement utiles

Bonjour Patrick,

"cette alerte est affichée même si l'usager a gardé une adresse directe en favoris."

Ça c'est bien aussi. Je n'avait pas "fait gaffe.." comme on dit chez moi.

Je vais bientôt utiliser ton invention...

Daniel