Browse Source

v 3.15.13 : une nouvelle fonction générique 'accesrestreint_objet_restreint' pour tester si un objet est restreint ou pas, qui utilise les fonctions spécifiques si elles existent (donc les 2 fonctions existantes pour les articles et rubriques), et qui fait appel à un pipeline 'accesrestreint_objet_restreint' à la fin pour permettre aux plugins de modifier le résultat. Ajout également d'un nouveau pipeline 'accesrestreint_objets_accessibles_where' à la fin des fonctions qui renvoient le code de la condition where pour la liste des objets accessibles, afin de permettre aux plugins de modifier le résultat. Cas d'utilisation : on a ponctuellement des articles situés dans des zones restreintes, mais qui ne doivent pas être restreints. Ils sont marqués ave un mot-clé, les 2 pipelines permettent de les rendres accessibles en prenant en compte ce mot-clé.

v3.15
tcharlss@bravecassine.com 3 years ago
parent
commit
bea0e64bc5
  1. 60
      accesrestreint_fonctions.php
  2. 6
      paquet.xml
  3. 85
      public/accesrestreint.php

60
accesrestreint_fonctions.php

@ -25,6 +25,66 @@ function accesrestreint_securise_squelette($letexte) {
return '';
}
/**
* filtre de test générique pour savoir si l'acces à un objet est restreint
*
* @uses accesrestreint_article_restreint
* @uses accesrestreint_rubrique_restreinte
*
* @param string $objet
* @param int $id_objet
* @param int $id_auteur
* @return bool
*/
function accesrestreint_objet_restreint($id_objet, $objet, $id_auteur = null) {
// S'il existe une fonction spécifique pour le type d'objet, on l'utilise
if ($fonction = "accesrestreint_${objet}_restreint"
and function_exists($fonction)
) {
$restreint = $fonction($id_objet, $id_auteur);
// Sinon du générique
} else {
include_spip('inc/accesrestreint');
include_spip('base/objets');
$table_objet_sql = table_objet_sql($objet);
$champs = objet_info($objet, 'field');
// Si l'objet est dans une rubrique, vérifier qu'elle ne soit pas exclue
$rubrique_exclue = false;
if (isset($champs['id_rubrique'])) {
include_spip('public/quete');
$objet_lang = quete_parent_lang($table_objet_sql, $id_objet);
$rubrique_exclue = @in_array(
$objet_lang['id_rubrique'],
accesrestreint_liste_rubriques_exclues(!test_espace_prive(), $id_auteur)
);
}
// Le test
$restreint =
$rubrique_exclue
or @in_array($id_objet, accesrestreint_liste_objets_exclus($objet, !test_espace_prive(), $id_auteur));
}
// Permettre aux plugins de modifier le résultat
$restreint = pipeline(
'accesrestreint_objet_restreint',
array(
'args' => array(
'objet' => $objet,
'id_objet' => $id_objet,
'id_auteur' => $id_auteur,
),
'data' => $restreint,
)
);
return $restreint;
}
/**
* filtre de test pour savoir si l'acces a un article est restreint

6
paquet.xml

@ -1,7 +1,7 @@
<paquet
prefix="accesrestreint"
categorie="auteur"
version="3.15.12"
version="3.15.13"
etat="test"
compatibilite="[3.0.0;3.2.*]"
logo="prive/themes/spip/images/zone-32.png"
@ -39,6 +39,10 @@
<pipeline nom="accesrestreint_pre_vue_document" action="" />
<!-- Après avoir analysé le doc, et juste avant son affichage -->
<pipeline nom="accesrestreint_afficher_document" action="" />
<!-- Code de la condition pour filtrer les objets accessibles -->
<pipeline nom="accesrestreint_objets_accessibles_where" action="" />
<!-- Test pour savoir si un objet est restreint -->
<pipeline nom="accesrestreint_objet_restreint" action="" />
<menu nom="zones" titre="accesrestreint:icone_menu_config" parent="menu_publication" icone="images/zone-16.png" />

85
public/accesrestreint.php

@ -134,8 +134,22 @@ function accesrestreint_rubriques_accessibles_where($primary, $not = 'NOT', $_pu
if (!$_publique) {
$_publique = '!test_espace_prive()';
}
$where = "sql_in('$primary', accesrestreint_liste_rubriques_exclues($_publique), '$not')";
return "sql_in('$primary', accesrestreint_liste_rubriques_exclues($_publique), '$not')";
// Permettre aux plugins de modifier la condition
$where = pipeline('accesrestreint_objets_accessibles_where',
array(
'args' => array(
'table_objet' => 'rubriques',
'primary' => $primary,
'publique' => $_publique,
'not' => $not,
),
'data' => $where
)
);
return $where;
}
/**
@ -148,6 +162,20 @@ function accesrestreint_articles_accessibles_where($primary, $_publique = '') {
# hack : on utilise zzz pour eviter que l'optimiseur ne confonde avec un morceau de la requete principale
$where = "array('NOT IN','$primary','(SELECT * FROM('.sql_get_select('zzza.id_article','spip_articles as zzza',".accesrestreint_rubriques_accessibles_where('zzza.id_rubrique', '', $_publique).", '', '', '', '',\$connect).') AS subquery)')";
$where = "array('AND', $where, ".accesrestreint_objets_accessibles_where('articles', $primary, 'not', $_publique).")";
// Permettre aux plugins de modifier la condition
$where = pipeline('accesrestreint_objets_accessibles_where',
array(
'args' => array(
'table_objet' => 'articles',
'primary' => $primary,
'publique' => $_publique,
'not' => null,
),
'data' => $where
)
);
return $where;
#return array('SUBSELECT','id_article','spip_articles',array(".accesrestreint_rubriques_accessibles_where('id_rubrique').")))";
}
@ -162,6 +190,20 @@ function accesrestreint_breves_accessibles_where($primary, $_publique = '') {
# hack : on utilise zzz pour eviter que l'optimiseur ne confonde avec un morceau de la requete principale
$where = "array('NOT IN','$primary','(SELECT * FROM('.sql_get_select('zzzb.id_breve','spip_breves as zzzb',".accesrestreint_rubriques_accessibles_where('zzzb.id_rubrique', '', $_publique).", '', '', '', '',\$connect).') AS subquery)')";
$where = "array('AND', $where, ".accesrestreint_objets_accessibles_where('breves', $primary, 'not', $_publique).")";
// Permettre aux plugins de modifier la condition
$where = pipeline('accesrestreint_objets_accessibles_where',
array(
'args' => array(
'table_objet' => 'breves',
'primary' => $primary,
'publique' => $_publique,
'not' => null,
),
'data' => $where
)
);
return $where;
#return "array('IN','$primary',array('SUBSELECT','id_breve','spip_breves',array(".accesrestreint_rubriques_accessibles_where('id_rubrique').")))";
}
@ -176,6 +218,20 @@ function accesrestreint_syndic_articles_accessibles_where($primary, $_publique =
# hack : on utilise zzz pour eviter que l'optimiseur ne confonde avec un morceau de la requete principale
$where = "array('NOT IN','$primary','(SELECT * FROM('.sql_get_select('zzzs.id_syndic','spip_syndic as zzzs',".accesrestreint_rubriques_accessibles_where('zzzs.id_rubrique', '', $_publique).", '', '', '', '',\$connect).') AS subquery)')";
$where = "array('AND', $where, ".accesrestreint_objets_accessibles_where('syndic', $primary, 'not', $_publique).")";
// Permettre aux plugins de modifier la condition
$where = pipeline('accesrestreint_objets_accessibles_where',
array(
'args' => array(
'table_objet' => 'syndic_articles',
'primary' => $primary,
'publique' => $_publique,
'not' => null,
),
'data' => $where
)
);
return $where;
#return "array('IN','$primary',array('SUBSELECT','id_syndic','spip_syndic',array(".accesrestreint_rubriques_accessibles_where('id_rubrique').")))";
}
@ -199,6 +255,19 @@ function accesrestreint_forums_accessibles_where($primary, $_publique = '') {
.")";
$where = "array('OR',$where,sql_in('zzzf.objet',\"'rubrique','article','breve'\",'NOT',\$connect))";
// Permettre aux plugins de modifier la condition
$where = pipeline('accesrestreint_objets_accessibles_where',
array(
'args' => array(
'table_objet' => 'forums',
'primary' => $primary,
'publique' => $_publique,
'not' => null,
),
'data' => $where
)
);
return "array('IN','$primary','(SELECT * FROM('.sql_get_select('zzzf.id_forum','spip_forum as zzzf',array($where),'','','','',\$connect).') AS subquery)')";
}
@ -208,6 +277,7 @@ function accesrestreint_forums_accessibles_where($primary, $_publique = '') {
* on ne rend visible que les docs qui sont lies a un article, une breve ou une rubrique visible
*
* @param string $primary
* @param mixed $_publique
* @return string
*/
function accesrestreint_documents_accessibles_where($primary, $_publique = '') {
@ -223,6 +293,19 @@ function accesrestreint_documents_accessibles_where($primary, $_publique = '') {
array('NOT IN','$primary','(SELECT * FROM('.sql_get_select('zzzd.id_document','spip_documents_liens as zzzd','','','','','',\$connect).') AS subquery)')
)";
// Permettre aux plugins de modifier la condition
$where = pipeline('accesrestreint_objets_accessibles_where',
array(
'args' => array(
'table_objet' => 'documents',
'primary' => $primary,
'publique' => $_publique,
'not' => null,
),
'data' => $where
)
);
return $where;
}

Loading…
Cancel
Save