Filtrer une liste de rubriques en fonction de l’utilisateur

Exemple d’utilisation du filtre sioui-sinon, de la balise #SESSION, avec le critère IN et les balises #SET/#GET et #ARRAY

Cette modeste contrib se limite principalement à une boucle, mais fait appel à diverses fonctionnalités de SPIP :

-  La balise #SESSION (plugin #SESSION) à installer comme plugin,
-  Le filtre sioui-sinon (les filtres de SPIP),
-  Le critère IN (les critères communs à toutes les boucles),
-  Les balises #SET et #GET (les balises propres au site) à partir de 1.9.1,
-  La balise #ARRAY (les balises propres au site) à partir de 1.9.2,

Le but de cet article est de vous montrer l’utilisation de ces diverses fonctionnalités. Le code présenté ici suffit pour mon site. Il n’a pas la prétention de faire une gestion des utilisateurs. Pour ça, il y a des contributions complètes, voir le plugin accès restreint.

Le contexte

Mon site a 4 types d’utilisateurs :
-  les administrateurs (statut=0minirezo),
-  les rédacteurs (statut=1comite),
-  les visiteurs (statut=6forum), qui ne peuvent pas entrer dans l’espace privé,
-  les utilisateurs non enregistrés.

Il dispose de 4 types de secteurs (rubriques sous la racine) en fonction de leur mot-clé :
-  public : pour secteurs accessibles à tout utilisateur,
-  membres : pour secteurs accessibles à tout utilisateur enregistré,
-  admin : pour secteurs accessibles aux admis et rédacteurs,
-  masquer : pour secteurs inaccessibles dans le site public

Au départ, je voulais masquer les secteurs uniquement pour les utilisateurs non enregistrés. Donc voici les boucles :

<BOUCLE_secteurs_masques(RUBRIQUES){racine}{titre_mot IN admin,membres,masquer}{doublons}></BOUCLE_secteurs_masques>
<B_secteurs>
    <BOUCLE_secteurs(RUBRIQUES) {racine}{par num titre}{doublons}>
        <a href="#URL_RUBRIQUE">#TITRE</a>
    </BOUCLE_secteurs>
</B_secteurs>

-  La première boucle secteurs_masques (vide) récupère tous les secteurs à ne pas afficher, avec un critère doublons.
-  La deuxième boucle secteurs récupère les autres secteurs, et les affiche. Le critère doublons permet de ne pas afficher les secteurs récupérés par la première boucle.

Afficher les secteurs en fonction du statut de l’utilisateur

La solution serait de pouvoir paramétrer le critère {titre_mot IN admin,membres,masquer} en fonction du statut de l’utilisateur. C’est-à-dire :

-  {titre_mot IN admin,membres,masquer} pour les utilisateurs non enregistrés,
-  {titre_mot IN admin,masquer} pour les visiteurs,
-  et {titre_mot IN masquer} pour les admins et rédacteurs,

Or si on lit la doc pour le critère IN :

Avec SPIP 1.9, les balises sont admises dans les arguments de IN, et notamment la balise ENV, à laquelle sont appliqués les filtres d’analyse pour assurer que la requête SQL sera bien écrite. De manière dérogatoire, SPIP testera si l’argument de ENV désigne un tableau...

Donc on doit pouvoir affecter une balise #GET comme argument de IN, à condition que ce soit un tableau. Et pour faire un tableau, on dispose, depuis 1.9.2, de la balise #ARRAY [1] voir les nouveautés de spip 1.9.2. Ce qui permettrait donc de faire :

#SET{critere_in, #ARRAY{0,admin,1,membres,2,masquer}} 
<BOUCLE_secteurs_masques(RUBRIQUES){racine}{titre_mot IN #GET{critere_in}}{doublons}> </BOUCLE_secteurs_masques>
etc...

Ici #SET crée une variable {critere_in} sous forme d’un tableau (0 => "admin", 1 => "membres", 2 => "masquer")

Maintenant il ne reste plus qu’à paramétrer notre variable {critere_in}, de façon à ce qu’elle contienne (admin,membres,masquer), (admin,masquer) ou (masquer), en fonction du statut de l’utilisateur. C’est là qu’intervient le filtre sioui-sinon.

On va faire ça en 2 étapes afin de présenter la solution pas à pas.

Paramétrer le critère IN - cas 1

Dans ce premier cas, on ne prendra en compte que :

-  {titre_mot IN admin,membres,masquer} pour les utilisateurs non enregistrés,
-  et {titre_mot IN admin,masquer} pour les utilisateurs enregistrés, cad ayant un statut.

[(#SESSION{statut}|?{
    #SET{critere_in, #ARRAY{0,admin,1,masquer}}
    ,
    #SET{critere_in, #ARRAY{0,admin,1,membres,2,masquer}}
})]
<BOUCLE_secteurs_masques(RUBRIQUES) {racine} {titre_mot IN #GET{critere_in}} {doublons}> </BOUCLE_secteurs_masques>
etc...

Qu’on traduira par :
-  si l’utilisateur a un statut, on masque les secteurs ayant les mots-clés « admin » et « masquer »,
-  sinon, on masque les secteurs ayant les mots-clés « admin », « membres » et « masquer ».

On utilise comme condition la valeur de #SESSION{statut}, utilisée par le plugin #SESSION pour retourner le statut de l’utilisateur. C’est la seule intervention de ce plugin ici. Évidemment vous pouvez envisager une autre condition, en fonction de vos besoins.

Paramétrer le critère IN - cas 2

Dans ce deuxième cas, on prendra en compte :

-  {titre_mot IN admin,membres,masquer} pour les utilisateurs non enregistrés,
-  {titre_mot IN admin,masquer} pour les visiteurs,
-  et {titre_mot IN masquer} pour les admins et rédacteurs,

[(#SESSION{statut}|?{
    [(#SESSION{statut}|=={6forum}|?{
        #SET{critere_secteurs, #ARRAY{0,admin,1,masquer}}
        ,
        #SET{critere_secteurs, #ARRAY{0,masquer}}
    })]
    ,
    #SET{critere_secteurs, #ARRAY{0,admin,1,membres,2,masquer}}
})]
<BOUCLE_secteurs_masques(RUBRIQUES) {racine} {titre_mot IN #GET{critere_in}} {doublons}> </BOUCLE_secteurs_masques>
etc...

C’est le même principe, mais on utilise 2 filtres sioui-sinon imbriqués :

-  si l’utilisateur a un statut :

  • si c’est un visiteur (statut=6forum), on masque les secteurs ayant les mots-clés « admin » et « masquer »,
  • sinon, on ne masque les secteurs ayant le mot-clé « masquer » ;

-  sinon si l’utilisateur n’a pas de statut, on masque les secteurs ayant les mots-clés « admin », « membres » et « masquer ».

En espérant que cette contribution vous aidera et vous donnera des idées pour votre propre code.

Notes

[1La balise #ARRAY accepte des arguments par paires (clé, valeur). La clé pouvant être numérique ou une chaîne de caractères. Ceux qui connaissent un peu PHP auront tendance à créer un #ARRAY{valeur1, valeur2...}, pour son équivalent PHP array(0 => valeur1, 1 => valeur2...). Or il est impératif d’indiquer les clés même si elles sont triviales, sinon Spip prendra une valeur comme clé.

Nota SPIP-Contrib : il est bien évident, comme dit l’auteur, qu’il ne s’agit pas là d’une solution de protection d’accès, puisque par exemple l’accès direct aux articles est possible avec leurs urls.

Discussion

Une discussion

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom