From f21790d637cea6a792a531fe296bb870ea08c35c Mon Sep 17 00:00:00 2001 From: "real3t@gmail.com" <> Date: Tue, 2 Jun 2015 15:36:30 +0000 Subject: [PATCH] =?UTF-8?q?Avec=20la=20bonne=20requ=C3=AAte,=20et=20un=20p?= =?UTF-8?q?eu=20d'inspiration=20:=20-=20http://programmer.spip.net/sql=5Fg?= =?UTF-8?q?et=5Fselect=20-=20http://zone.spip.org/trac/spip-zone/browser/?= =?UTF-8?q?=5Fcore=5F/plugins/medias/medias=5Ffonctions.php=3Frev=3D85604#?= =?UTF-8?q?L154=20Plus=20les=20encouragements=20de=20ladnet=20et=20marcima?= =?UTF-8?q?t=20sur=20IRC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Les critères {archive} et {!archive} optimisés aux petits oignon pour ne pas intéroger la base de données plus que nécessaire. --- soyezcreateurs_fonctions.php | 138 ++++++----------------------------- 1 file changed, 21 insertions(+), 117 deletions(-) diff --git a/soyezcreateurs_fonctions.php b/soyezcreateurs_fonctions.php index 646250e7..cc25bcaa 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 **/ -- GitLab