Objectif
Ayant activé la demande de confirmation de la politique de confidentialité, le système ouvre d'office la page de mise à jour du profil membre, et il est impossible d'en sortir, sans accepter les conditions.
Ce système me parait un peu brutal, surtout si l'internaute ne comprend pas ce que le système attend de lui.
J'ai donc voulu mettre un message plus en évidence, que ce que prévoit Joomla nativement, pour faciliter la démarche aux internautes.
Voici donc un système utilisant l'extension Engagebox qui permet d'afficher une popup dans un coin, popup d'aide qui peut rester affichée pendant que l'internaute met à jour son profil.
Je ne m'attarderai pas sur la configuration de la popup, mais sur le script qui permet d’éviter que la popup ne continue à s'afficher sur la page de mise à jour du profil, si le membre a déjà accepté les conditions.
Tutoriel réalisé avec les versions suivantes :
- Joomla : 3.9
- Engagebox : 4.0.3 et +
Nous voici donc dans la fenêtre de paramétrage de la popup que l'on aura préalablement crée dans le composant EngageBox.
Remarque : cette extension permet de créer plusieurs popups avec des déclencheurs, des actions, des effets et des présentations différentes, mais à ce jour elle n'existe qu'en version payante.
Message
Le contenu sera un texte clair et concis, ou un article appelé par le plugin adéquat.
Page déclenchant la popup
L'élément de menu sera celui envoyant vers le profil membre
Pour être tranquille on rajoutera aussi l'url de base d’édition native du profil dans Joomla qui est :
- /index.php?option=com_users&view=profile&layout=edit
La méthode de comparaison étant "n'importe lequel" bien sûr.
Script php
Maintenant, il faut encore trouver un système afin que la popup ne s'affiche que si le membre doit accepter les conditions.
S'il les a déjà acceptées, on ne va pas lui afficher un message qui ne le concerne plus à chaque fois qu'il rentrera dans la mise à jour de son profil.
L'objet de ces lignes de code est le suivant :
- chercher dans la base de données si l'utilisateur courant a déjà donné son approbation (il est rapellé que dans le composant natif com_privacy on peut demander le renouvellement périodique de la dite approbation).
- Si l'approbation a déjà été faite on efface le contenu prévu de la boite popup engagebox.
- On rajoute un javascript qui sur la base de l'identifiant de la popup, la désactive définitivement, si elle n'a aucun contenu.
Voici donc le code à placer dans l'onglet PHP Scripts / champ "On Before Render"
Engage box javascript API 2 (engagebox >= 4.0)
$query = $db->getQuery(true);
$query->select('COUNT(*)')
->from('#__privacy_consents')
->where('user_id = ' . (int) $user->id)
->where('subject = ' . $db->quote('PLG_SYSTEM_PRIVACYCONSENT_SUBJECT'))
->where('state = 1');
$db->setQuery($query);
if((int) $db->loadResult() > 0){
$box->customhtml='';
$ebpop_script = "
<script>
<!--privacy consent / EngageBox Javascript API 2 Action Start-- >
!(function() {
// Get box instance
if (!EngageBox) {
return;
}
EngageBox.onReady(function() {
const box = EngageBox.getInstance(".$box->id.");
if (!box) {
return;
}
box.on('beforeOpen', function() {
const content = box.el.querySelector('.eb-content').innerText.trim();
if (content.length == 0) {
box.destroy();
}
});
});
})();
<!--privacy consent / EngageBox Javascript API 2 Action End-- >
</script> ";
$box->params->set('customcode',$ebpop_script);
}
Engage box javascript API 1 (engagebox < 4.0)
$query = $db->getQuery(true);
$query
->select('COUNT(*)')
->from('#__privacy_consents')
->where('user_id = ' . (int) $user->id)
->where('subject = ' . $db->quote('PLG_SYSTEM_PRIVACYCONSENT_SUBJECT'))
->where('state = 1');
$db->setQuery($query);
if((int) $db->loadResult() > 0){
$box->customhtml='';
$ebpop_script = "<script type="text/javascript">
document.addEventListener('DOMContentLoaded', function() {
var popup = document.querySelector('#rstbox_' + ".$box->id.");
var content = popup.querySelector('.rstbox-content').innerHTML.trim();
if (content.length == 0) {
popup.parentNode.removeChild(popup);
}
});
</script>";
$box->params->set('customcode',$ebpop_script); }
Vous pouvez aussi télécharger le fichier suivant :
- EngageBox à partir de la v.4 (JS API2) :
- EngageBox jusqu'à la v.3 (JS API1) :
Et le placer dans un dossier adéquat de votre site, par exemple /medias/perso/
Dans ce cas, au lieu du code précédent, il suffit de faire un simple appel au ficher dans l'onglet PHP Scripts / champ "On Before Render".
include JPATH_SITE . '/medias/perso/ebpop-privacyconsent.php';