Skip to content

Instantly share code, notes, and snippets.

@timothyarmes
Last active November 30, 2023 14:47
Show Gist options
  • Save timothyarmes/93f17f4159b9f3cd4d0f0b49addd28c2 to your computer and use it in GitHub Desktop.
Save timothyarmes/93f17f4159b9f3cd4d0f0b49addd28c2 to your computer and use it in GitHub Desktop.
Pages privés dans Paheko

Pages privées

Il est possible de créer une zone privée sur votre site réservée aux membres avec Paheko, mais cela n'est pas évident.

Si votre backend et frontend ont le même nom de domaine (par exemple, my-assoc.paheko.cloud), vous pouvez simplement implémenter la Partie 1 décrite ci-dessous. Cela bloquera l'accès aux pages de la zone privée sauf si l'utilisateur s'est connecté au préalable.

Si vous avez votre propre nom de domaine pour votre site et que vous utilisez Paheko Cloud, la zone d'administration du site sera toujours sur paheko.cloud. Étant donné que le frontend est désormais sur un domaine différent du backend, il n'est plus possible de savoir si l'utilisateur est connecté. C'est un problème car les pages privées ne seront désormais jamais visibles. Résoudre cela demande un peu plus de travail, comme décrit dans la Partie 2.

Partie 1 - solution simple

Créer une catégorie privée

Dans le module web, créez une catégorie qui contiendra la zone des membres de votre site. Donnez-lui un slug d'URL tel que espace-membres. Vous l'utiliserez pour tester les pages faisant partie de la zone privée et les rendre inaccessibles aux utilisateurs non connectés.

Masquer les catégories et pages de la zone privée

