Skip to content
Extraits de code Groupes Projets
Valider f21790d6 rédigé par real3t@gmail.com's avatar real3t@gmail.com
Parcourir les fichiers

Avec la bonne requête, et un peu d'inspiration :

- http://programmer.spip.net/sql_get_select
- http://zone.spip.org/trac/spip-zone/browser/_core_/plugins/medias/medias_fonctions.php?rev=85604#L154
Plus les encouragements de ladnet et marcimat sur IRC

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.
parent ebc02262
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -797,126 +797,30 @@ function balise_ARTICLE_URL_dist($p) { ...@@ -797,126 +797,30 @@ function balise_ARTICLE_URL_dist($p) {
// ajoute le critere {archive x} // ajoute le critere {archive x}
function critere_archive_dist($idb, &$boucles, $crit) { function critere_archive_dist($idb, &$boucles, $crit) {
$boucle = &$boucles[$idb]; $boucle = &$boucles[$idb];
$not = $crit->not?"NOT":"";
$boucle->modificateur['criteres']['archive'] = true;
$not = $crit->not;
// Cas de la boucle ARTICLES
if ($boucle->type_requete == 'articles') { if ($boucle->type_requete == 'articles') {
$art = $boucle->id_table . '.id_article'; $art = $boucle->id_table . '.id_article';
if ($not) { $select_article = sql_get_select($art,
$boucle->where[] = masquer_objets_where($art, 'article','NOT'); # par mot-clef "spip_articles AS `articlesin`
$boucle->where[] = masquer_articles_accessibles_where($art,'NOT'); # par branche INNER JOIN spip_mots_liens AS mots_liens_articles
} else { ON (articlesin.id_article = mots_liens_articles.id_objet AND mots_liens_articles.objet=\"article\")
$boucle->where[] = masquer_objets_where($art, 'article', ''); # par mot-clef INNER JOIN spip_mots AS mots_articles
#$boucle->where[] = masquer_articles_accessibles_where($art, ''); # par branche 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)
* liste des objets directement masques par mot-clef INNER JOIN spip_mots_liens AS mots_liens_rubriques
* ON (rubriques.id_rubrique = mots_liens_rubriques.id_objet AND mots_liens_rubriques.objet=\"article\")
* @return array INNER JOIN spip_mots AS mots_articles ON
*/ (mots_liens_rubriques.id_mot=mots_articles.id_mot)",
function masquer_liste_objets_direct($objet){ array("articlesin.id_article = $art","mots_articles.titre=\"Archives\""));
static $liste = array();
if(isset($liste[$objet])) $where = "'$not (($art IN ($select_article)) OR ($art IN ($select_article_rubrique)))'";
return $liste[$objet]; $boucle->where[]= $where;
// 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);
} }
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 **/ /** Plugin Dictionnaires **/
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter