Hello:)
A la suite de la demande de libre service de Kiki85, voici un petit tutoriel permettant de personnaliser la liste des membres pour afficher si un membre est connecté ou non.
A partir d'un même modèle de base, voici différentes manière de styliser. Ce sont des exemples pour montrer qu'on peut faire "un peu ce qu'on veut" :)
Le modèle de base fait par Kiki85 pour son forum "Once Upon A Dream" :
Exemple avec une petite ombre en dessous des membres connectés
Exemple avec un fond différent :
Exemple avec une image rajoutée :
Affichage de base de la liste des membres sur phpbb2 :
Quand un membre est en ligne, on va simplement rajouter un petit texte :
Captain Obvious : afficher si un membre est connecté ou non sur la liste des membres.
Ce n'est pas possible via le template memberlist_body, il n'y a pas de variable pour ça, on doit donc trouver une autre méthode.
1 - Récupérer la liste des membres connectés
2 - Pour chacun des membres de cette liste, on modifie notre liste des membres pour montrer que le membre est connecté.
Chaque membre connecté sur la page /viewonline a un lien vers son son profil. Même chose sur la page des membres, il y a sur chaque ligne de membre connecté un lien vers son profil. Là si vous êtes intelligent vous dites... BINGO ces liens sont les mêmes. (oui, je tutoie, je vouvoie, je ne fais pas attention )
On va donc récupérer tous les liens de profil sur la page /viewonline, qu'on va mettre dans une boite magique.
Et ensuite, sur notre liste des membres, pour chaque personne de la boite magique, on va rajouter une classe spéciale indiquant que la personne est connectée !
PA > Affichage > Templates > memberlist_body
Pour pouvoir sélectionner plus facilement les éléments en javascript, on va rajouter des classes à certains éléments.
Le lien du pseudo est ici :
On va ajouter une classe "js-member-link"
Ensuite, on va rajouter une classe sur le block qui entoure l'affichage d'une ligne entière :
Dans la page liste des membres, pour afficher chaque membre, forumactif répète le code qui se trouve entre :
Et ceci :
Dans le template de base, il y a une balise tr (affichage en tableau).
On va donc rajouter la classe sur cette balise tr
Enfin dernier étape, nous on veut afficher un petit texte "En ligne" sous le pseudo. On pourrait le faire seulement en CSS, mais allons y pour écrire directement dans le HTML !
Juste après le pseudo (que l'on vient de modifier), on va ajouter notre petit texte !
Notre ligne :
Et on va rajouter notre texte en dessous :
Je vous invite à lire ces 2 tutoriels de Manumanu pour en savoir plus sur les sélecteurs CSS que nous allons utiliser : Principe du CSS : Les sélecteurs (Partie 1 : CSS2) et Principes du CSS - Les sélecteurs (Partie 2 : CSS3).
Je n'ai pas l'intention de faire un doublon du tuto sur les sélecteurs, donc si vous êtes intéressés, prenez le temps de le lire. (◕‿◕✿)
Voici les sélecteurs que l'on va utiliser (ils sont dans les tutoriels de Manumanu, pour vous rafraichir la mémoire, je vous met un exemple pour chaque) :
Pour notre petit texte en ligne on va faire un petit style très simple (plus simple tu meurs) :
Le problème c'est qu'actuellement notre texte "En ligne" s'affiche pour tous les membre . On va donc par défaut cacher le texte avec un display: none;
Et ensuite, quand un membre est connecté, nous rajouterons en javascript une classe nommée "is-online" sur le block qui entoure notre affichage du membre.
Dans le CSS on peut donc prévoir le coup :
PA > Affichage > Templates > viewonline_body
Maintenant, on va rajouter une classe en CSS sur le lien vers les profils des membres en ligne. Comme ça, on pourra les récupérer facilement en javascript ensuite !
On repère la ligne qui permet d'afficher le pseudo et le lien vers le profil :
On ajoute une classe (js-reg-user) sur le lien !
Plutôt que de construire le code petit à petit, on va le regarder ensemble pour comprendre ce qu'il fait !
Le code total :
En plus des commentaires, voici quelques éléments mis en avant :
On commence par vérifier sur quelle page on est, pour n'exécuter le code que si on est au bon endroit
Ainsi par exemple :
Ensuite, on va sur la page /viewonline et on va stocker tout son html dans une variable "data"
On va donc sélectionner tous les utilisateurs connectés :)
Each signifie "pour chaque", ce qui nous amène à ce passage là :
Il signifie "pour tous les liens qui ont la classe js-reg-user dans data (donc dans notre page /viewonline), fait CECI".
Les liens "js-reg-user" sont les personnes connectées donc, puisque qu'ils sont sur la page /viewonline. Pour chaque personne connectée, je vais donc récupérer l'adresse du lien.
Je vais donc écrire ceci :
Note : ici on affiche seulement si le membre est connecté, mais on pourrait imaginer de mettre une zone pour afficher dans quelle section du forum il se trouve, en reprenant toujours les données de la même page.
A la base, ce code était destiné à arriver dans un libre service, merci d'indiquer quelque part des crédits pour Never Utopia s'il vous plait
A la suite de la demande de libre service de Kiki85, voici un petit tutoriel permettant de personnaliser la liste des membres pour afficher si un membre est connecté ou non.
Exemples
A partir d'un même modèle de base, voici différentes manière de styliser. Ce sont des exemples pour montrer qu'on peut faire "un peu ce qu'on veut" :)
Le modèle de base fait par Kiki85 pour son forum "Once Upon A Dream" :
Exemple avec une petite ombre en dessous des membres connectés
Exemple avec un fond différent :
Exemple avec une image rajoutée :
Ce qu'on va faire
Affichage de base de la liste des membres sur phpbb2 :
Quand un membre est en ligne, on va simplement rajouter un petit texte :
Ce que je cherche à faire
Captain Obvious : afficher si un membre est connecté ou non sur la liste des membres.
Ce n'est pas possible via le template memberlist_body, il n'y a pas de variable pour ça, on doit donc trouver une autre méthode.
1 - Récupérer la liste des membres connectés
2 - Pour chacun des membres de cette liste, on modifie notre liste des membres pour montrer que le membre est connecté.
On va récupérer la page "Voir les membres en lignes", par exemple sur Never Utopia l'url est celle ci → https://www.never-utopia.com/viewonlineOK donc... Comment je récupère la liste des membres connectés ?
Pourquoi aller sur la page /viewonline et non pas l'index ?
En effet, il y aussi la liste des connectés sur l'index, mais cette page à quelques inconvénients :
- il y a beaucoup plus d'éléments sur cette page, elle met quelques millisecondes de plus à se charger.
- les gens modifient souvent le template index-body, et moins souvent le template pour viewonline :)
Note aux "plus avancés" : Après, si pour une raison x ou y, vous chargez déjà la page d'index, vous avez tout intérêt à réutiliser cette requête :)
En effet, il y aussi la liste des connectés sur l'index, mais cette page à quelques inconvénients :
- il y a beaucoup plus d'éléments sur cette page, elle met quelques millisecondes de plus à se charger.
- les gens modifient souvent le template index-body, et moins souvent le template pour viewonline :)
Note aux "plus avancés" : Après, si pour une raison x ou y, vous chargez déjà la page d'index, vous avez tout intérêt à réutiliser cette requête :)
Comment je fais pour récupérer cette liste des membres connectés dans la page /viewonline ?
Chaque membre connecté sur la page /viewonline a un lien vers son son profil. Même chose sur la page des membres, il y a sur chaque ligne de membre connecté un lien vers son profil. Là si vous êtes intelligent vous dites... BINGO ces liens sont les mêmes. (oui, je tutoie, je vouvoie, je ne fais pas attention )
On va donc récupérer tous les liens de profil sur la page /viewonline, qu'on va mettre dans une boite magique.
Et ensuite, sur notre liste des membres, pour chaque personne de la boite magique, on va rajouter une classe spéciale indiquant que la personne est connectée !
Modifications du template memberlist_body
PA > Affichage > Templates > memberlist_body
Pour pouvoir sélectionner plus facilement les éléments en javascript, on va rajouter des classes à certains éléments.
Chaque classe est préfixée par "js-", pour vous indiquer que cette classe est ensuite utilisée par du javascript, c'est juste une petite "astuce d'organisation".
Le lien du pseudo est ici :
- Code:
<a class="gen" href="{memberrow.U_VIEWPROFILE}">{memberrow.USERNAME}</a>
On va ajouter une classe "js-member-link"
- Code:
<a class="gen js-member-link" href="{memberrow.U_VIEWPROFILE}">{memberrow.USERNAME}</a>
Ensuite, on va rajouter une classe sur le block qui entoure l'affichage d'une ligne entière :
Dans la page liste des membres, pour afficher chaque membre, forumactif répète le code qui se trouve entre :
- Code:
<!-- BEGIN memberrow -->
Et ceci :
- Code:
<!-- END memberrow -->
Dans le template de base, il y a une balise tr (affichage en tableau).
- Code:
<!-- BEGIN memberrow -->
<tr>
On va donc rajouter la classe sur cette balise tr
- Code:
<!-- BEGIN memberrow -->
<tr class="js-member-block">
Enfin dernier étape, nous on veut afficher un petit texte "En ligne" sous le pseudo. On pourrait le faire seulement en CSS, mais allons y pour écrire directement dans le HTML !
Juste après le pseudo (que l'on vient de modifier), on va ajouter notre petit texte !
Notre ligne :
- Code:
<span class="gen"><a class="gen js-member-link" href="{memberrow.U_VIEWPROFILE}">{memberrow.USERNAME}</a></span>
Et on va rajouter notre texte en dessous :
- Code:
<span class="gen"><a class="gen js-member-link" href="{memberrow.U_VIEWPROFILE}">{memberrow.USERNAME}</a></span>
<div class="text-member-online">(En ligne)</div>
Styliser en CSS
Je vous invite à lire ces 2 tutoriels de Manumanu pour en savoir plus sur les sélecteurs CSS que nous allons utiliser : Principe du CSS : Les sélecteurs (Partie 1 : CSS2) et Principes du CSS - Les sélecteurs (Partie 2 : CSS3).
Prérequis
Je n'ai pas l'intention de faire un doublon du tuto sur les sélecteurs, donc si vous êtes intéressés, prenez le temps de le lire. (◕‿◕✿)
Voici les sélecteurs que l'on va utiliser (ils sont dans les tutoriels de Manumanu, pour vous rafraichir la mémoire, je vous met un exemple pour chaque) :
- Sélectionner une classe : je sélectionne la balise avec la classe msg
- Code:
.msg { }
- Sélecteur de descendance : je sélectionne classe .test à l'intérieur de la classe msg
- Code:
.msg .test { }
Pour notre petit texte en ligne on va faire un petit style très simple (plus simple tu meurs) :
- Code:
.text-member-online {
font-size: 10px;
color: #2ecc71;
}
Le problème c'est qu'actuellement notre texte "En ligne" s'affiche pour tous les membre . On va donc par défaut cacher le texte avec un display: none;
- Code:
.text-member-online {
font-size: 10px;
color: #2ecc71;
display: none; /* texte caché de base */
}
Et ensuite, quand un membre est connecté, nous rajouterons en javascript une classe nommée "is-online" sur le block qui entoure notre affichage du membre.
Dans le CSS on peut donc prévoir le coup :
- Code:
/* Style que le membre est connecté */
.is-online .text-member-online {
display: block;
}
Modifications du template viewonline_body
PA > Affichage > Templates > viewonline_body
Maintenant, on va rajouter une classe en CSS sur le lien vers les profils des membres en ligne. Comme ça, on pourra les récupérer facilement en javascript ensuite !
On repère la ligne qui permet d'afficher le pseudo et le lien vers le profil :
- Code:
<td class="{reg_user_row.ROW_CLASS}" width="35%"><span class="gen"><a class="gen" href="{reg_user_row.U_USER_PROFILE}">{reg_user_row.USERNAME}</a></span></td>
On ajoute une classe (js-reg-user) sur le lien !
- Code:
<td class="{reg_user_row.ROW_CLASS}" width="35%"><span class="gen"><a class="gen js-reg-user" href="{reg_user_row.U_USER_PROFILE}">{reg_user_row.USERNAME}</a></span></td>
Javascript
Plutôt que de construire le code petit à petit, on va le regarder ensemble pour comprendre ce qu'il fait !
Le code total :
- Code:
/*
* LS NEVER UTOPIA
* Afficher les membres connectés sur la liste des membres
* /
/* on regarde si on est sur la page des membres */
if(document.location.pathname == "/memberlist") {
/* on va sur la page des connectés */
$.get("/viewonline", function(data){
var idLink;
/* on attend que notre propre page soit prête */
$(function(){
/* on récupère chaque membre connecté */
$(".js-reg-user", data).each(function(){
idLink = $(this).attr("href"); /* on récupère le lien du membre */
/* on ajoute la classe sur le block autour du membre */
$(".js-member-link[href='" + idLink + "']").closest(".js-member-block").addClass("is-online");
});
});
});
}
Pour rappel :
- ".js-reg-user" correspond aux membres dans la page "viewonline"
- ".js-member-link" correspond aux membres dans la page "memberlist"
- ".js-member-block" correspond à un block / ligne total pour afficher un membre
- ".js-reg-user" correspond aux membres dans la page "viewonline"
- ".js-member-link" correspond aux membres dans la page "memberlist"
- ".js-member-block" correspond à un block / ligne total pour afficher un membre
En plus des commentaires, voici quelques éléments mis en avant :
On commence par vérifier sur quelle page on est, pour n'exécuter le code que si on est au bon endroit
- Code:
if(document.location.pathname == "/memberlist") { }
Ainsi par exemple :
URL | document.location.pathname |
https://www.never-utopia.com/search?search_id=newposts | /search |
https://www.never-utopia.com/f100-construction-gestion | /f100-construction-gestion |
https://www.never-utopia.com/chatbox/index.forum | /chatbox/index.forum |
https://www.never-utopia.com/privmsg?folder=inbox | /privmsg |
- Code:
/* on va sur la page des connectés */
$.get("/viewonline", function(data){
// reste du code
});
Ensuite, on va sur la page /viewonline et on va stocker tout son html dans une variable "data"
- Code:
$(".js-reg-user", data)
On va donc sélectionner tous les utilisateurs connectés :)
Each signifie "pour chaque", ce qui nous amène à ce passage là :
- Code:
$(".js-reg-user", data).each(function(){
// CODE ICI
})
Il signifie "pour tous les liens qui ont la classe js-reg-user dans data (donc dans notre page /viewonline), fait CECI".
Les liens "js-reg-user" sont les personnes connectées donc, puisque qu'ils sont sur la page /viewonline. Pour chaque personne connectée, je vais donc récupérer l'adresse du lien.
Mon lien ressemble à ceci sur Never Utopia :
L'adresse se trouve dans l'attribut href, pour le stocker je vais donc faire :
Maintenant, je vais essayer de sélectionner la personne connectée sur ma page actuelle, grâce à ce sélecteur :
Si on reprend mon exemple idLink = "/u7334", cela donnerait un sélecteur comme ceci :
Ce qui signifie "sélectionne le(s) élément(s) avec la classe js-member-link qui a l'attribut href avec la valeur /u7734"
Maintenant, je ne veux pas ajouter la classe "is-online" sur mon lien de membre, mais sur le block autour du membre. Comme ça je pourrais styliser tout le bloc
- Code:
<a class="js-reg-user" href="/u7734"><span style="color:#261f17"><strong>Nihil Scar Winspeare</strong></span></a>
L'adresse se trouve dans l'attribut href, pour le stocker je vais donc faire :
- Code:
idLink = $(this).attr("href"); /* on récupère le lien du membre */
Maintenant, je vais essayer de sélectionner la personne connectée sur ma page actuelle, grâce à ce sélecteur :
- Code:
$(".js-member-link[href='" + idLink + "']")
Si on reprend mon exemple idLink = "/u7334", cela donnerait un sélecteur comme ceci :
- Code:
.js-member-link[href='/u7734']
Ce qui signifie "sélectionne le(s) élément(s) avec la classe js-member-link qui a l'attribut href avec la valeur /u7734"
Maintenant, je ne veux pas ajouter la classe "is-online" sur mon lien de membre, mais sur le block autour du membre. Comme ça je pourrais styliser tout le bloc
Je vais donc écrire ceci :
- Code:
$(".js-member-link[href='" + idLink + "']").closest(".js-member-block").addClass("is-online");
Aller plus loin
Note : ici on affiche seulement si le membre est connecté, mais on pourrait imaginer de mettre une zone pour afficher dans quelle section du forum il se trouve, en reprenant toujours les données de la même page.
En cas de problème, merci d'aller dans la section "Problème avec mon code"
Dernière édition par Nihil Scar Winspeare le Dim 14 Jan 2018 - 21:33, édité 1 fois