Vous devrez modifier category.html et article.html pour bloquer l'accès lorsque l'article/catégorie accédé fait partie de la zone des membres (sauf si l'utilisateur est connecté). Les fichiers d'exemple ci-dessous montrent comment le faire.

Partie 2 - module personnalisé

Comme expliqué ci-dessus, si vous avez un domaine personnalisé, vos pages privées ne seront désormais plus du tout accessibles.

Pour résoudre cela, nous allons plutôt créer un mini-module web qui affiche la zone privée de votre site directement dans le backend d'administration. En fait, je préfère cette solution de toute façon, car la solution simple exige que l'utilisateur se connecte via la zone d'administration, puis retourne sur le site public et accède à la zone privée. En intégrant directement la zone des membres dans le backend, cela semble beaucoup plus naturel.

C'est un peu plus exigeant techniquement cependant. Voici ce qu'il faut faire:

Créer un module privé

  1. Allez dans Configuration/Extensions et cliquez sur "Créer un module".
  2. Donnez au module un nom tel que "Espace Membres".
  3. Cliquez sur les options "Afficher dans le menu" et "Afficher un bouton sur l'accueil" pour faciliter l'accès à la zone des membres.
  4. Créez le module.
  5. Activez le module (il ne sera pas activé par défaut).

Afficher la zone des membres lors de l'accès à ce module

Vous devriez maintenant avoir une option dans la barre latérale pour accéder à la zone des membres.

image

Elle ne fait encore rien, corrigeons cela...

Créez un fichier appelé index.html dans le module. Ce sera le fichier affiché lors de la visualisation du module, et il doit afficher la zone des membres du site.

Le code ci-dessous (pour index.html) montre ma solution pour cela. L'idée principale est la suivante:

  • #restrict est utilisé pour envoyer les utilisateurs vers la page de connexion s'ils ne sont pas connectés (au cas où)
  • Je récupère toutes les sous-catégories qui sont des enfants directs de ma catégorie Espace Membres et les affiche dans une barre de navigation en haut. Pour chacune, je crée un lien de la forme {{$module.url}}?uri={{$uri}}.
  • S'il y a une URI dans l'URL, alors je trouve et affiche cette page.
  • Sinon, j'affiche le contenu de la catégorie principale Espace Membres.

Cela me permet d'avoir la catégorie parent avec un niveau de sous-catégories. Si vous devez gérer une structure plus profonde, ce code devra être ajusté pour faire face à cela - je n'ai pas regardé cela car je n'en ai pas besoin.

J'ai aussi des fichiers content.css et default.css qui sont basés en grande partie sur ceux du module web, mais ajustés pour s'afficher correctement à l'intérieur de l'interface d'administration. Vous devrez le régler vous-même en fonction de votre propre CSS.

Rediriger les membres vers la zone d'administration

Bien que vous puissiez modifier vos pages membres dans le module web, y accéder directement via leurs URLs 'officielles' ne fonctionnera pas, car ces pages sont bloquées par le changement effectué dans la Partie 1.

À la place, vous devrez modifier le lien de la zone des membres sur votre site public afin qu'il pointe désormais vers le nouveau mini-module web. Comment vous le faites dépend de votre site et de l'emplacement du lien. Dans mon cas, lors de la génération des liens de navigation à partir de mes catégories, je fais cela:

<li><a href="{{if $uri === 'espace-membres'}}https://myassoc.paheko.cloud/m/page_prives/{{else}}{{$url}}{{/if}}" {{if $url == $page.url}}class="active"{{/if}}>{{ $title|remove_leading_number }}</a></li>

Conclusion

Résumons simplement ce qui se passe:

  • Cliquer sur le lien "Espace membres" sur le site public envoie directement les utilisateurs vers le module personnalisé dans le backend où la zone privée est affichée.
  • S'ils ne sont pas connectés, ils seront redirigés vers la page de connexion.
  • Depuis le backend, ils peuvent accéder à la zone des membres à partir du bouton dans la barre latérale ou depuis la page d'accueil de la zone d'administration.

La solution fonctionne très bien (du moins pour nous) et il est propre d'avoir la zone des membres directement dans le backend.

Cerise sur le gâteau

Comment les membres reviennent-ils facilement du backend vers le site public ?

Les plus observateurs auront peut-être remarqué un autre lien dans ma capture d'écran du menu appelé « Aller au site web », qui renvoie l'utilisateur vers le site public. C'est super pratique.

Pour cela, j'ai créé un autre module personnalisé appelé « Aller au site web », avec l'option pour un lien dans la barre de menu. index.html a 6 lignes de code qui redirigent les membres vers le site public:

<html>
<head>
<meta http-equiv="Refresh" content="0; url='{{$root_url}}'" />
</head>
<body />
</html>
{{:include file="_head.html" title=$page.title}}
{{if !$logged_user && $page.path|match:"espace-membres/" == true}}
{{*
Si l'article fait partie de l'espace membre, on redirige vers la partie admin du site
Plutôt que d'utiliser #restrict, il est possible des mettre un message avec un lien ver la page de login etc...
*}}
{{#restrict block=true}}
{{/restrict}}
{{else}}
{{* Le code normal pour l'affichage d'un article, par exemple.... *}}
<article>
<h1>{{$page.title}}</h1>
<h5>Publié&nbsp;: {{$page.published|relative_date}}</h5>
{{$page.html|raw}}
</article>
{{/if}}
{{:include file="./_foot.html"}}
{{:include file="./_head.html" title=$page.title}}
{{if !$logged_user && $page.path|match:"espace-membres" == true }}
{{*
Si ce categorie fait partie de l'espace membre, on redirige vers la partie admin du site
Plutôt que d'utiliser #restrict, il est possible des mettre un message avec un lien ver la page de login etc...
*}}
{{#restrict block=true}}
{{/restrict}}
{{else}}
{{* code normal pour une page categorie.... *}}
{{/if}}
{{:include file="./_foot.html"}}
{{:assign var="custom_css." value="./default.css?v=8"}}
{{:assign var="custom_css." value="./content.css?v=8"}}
{{:admin_header title="Espace membres" custom_css=$custom_css layout=$layout }}
{{#restrict block=true}}
{{/restrict}}
<div id="content-wrapper">
<nav class="main">
<input type="checkbox" id="nav-toggle" {{if $request_url == "/m/page_prives/"}}checked{{/if}}>
<label for="nav-toggle" id="nav-toggle-label">
Menu
</label>
<div class="expandable-wrapper">
<ul>
{{#pages parent="espace-membres" order="title"}}
<li><a href="{{$module.url}}?uri={{$uri}}" {{if $uri == $_GET.uri}}class="active"{{/if}}>{{ $title|remove_leading_number }}</a></li>
{{/pages}}
</ul>
</div>
</nav>
{{if $_GET.uri}}
{{#pages uri=$_GET.uri limit=1}}
<article class="single">
{{$html|raw}}
</article>
{{/pages}}
{{else}}
{{#pages uri="espace-membres" limit=1}}
<article class="single">
{{$html|raw}}
</article>
{{/pages}}
{{/if}}
</div>
{{:admin_footer}}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment