diff --git a/soyezcreateurs_fonctions.php b/soyezcreateurs_fonctions.php index 646250e79e0c0868a0ff64f0a54ce82778bf4e2d..cc25bcaad7a925f37a0f4571b5c57b5dac535bc9 100644 --- a/soyezcreateurs_fonctions.php +++ b/soyezcreateurs_fonctions.php @@ -797,126 +797,30 @@ function balise_ARTICLE_URL_dist($p) { // ajoute le critere {archive x} function critere_archive_dist($idb, &$boucles, $crit) { $boucle = &$boucles[$idb]; - - $boucle->modificateur['criteres']['archive'] = true; - $not = $crit->not; - - // Cas de la boucle ARTICLES + $not = $crit->not?"NOT":""; + if ($boucle->type_requete == 'articles') { $art = $boucle->id_table . '.id_article'; - if ($not) { - $boucle->where[] = masquer_objets_where($art, 'article','NOT'); # par mot-clef - $boucle->where[] = masquer_articles_accessibles_where($art,'NOT'); # par branche - } else { - $boucle->where[] = masquer_objets_where($art, 'article', ''); # par mot-clef - #$boucle->where[] = masquer_articles_accessibles_where($art, ''); # par branche - } - } -} - -/** - * liste des objets directement masques par mot-clef - * - * @return array - */ -function masquer_liste_objets_direct($objet){ - static $liste = array(); - if(isset($liste[$objet])) - return $liste[$objet]; - // liste des objets directement masques - include_spip('base/abstract_sql'); - $tmp = 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)); - // remontee d'un niveau - $tmp = array_map('reset', $tmp); - return $liste[$objet] = array_unique($tmp); -} - -/** - * liste des articles masquees, directement par mot-clef ou par branche. - * - * @param bool $publie - * @return array - */ -function masquer_liste_articles($publie=false){ - // cache static - static $liste_articles = array(); - if(isset($liste_articles[$publie])) - return $liste_articles[$publie]; - // liste des articles contenus dans des rubriques masquees - include_spip('base/abstract_sql'); - $tmp = sql_allfetsel('id_article', 'spip_articles as ma', ($publie?"ma.statut='publie' AND ":'') . sql_in('ma.id_rubrique', masquer_liste_rubriques($publie))); - if (!count($tmp)) - return $liste_articles[$publie] = masquer_liste_objets_direct('article'); - $tmp = array_map('reset', $tmp); - $tmp = array_unique(array_merge($tmp, masquer_liste_objets_direct('article'))); - return $liste_articles[$publie] = $tmp; -} - -/** - * liste des rubriques masquees, directement par mot-clef ou par heritage. - * - * @param bool $publie - * @return array - */ -function masquer_liste_rubriques($publie=false){ - // cache static - static $liste_rubriques = array(); - if(isset($liste_rubriques[$publie])) - return $liste_rubriques[$publie]; - $tmp = masquer_liste_objets_direct('rubrique'); - if (!count($tmp)) - return $liste_rubriques[$publie] = array(); - include_spip('inc/rubriques'); - $tmp = calcul_branche_in(join(',', $tmp)); - if (!strlen($tmp)) - return $liste_rubriques[$publie] = array(); - if($publie) { - $tmp = sql_allfetsel('id_rubrique', 'spip_rubriques as mr', "mr.statut='publie' AND " . sql_in('mr.id_rubrique', $tmp)); - return $liste_rubriques[$publie] = array_map('reset', $tmp); + $select_article = sql_get_select($art, + "spip_articles AS `articlesin` + INNER JOIN spip_mots_liens AS mots_liens_articles + ON (articlesin.id_article = mots_liens_articles.id_objet AND mots_liens_articles.objet=\"article\") + INNER JOIN spip_mots AS mots_articles + ON (mots_liens_articles.id_mot=mots_articles.id_mot)", + array("articlesin.id_article = $art","mots_articles.titre=\"Archives\"")); + $select_article_rubrique = sql_get_select($art, + "spip_articles AS `articlesin` + INNER JOIN spip_rubriques AS rubriques + ON (articlesin.id_rubrique = rubriques.id_rubrique) + INNER JOIN spip_mots_liens AS mots_liens_rubriques + ON (rubriques.id_rubrique = mots_liens_rubriques.id_objet AND mots_liens_rubriques.objet=\"article\") + INNER JOIN spip_mots AS mots_articles ON + (mots_liens_rubriques.id_mot=mots_articles.id_mot)", + array("articlesin.id_article = $art","mots_articles.titre=\"Archives\"")); + + $where = "'$not (($art IN ($select_article)) OR ($art IN ($select_article_rubrique)))'"; + $boucle->where[]= $where; } - return $liste_rubriques[$publie] = explode(',', $tmp); -} - -/** - * Renvoyer le code de la condition where pour la liste des objets masques par mot-clef - * - * @param string $primary - * @return string - */ -function masquer_objets_where($primary, $objet, $not='NOT', $_publique=''){ - # hack : on utilise zzz pour eviter que l'optimiseur ne confonde avec un morceau de la requete principale - 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')"; -} - -/** - * Renvoyer le code de la condition where pour la liste des rubriques masquees, directement par mot-clef ou par heritage. - * - * @param string $primary - * @return string - */ -function masquer_rubriques_where($primary, $not='NOT', $_publique=''){ - return "sql_in('$primary','".implode(',', masquer_liste_rubriques())."', '$not')"; -} - -/** - * Renvoyer la condition where pour la liste des articles dont la rubrique est masquee - * - * @param string $primary - * @return string - */ -function masquer_articles_accessibles_where($primary, $not='NOT', $_publique=''){ - # hack : on utilise zzz pour eviter que l'optimiseur ne confonde avec un morceau de la requete principale - return "sql_in('$primary',sql_get_select('zzza.id_article','spip_articles as zzza',".masquer_rubriques_where('zzza.id_rubrique','',$_publique).",'','','','',\$connect), '$not')"; -} - -/** - * Renvoyer la condition where pour la liste de tous les articles masques, directement par mot-cle pour apartenant a une rubrique masquee - * - * @param string $primary - * @return array - */ -function masquer_articles_where($primary, $_publique=''){ - return "array('AND', ".masquer_objets_where($primary, 'article').', '.masquer_articles_accessibles_where($primary).')'; } /** Plugin Dictionnaires **/