Changeset 62063 in spip-zone


Ignore:
Timestamp:
Jun 4, 2012, 1:22:55 AM (7 years ago)
Author:
patfr@…
Message:

Compatibilité SPIP 3.x

La liste des rubriques masquées inclus désormais les rubriques filles
Les articles masqués peuvent désormais l'être par mot-clé
Meilleure gestion des static

TODO :

gérer d'autres objets que les articles et rubriques
mieux gérer le statut

Location:
_plugins_/masquer
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/masquer/masquer_pipelines.php

    r35809 r62063  
    11<?php
    2 @define('_MOT_MASQUER', 'masquer');
     2
     3if(!defined('_MOT_MASQUER')) define('_MOT_MASQUER', 'masquer');
     4if(!defined('_SPIP30000') && $GLOBALS['spip_version_code']>=17743) define('_SPIP30000', 1);
    35
    46function masquer_pre_boucle($boucle) {
    5   static $id_mot;
    6   static $liste_rubriques;
    7   static $liste_articles;
     7  // On ne masque pas si : espace prive ou critere {tout_voir}
     8  if (test_espace_prive() || isset($boucle->modificateur['tout_voir']))
     9    return $boucle;
    810
    9   // On ne masque que sur l'espace public
    10   if (test_espace_prive() || isset($boucle->modificateur['tout_voir'])) {
    11     return $boucle;
    12   }
    13 
    14   // Cas de la boucle RUBRIQUES
    15   if ($boucle->type_requete == 'rubriques') {
     11  $type = $boucle->type_requete;
     12  if ($type == 'rubriques') {
     13        // Cas de la boucle RUBRIQUES
    1614    $rub = $boucle->id_table . '.id_rubrique';
    17     $boucle->where[] = masquer_rubriques_where($rub);
    18   }
    19 
    20   // Cas de la boucle ARTICLES
    21   if ($boucle->type_requete == 'articles') {
     15    $boucle->where[] = masquer_rubriques_where($rub); # par mot-clef et par branche
     16        return $boucle;
     17  } elseif ($type == 'articles') {
     18        // Cas de la boucle ARTICLES
    2219    $art = $boucle->id_table . '.id_article';
    23     $boucle->where[] = masquer_articles_accessibles_where($art);
     20    $boucle->where[] = masquer_objets_where($art, 'article'); # par mot-clef
     21    $boucle->where[] = masquer_articles_accessibles_where($art); # par branche
     22//    $boucle->where[] = masquer_articles_where($art); # par mot-clef et par branche
    2423  }
    2524
     
    2827
    2928/**
    30  * Renvoyer le code de la condition where pour la liste des rubriques masquées
     29 * liste des objets directement masques par mot-clef
     30 *
     31 * @return array
     32 */
     33function masquer_liste_objets_direct($objet){
     34        static $liste = array();
     35        if(isset($liste[$objet]))
     36                return $liste[$objet];
     37        // liste des objets directement masques
     38        include_spip('base/abstract_sql');
     39        $tmp = defined('_SPIP30000')
     40                ?sql_allfetsel('id_objet',"spip_mots_liens AS ml INNER JOIN spip_mots AS m ON (ml.id_mot=m.id_mot AND ml.objet='$objet')", 'm.titre='.sql_quote(_MOT_MASQUER))
     41                :sql_allfetsel('id_'.$objet,"spip_mots_{$objet}s AS mo INNER JOIN spip_mots AS m ON mo.id_mot=m.id_mot", 'm.titre='.sql_quote(_MOT_MASQUER));
     42        // remontee d'un niveau
     43        $tmp = array_map('reset', $tmp);
     44        return $liste[$objet] = array_unique($tmp);
     45}
     46
     47/**
     48 * liste des articles masquees, directement par mot-clef ou par branche.
     49 *
     50 * @param bool $publie
     51 * @return array
     52 */
     53function masquer_liste_articles($publie=false){
     54        // cache static
     55        static $liste_articles = array();
     56        if(isset($liste_articles[$publie]))
     57                return $liste_articles[$publie];
     58        // liste des articles contenus dans des rubriques masquees
     59        include_spip('base/abstract_sql');
     60        $tmp = sql_allfetsel('id_article', 'spip_articles as ma', ($publie?"ma.statut='publie' AND ":'') . sql_in('ma.id_rubrique', masquer_liste_rubriques($publie)));
     61        if (!count($tmp))
     62                return $liste_articles[$publie] = array();
     63        $tmp = array_map('reset', $tmp);
     64        $tmp = array_unique(array_merge($tmp, masquer_liste_objets_direct('article')));
     65        return $liste_articles[$publie] = $tmp;
     66}
     67
     68/**
     69 * liste des rubriques masquees, directement par mot-clef ou par heritage.
     70 *
     71 * @param bool $publie
     72 * @return array
     73 */
     74function masquer_liste_rubriques($publie=false){
     75        // cache static
     76        static $liste_rubriques = array();
     77        if(isset($liste_rubriques[$publie]))
     78                return $liste_rubriques[$publie];
     79        $tmp = masquer_liste_objets_direct('rubrique');
     80        if (!count($tmp))
     81                return $liste_rubriques[$publie] = array();
     82        include_spip('inc/rubriques');
     83        $tmp = calcul_branche_in(join(',', $tmp));
     84        if (!strlen($tmp))
     85                return $liste_rubriques[$publie] = array();
     86        if($publie) {
     87                $tmp = sql_allfetsel('id_rubrique', 'spip_rubriques as mr', "mr.statut='publie' AND " . sql_in('mr.id_rubrique', $tmp));
     88                return $liste_rubriques[$publie] = array_map('reset', $tmp);
     89        }
     90        return $liste_rubriques[$publie] = explode(',', $tmp);
     91}
     92
     93/**
     94 * Renvoyer le code de la condition where pour la liste des objets masques par mot-clef
    3195 *
    3296 * @param string $primary
    3397 * @return string
    3498 */
    35 function masquer_rubriques_where($primary, $_publique=''){
     99function masquer_objets_where($primary, $objet, $not='NOT', $_publique=''){
    36100        # hack : on utilise zzz pour eviter que l'optimiseur ne confonde avec un morceau de la requete principale
    37         return "array('NOT IN','$primary','('.sql_get_select('zzzr.id_rubrique','spip_mots_rubriques as zzzr, spip_mots as zzzm',\"zzzr.id_mot=zzzm.id_mot AND zzzm.titre=".sql_quote(_MOT_MASQUER)."\",'','','','',\$connect).')')";
     101        if(defined('_SPIP30000'))
     102                return "sql_in('$primary',sql_get_select('zzzl.id_objet','spip_mots_liens as zzzl INNER JOIN spip_mots as zzzm ON (zzzl.id_mot=zzzm.id_mot AND zzzl.objet=\'$objet\')',\"zzzm.titre=".sql_quote(_MOT_MASQUER)."\",'','','','',\$connect), '$not')";
     103        return "sql_in('$primary',sql_get_select('zzzo.id_$objet','spip_mots_{$objet}s as zzzo, spip_mots as zzzm',\"zzzo.id_mot=zzzm.id_mot AND zzzm.titre=".sql_quote(_MOT_MASQUER)."\",'','','','',\$connect), '$not')";
    38104}
    39105
    40106/**
    41  * Renvoyer le code de la condition where pour la liste des rubriques accessibles
     107 * Renvoyer le code de la condition where pour la liste des rubriques masquees, directement par mot-clef ou par heritage.
    42108 *
    43109 * @param string $primary
    44110 * @return string
    45111 */
    46 function masquer_rubriques_accessibles_where($primary,$not='NOT', $_publique=''){
    47         return "sql_in('$primary','".implode(',', masquer_liste_rubriques($_publique))."', '$not')";
     112function masquer_rubriques_where($primary, $not='NOT', $_publique=''){
     113        return "sql_in('$primary','".implode(',', masquer_liste_rubriques())."', '$not')";
    48114}
    49115
    50116/**
    51  * liste des rubriques masquer, directement ou par heritage.
    52  *
    53  * @param int/string $id_zone
    54  * @return array
    55  */
    56 function masquer_liste_rubriques($publique=true){
    57         // cache static
    58         static $liste_rubriques = array();
    59         include_spip('inc/rubriques');
    60         $liste_rubriques = masquer_liste_rub_direct();
    61         if (!count($liste_rubriques))
    62                 return $liste_rubriques;
    63         $liste_rubriques = calcul_branche_in(join(',',$liste_rubriques));
    64         if (!strlen($liste_rubriques))
    65                 return array();
    66         $liste_rubriques = explode(',',$liste_rubriques);
    67         return $liste_rubriques;
    68 }
    69 
    70 /**
    71  * liste des rubriques masquer directement.
    72  *
    73  * @return array
    74  */
    75 function masquer_liste_rub_direct(){
    76         $liste_rubriques=array();
    77         // liste des rubriques directement masquer
    78         $where = array();
    79         include_spip('base/abstract_sql');
    80         $liste_rubriques = sql_allfetsel('id_rubrique','spip_mots_rubriques AS mr INNER JOIN spip_mots AS m ON mr.id_mot=m.id_mot','m.titre='.sql_quote(_MOT_MASQUER));
    81         $liste_rubriques = array_map('reset',$liste_rubriques);
    82         $liste_rubriques = array_unique($liste_rubriques);
    83         return $liste_rubriques;
    84 }
    85 
    86 /**
    87  * Renvoyer la condition where pour la liste des articles masquer
     117 * Renvoyer la condition where pour la liste des articles dont la rubrique est masquee
    88118 *
    89119 * @param string $primary
    90120 * @return string
    91121 */
    92 function masquer_articles_accessibles_where($primary, $_publique=''){
     122function masquer_articles_accessibles_where($primary, $not='NOT', $_publique=''){
    93123        # hack : on utilise zzz pour eviter que l'optimiseur ne confonde avec un morceau de la requete principale
    94         return "array('NOT IN','$primary','('.sql_get_select('zzza.id_article','spip_articles as zzza',".masquer_rubriques_accessibles_where('zzza.id_rubrique','',$_publique).",'','','','',\$connect).')')";
     124        return "sql_in('$primary',sql_get_select('zzza.id_article','spip_articles as zzza',".masquer_rubriques_where('zzza.id_rubrique','',$_publique).",'','','','',\$connect), '$not')";
     125}
     126
     127/**
     128 * Renvoyer la condition where pour la liste de tous les articles masques, directement par mot-cle pour apartenant a une rubrique masquee
     129 *
     130 * @param string $primary
     131 * @return array
     132 */
     133function masquer_articles_where($primary, $_publique=''){
     134        return "array('AND', ".masquer_objets_where($primary, 'article').', '.masquer_articles_accessibles_where($primary).')';
    95135}
    96136
  • _plugins_/masquer/plugin.xml

    r58037 r62063  
    22        <nom>Masquer</nom>
    33        <slogan>Cacher des contenus sur le site public</slogan>
    4         <auteur>Nicolas Hoizey, [St&#233;phanie Caron de Clever Age->http://www.clever-age.com/]</auteur>
     4        <auteur>Nicolas Hoizey, [St&#233;phanie Caron de Clever Age->http://www.clever-age.com/], Patrice Vanneufville</auteur>
    55        <licence>GNU/GPL</licence>
    6         <version>0.4.0</version>
     6        <version>0.5.0</version>
    77        <description>Ce plugin permet de masquer sur le site public les contenus qui ont un mot cl&#233; dont le titre est &#171; masquer &#187;. Si une rubrique est masqu&#233;e, toute sa branche l'est aussi. Seuls les rubriques et articles sont g&#233;r&#233;s dans un premier temps. Il suffit d'ajouter le crit&#232;re <code>{tout_voir}</code> aux boucles pour forcer l'affichage des contenus masqu&#233;s. 
    88        </description>
     
    1616                <inclure>masquer_pipelines.php</inclure>
    1717        </pipeline>
    18         <necessite id="SPIP" version="[2.0.0;2.1.99]" />
     18        <necessite id="SPIP" version="[2.0.0;3.99.99]" />
    1919        <categorie>navigation</categorie>
    2020</plugin>
Note: See TracChangeset for help on using the changeset viewer.