condition NOT IN
* Cette fonction renvoie la liste des rubriques interdites
* au visiteur courant
* d'ou le recours a $GLOBALS['accesrestreint_zones_autorisees']
*
* @param bool $publique S�lectionner les rubriques interdites dans l'espace public (true) ou priv� (false)
* @param int $id_auteur Identifiant de l'auteur
* @param bool $quelquesoit_visibilite Si true, on ne s'occupe pas de savoir si une zone est restreinte sur le prive ou sur le public.
* @return array
*/
function accesrestreint_liste_rubriques_exclues($publique=true, $id_auteur=NULL, $quelquesoit_visibilite = false) {
// cache static
static $liste_rub_exclues = array();
static $liste_rub_inclues = array();
if ($quelquesoit_visibilite) { $publique = 'tout'; }
if (is_null($id_auteur) AND isset($GLOBALS['visiteur_session']['id_auteur']))
$id_auteur = $GLOBALS['visiteur_session']['id_auteur'];
if (!isset($liste_rub_exclues[$id_auteur][$publique]) || !is_array($liste_rub_exclues[$id_auteur][$publique])) {
$where = array();
// Ne selectionner que les zones pertinentes
if (!$quelquesoit_visibilite) {
if ($publique)
$where[] = "publique='oui'";
else
$where[] = "privee='oui'";
}
// Si le visiteur est autorise sur certaines zones publiques,
// on selectionne les rubriques correspondant aux autres zones,
// sinon on selectionne toutes celles correspondant a une zone.
include_spip('base/abstract_sql');
if ($GLOBALS['accesrestreint_zones_autorisees']
AND $id_auteur==$GLOBALS['visiteur_session']['id_auteur'])
$where[] = sql_in('zr.id_zone',$GLOBALS['accesrestreint_zones_autorisees'],'NOT');
elseif ($id_auteur)
$where[] = sql_in('zr.id_zone',accesrestreint_liste_zones_autorisees('',$id_auteur),'NOT');
// liste les rubriques (+branches) des zones dont ne fait pas parti l'auteur
$liste_rub_exclues[$id_auteur][$publique] = accesrestreint_liste_contenu_zone_rub($where);
#$liste_rub_exclues[$publique] = array_unique($liste_rub_exclues[$publique]);
}
$final_liste_rub_exclues = $liste_rub_exclues[$id_auteur][$publique];
if (defined("AR_TYPE_RESTRICTION") AND AR_TYPE_RESTRICTION == "faible") {
// AR_TYPE_RESTRICTION d�finit le type de restriction pour traiter les elements communs � plusieurs zone
// Une restriction exclusive (ou forte) donne l'acces aux rubriques restreintes par
// plusieurs zone aux seuls membres de toutes les zones concernees.
// Une restriction faible donne acces � une rubrique, m�me restreinte par
// plusieurs zones, aux membres de chaque zone concernee.
// valeurs : 'faible', 'forte, ou 'exclusive'
// Autrement dit, si une rubrique 2 est enfant d'une rubrique 1,
// et qu'il existe une zone 1 (rubrique 1) et une zone 2 (rubrique 2) :
// - un auteur present dans la zone 1 (uniquement) ne pourra pas voir la rubrique 2
// lorsque la restriction est "forte". Il le pourra avec une restriction "faible"
//
// - A l'inverse, un auteur present uniquement dans la zone 2 ne pourra pas voir
// la rubrique 1 meme si la restriction est "faible" car la parentee n'est pas concernee.
// il faut (si souhaite) dans ce cas definir en plus AR_TYPE_RESTRICTION_PARENTEE a "faible"
// pour l'autoriser.
if (!isset($liste_rub_inclues[$id_auteur][$publique]) OR !is_array($liste_rub_inclues[$id_auteur][$publique])) {
$where = array();
// Ne selectionner que les zones pertinentes
if (!$quelquesoit_visibilite) {
if ($publique)
$where[] = "publique='oui'";
else
$where[] = "privee='oui'";
}
// Calcul des rubriques dans des zones autorisees
include_spip('base/abstract_sql');
if ($GLOBALS['accesrestreint_zones_autorisees']
AND isset($GLOBALS['visiteur_session']['id_auteur'])
AND $id_auteur==$GLOBALS['visiteur_session']['id_auteur'])
$where[] = sql_in('zr.id_zone',$GLOBALS['accesrestreint_zones_autorisees']);
elseif ($id_auteur)
$where[] = sql_in('zr.id_zone',accesrestreint_liste_zones_autorisees('',$id_auteur));
// liste les rubriques (+branches) des zones de l'auteur
$liste_rub_inclues[$id_auteur][$publique] = accesrestreint_liste_contenu_zone_rub($where);
// pour autoriser la vue des rubriques parentes
// memes si elles sont restreintes par une autre zone
if (defined("AR_TYPE_RESTRICTION_PARENTEE") AND AR_TYPE_RESTRICTION_PARENTEE == "faible") {
$liste_rub_inclues[$id_auteur][$publique] =
array_merge($liste_rub_inclues[$id_auteur][$publique],
accesrestreint_liste_parentee_zone_rub($where));
}
}
// Ne pas exclure les elements qui sont autorises
if (isset($GLOBALS['visiteur_session']['id_auteur']))
$final_liste_rub_exclues = array_diff($final_liste_rub_exclues,
array_intersect($final_liste_rub_exclues,$liste_rub_inclues[$id_auteur][$publique]));
}
return $final_liste_rub_exclues;
}
?>