Restriction de contenu dans l’espace public et privé par le « bloc statut »

Ceci est une ARCHIVE, peut-être périmée. Vérifiez bien les compatibilités !

Gerer l’accessibilité du contenu des pages, afficher un contenu différent, tant dans l’interface privée que publique en fonction du statut de l’internaute n’importe où dans vos textes.

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 ou bloc statut

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

Fonctions pour les blocs statuts
Placez ce fichier dans le dossier ecrire de votre site renommez-le sans l’extention .txt ou copier/coller son contenu dans votre fichier mes_options.php3 s’il existe déjà.


-  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

Fonctions pour les blocs statuts (15/10/2005)
Placez ce fichier dans le dossier ecrire de votre site renommez-le sans l’extention .txt ou copier/coller son contenu dans votre fichier mes_options.php3 s’il existe déjà.


-  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.

Notes

[1Seuls les champs titre, sur-titre et sous-titre d’un article ne peuvent utiliser les blocs statut.

[2Seul le champ Texte d’une rubrique peut utiliser les blocs statut.

[3Seul le champs Texte de la brève peut utiliser les blocs statut.

[4Seul le champs Qui êtes-vous ?
de l’auteur peut utiliser les blocs statut.

[5Seul le champs Description du site d’un site référencé peut utiliser les blocs statut.

[6Dernière mise à jour 15-10-2005

Discussion

Aucune 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