La question de la gestion des droits d’accès tant dans l’interface privée que publique revient régulièrement dans plusieurs listes de discussions. Plusieurs contribs proposent déjà différentes solutions. Alors pourquoi une autre ?
La presque totalité d’entre elles propose de contrôler l’accès à un article ou à une rubrique dans l’interface publique mais pas dans l’interface privée.
De plus, on limite normalement l’accès à la totalité d’une page et non pas à une partie.
Pour offrir une version différente d’une page selon le statut de l’internaute, il faut souvent créer plusieurs pages.
Plusieurs demandent la création et l’ajout à vos pages existantes de nouveaux mots-clés.
Elles impliquent également plusieurs modifications à vos squelettes.
Cette contrib ne demande aucune modification à vos squelettes actuels ni aucune modification au coeur de SPIP.
Elle permet d’afficher, tant dans l’interface privée que publique, n’importe où à l’intérieur de vos textes, un contenu différent selon le statut de l’internaute par l’utilisation de tags au moment de la rédaction de vos textes et ce, sans mot-clé.
Ce sont les tags
Comment ça marche ?
Les tags <statut></statut>
ou « bloc statut » sont librement inspirés des tags ou « bloc multi » <multi></multi>
de SPIP. Ils permettent d’afficher, tant dans l’espace privé que public, des contenus différents selon le statut de l’internaute.
On peut utiliser ces tags dans :
- les articles [1]
- les rubriques [2]
- les brèves [3]
- les auteurs [4]
- les sites référencés [5]
Exemple d’utilisation du « bloc statut » :
<statut>
[ad]
Les Administrateurs identifiés seront les seuls à voir ce texte dans l'interface privée et publique.
[re]
Les rédacteurs identifiés seront les seuls à voir ce texte dans l'interface publique. Dans l'interface privée, les Administrateurs verront également ce texte pour faciliter la validation.
[vi]
Les Visiteurs identifiés seront les seuls à voir ce texte dans l'interface publique. Dans l'interface privée, les Administrateurs verront également ce texte pour faciliter la validation.
[pu]
Les personnes non identifiés verront ce texte dans l'interface publique. Dans l'interface privée, les Administrateurs verront également ce texte pour faciliter la validation.
</statut>
Deux possibilités d’affichage pour l’administrateur dans l’interface privée
- Afficher seulement la version réservée aux administrateurs. Si elle n’existe pas, afficher la version réservée aux Rédacteurs. Si elle n’existe pas, afficher la version réservée aux Visiteurs.
- Afficher toutes les versions. Si elle existe, afficher la version réservée aux Administrateurs. Si elle existe, afficher la version réservée aux Rédacteurs. Si elle existe, afficher la version réservée aux Visiteurs pour l’interface publique. Si elle existe, afficher la version pour les personnes non identifiées pour l’interface publique.
Une seule possibilité pour le rédacteur dans l’interface privée
Si elle existe, afficher la version réservée aux Rédacteurs. Si elle n’existe pas, afficher la version réservée aux Visiteurs. Si elle n’existe pas, afficher la version pour les personnes non identifiées pour l’interface publique.
Si elle n’existe pas, ne rien afficher.
Chaque version est identifiée dans l’interface privée par les mêmes icônes qui identifient le statut des auteurs.
Pour la version publique, on a choisi le +.
Et dans l’interface publique ?
Les partie de texte contenues dans le « bloc statut » ne seront affichées dans l’interface publique que pour les personnes ayant le statut requis.
Où peut-on utiliser le « bloc statut » ?
Le « bloc statut » peut être utilisé partout où est utilisable actuellement le « bloc multi »
Qui peut avoir besoin du « bloc statut » ?
Ses particularités peuvent répondre aux besoins de certains sites qui désirent limiter l’accessibilité de certaines informations aux seuls administrateurs du site dans l’interface d’administration. En effet, ceci n’est pas encore possible, même avec la nouvelle version 1.8.2.
Imaginons un site corporatif qui veut ouvrir l’espace de rédaction de son site SPIP à des consultants extérieurs, sans leur révéler certaines listes de prix ou contacts. L’auteur administrateur n’aura qu’à mettre l’information entre tags <statut>[ad]...</statut>
pour en limiter l’accès aux administrateurs identifiés même dans l’espace privé.
Procédures
Option 1 :
- Téléchargez le fichier mes_options.php3.txt
- Copiez et collez son contenu dans votre fichier mes_options.php3 dans le dossier ecrire s’il existe déjà.
- Sinon, copiez et collez le ficher dans le dossier ecrire et renommez-le fichier en supprimant l’extension .txt (mes_options.php3) .
- Téléchargez le fichier mes_fontions.php3.txt
- Copiez et collez son contenu dans votre ficher mes_fonctions.php3 à la racine de votre site spip s’il existe déjà.
- Sinon, copiez et collez le ficher à la racine de votre site spip et renommez-le fichier en supprimant l’extension .txt (mes_fonctions.php3) .
Option 2 :
Suivez l’explication des modifications suivantes et modifiez vous-même les fichiers déjà en place sur votre site.
Explications des modifications
Nous allons créer un jeu de fonctions directement inspiré de celui permettant d’utiliser les tags
où on remplacera la vérification de la langue par la vérification du statut de l’internaute.
Fichier mes_options.php3 (dossier ecrire)
function avant_propre($texte) {
return extraire_statut($texte);
}
function multi_statut ($trads) {
// Donner la valeur 1 à la variable $affiche_tout pour permettre aux administrateurs de voir dans l'interface privée toutes les versions.
// Donner la valeur 0 à la variable $affiche_tout pour permettre aux administrateurs de voir dans l'interface privée toute la même version
// qu'il verront dans l'interface publique
$affiche_tout=1;
global $id_rubrique;
$image = 'visit-12.gif';
$statut = $GLOBALS['auteur_session']['statut'];
// S'il n'y a aucun texte spécifique pour les visiteurs, afficher pour les visiteurs le texte par défaut
if ($trads['vi']=='')$trads['vi']=$trads['pu'];
// S'il n'y a aucun texte spécifique pour les rédacteurs, afficher pour les rédacteurs le texte le texte des visiteurs
if ($trads['re']==''){
$trads['re']=$trads['vi'];
}else{
$image = 'redac-12.gif';
}
// S'il n'y a aucun texte spécifique pour les administrateurs, afficher pour les administrateurs le texte le texte des rédacteurs
if ($trads['ad']==''){
$trads['ad']=$trads['re'];
}else{
$image = 'admin-12.gif';
}
switch ($statut) {
case '0minirezo':
$statut='ad';
if ($trads[$statut]!='')
$afficher = " <img src=\"" . _DIR_IMG_PACK . $image."\" alt=\"(statut)\" title=\"$survol\" height=\"12\" width=\"12\" border=\"0\" /> ";
break;
case '1comite':
$statut='re';
if (isset($trads[$statut])&&strlen($trads[$statut])!=''){
$afficher = " <img src=\"" . _DIR_IMG_PACK . $image."\" alt=\"(statut)\" title=\"$survol\" height=\"12\" width=\"12\" border=\"0\" /> ";
}
break;
case '6forum':
$statut='vi';
break;
default:
$statut='pu';
break;
}
if (isset($trads[$statut])) {
// dans l'espace prive, mettre une image admin
if (!_DIR_RESTREINT) {
if($statut=='ad'&&$affiche_tout){
if ($trads['ad']!=''&&$trads['ad']!=$trads['re']){
$image = 'admin-12.gif';
$afficher = " <img src=\"" . _DIR_IMG_PACK . $image."\" alt=\"(statut)\" title=\"$survol\" height=\"12\" width=\"12\" border=\"0\" /> ";
$retour = $afficher.$trads['ad'].$afficher;
}
if ($trads['re']!=''&&$trads['re']!=$trads['vi']){
$image = 'redac-12.gif';
$afficher = " <img src=\"" . _DIR_IMG_PACK . $image."\" alt=\"(statut)\" title=\"$survol\" height=\"12\" width=\"12\" border=\"0\" /> ";
$retour .= '<br />'.$afficher.$trads['re'].$afficher;
}
if ($trads['vi']!=''&&$trads['vi']!=$trads['pu']){
$image = 'visit-12.gif';
$afficher = " <img src=\"" . _DIR_IMG_PACK . $image."\" alt=\"(statut)\" title=\"$survol\" height=\"12\" width=\"12\" border=\"0\" /> ";
$retour .= '<br />'.$afficher.$trads['vi'].$afficher;
}
if ($trads['pu']!=''){
$image = 'plus.gif';
$afficher = " <img src=\"" . _DIR_IMG_PACK . $image."\" alt=\"(statut)\" title=\"$survol\" height=\"12\" width=\"12\" border=\"0\" /> ";
$retour .= '<br />'.$afficher.$trads['pu'].$afficher;
}
return $retour;
}
if ($statut=='ad'&&$trads['ad']!=''&&$trads['ad']!=$trads['re']){
$image = 'admin-12.gif';
$afficher = " <img src=\"" . _DIR_IMG_PACK . $image."\" alt=\"(statut)\" title=\"$survol\" height=\"12\" width=\"12\" border=\"0\" /> ";
}else if ($trads['re']!=''&&$trads['re']!=$trads['vi']&&$trads['re']!=$trads['pu']){
$image = 'redac-12.gif';
$afficher = " <img src=\"" . _DIR_IMG_PACK . $image."\" alt=\"(statut)\" title=\"$survol\" height=\"12\" width=\"12\" border=\"0\" /> ";
}else if ($trads['vi']!=''&&$trads['vi']!=$trads['pu']){
$image = 'visit-12.gif';
$afficher = " <img src=\"" . _DIR_IMG_PACK . $image."\" alt=\"(statut)\" title=\"$survol\" height=\"12\" width=\"12\" border=\"0\" /> ";
}
else if ($trads['pu']!=''){
$image = 'plus.gif';
$afficher = " <img src=\"" . _DIR_IMG_PACK . $image."\" alt=\"(statut)\" title=\"$survol\" height=\"12\" width=\"12\" border=\"0\" /> ";
}
return $afficher.$trads[$statut].$afficher;
}
return $trads[$statut];
}
else if (ereg('^([a-z]+)_', $statut, $regs) AND isset($trads[$regs[1]])) {
return $trads[$regs[1]];
}
else return array_shift($trads);
}
// analyse un bloc statut
function analyse_statut ($bloc) {
$statut = 'pu';
// Créer par défaut un tableau avec des valeurs vides
$trads= array('','pu'=>'','ad'=>'','re'=>'','vi'=>'');
while (preg_match("/^(.*?)[{\[]([a-z_]+)[}\]]/si", $bloc, $regs)) {
//while (preg_match("/^(.*?)[\[]([a-z_]+)[\]]/si", $bloc, $regs)){//http://permalink.gmane.org/gmane.comp.web.spip.devel/29558
$texte = trim($regs[1]);
if ($texte OR $statut)
$trads[$statut] = $texte;
$bloc = substr($bloc, strlen($regs[0]));
$statut = $regs[2];
}
$trads[$statut] = $bloc;
return multi_statut($trads);
}
// repere les blocs statut dans un texte et extrait le bon
function extraire_statut ($letexte) {
if (strpos($letexte, '<statut>') === false) return $letexte; // perf
if (preg_match_all("@<statut>(.*?)</statut>@s", $letexte, $regs, PREG_SET_ORDER))
foreach ($regs as $reg)
$letexte = str_replace($reg[0], analyse_statut($reg[1]), $letexte);
return $letexte;
}
Pour conserver dans le système cache des versions différentes selon le statut de l’internaute, on ajoute dans l’url de la page la variable statut en saisissant automatiquement la valeur dans la variable $GLOBALS[’auteur_session’][’statut’]) .
Il est impossible de passer manuellement une valeur erronnée. Merci à Mortimer pour cette astuce.
Fichier mes_fonctions.php3 [6]
if((!isset($_GET['statut'])&&isset($GLOBALS['auteur_session']['statut']))||addslashes($_GET['statut']) != $GLOBALS['auteur_session']['statut']){
$link = $GLOBALS['clean_link'];
$link->delvar('statut');
$link->addvar('statut',$GLOBALS['auteur_session']['statut']);
redirige_par_entete($link->getUrl());
}
À vous de jouer !
Merci de nous aider à améliorer cette contrib en nous signalant toute amélioration possible dans le code ou dans nos explications.
Aucune discussion
Ajouter un commentaire
Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :
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.
Suivre les commentaires : |