--- /dev/null
+<?php
+
+/***************************************************************************\
+ * SPIP, Systeme de publication pour l'internet *
+ * *
+ * Copyright (c) 2001-2011 *
+ * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
+ * *
+ * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
+ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
+\***************************************************************************/
+
+
+//
+// Ce fichier definit les boucles standard de SPIP
+//
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+//
+// Boucle standard, sans condition rajoutee
+//
+// http://doc.spip.org/@boucle_DEFAUT_dist
+function boucle_DEFAUT_dist($id_boucle, &$boucles) {
+ return calculer_boucle($id_boucle, $boucles);
+}
+
+
+//
+// <BOUCLE(BOUCLE)> boucle dite recursive
+//
+// http://doc.spip.org/@boucle_BOUCLE_dist
+function boucle_BOUCLE_dist($id_boucle, &$boucles) {
+
+ return calculer_boucle($id_boucle, $boucles);
+}
+
+//
+// <BOUCLE(ARTICLES)>
+//
+// http://doc.spip.org/@boucle_ARTICLES_dist
+function boucle_ARTICLES_dist($id_boucle, &$boucles) {
+ $boucle = &$boucles[$id_boucle];
+ $id_table = $boucle->id_table;
+ $mstatut = $id_table .'.statut';
+
+ // Restreindre aux elements publies
+ if (!isset($boucle->modificateur['criteres']['statut'])) {
+ if (!$GLOBALS['var_preview']) {
+ if ($GLOBALS['meta']["post_dates"] == 'non')
+ array_unshift($boucle->where,array("'<'", "'$id_table" . ".date'", "sql_quote(quete_date_postdates())"));
+ array_unshift($boucle->where,array("'='", "'$mstatut'", "'\\'publie\\''"));
+ } else
+ array_unshift($boucle->where,array("'IN'", "'$mstatut'", "'(\\'publie\\',\\'prop\\')'"));
+ }
+ return calculer_boucle($id_boucle, $boucles);
+}
+
+//
+// <BOUCLE(AUTEURS)>
+//
+// http://doc.spip.org/@boucle_AUTEURS_dist
+function boucle_AUTEURS_dist($id_boucle, &$boucles) {
+ $boucle = &$boucles[$id_boucle];
+ $id_table = $boucle->id_table;
+ $mstatut = $id_table .'.statut';
+
+ // Restreindre aux elements publies
+ if (!isset($boucle->modificateur['criteres']['statut'])) {
+ // Si pas de lien avec un article, selectionner
+ // uniquement les auteurs d'un article publie
+ if (!$GLOBALS['var_preview'])
+ if (!isset($boucle->modificateur['lien']) AND !isset($boucle->modificateur['tout'])) {
+ fabrique_jointures($boucle, array(
+ array($id_table, array('spip_auteurs_articles'), 'id_auteur'),
+ array('', array('spip_articles'), 'id_article')), true, $boucle->show, $id_table);
+ $t = array_search('spip_articles', $boucle->from);
+ array_unshift($boucle->where,
+ array("'='", "'$t.statut'", "'\\'publie\\''"));
+ if ($GLOBALS['meta']['post_dates'] == 'non')
+ array_unshift($boucle->where,
+ array("'<='", "'$t.date'", "sql_quote(quete_date_postdates())"));
+ }
+ // pas d'auteurs poubellises
+ array_unshift($boucle->where,array("'!='", "'$mstatut'", "'\\'5poubelle\\''"));
+ }
+
+ return calculer_boucle($id_boucle, $boucles);
+}
+
+//
+// <BOUCLE(BREVES)>
+//
+// http://doc.spip.org/@boucle_BREVES_dist
+function boucle_BREVES_dist($id_boucle, &$boucles) {
+ $boucle = &$boucles[$id_boucle];
+ $id_table = $boucle->id_table;
+ $mstatut = $id_table .'.statut';
+
+ // Restreindre aux elements publies
+ if (!isset($boucle->modificateur['criteres']['statut'])) {
+ if (!$GLOBALS['var_preview'])
+ array_unshift($boucle->where,array("'='", "'$mstatut'", "'\\'publie\\''"));
+ else
+ array_unshift($boucle->where,array("'IN'", "'$mstatut'", "'(\\'publie\\',\\'prop\\')'"));
+ }
+
+ return calculer_boucle($id_boucle, $boucles);
+}
+
+
+//
+// <BOUCLE(FORUMS)>
+//
+// http://doc.spip.org/@boucle_FORUMS_dist
+function boucle_FORUMS_dist($id_boucle, &$boucles) {
+ $boucle = &$boucles[$id_boucle];
+ $id_table = $boucle->id_table;
+ $mstatut = $id_table .'.statut';
+ // Par defaut, selectionner uniquement les forums sans mere
+ // Les criteres {tout} et {plat} inversent ce choix
+ if (!isset($boucle->modificateur['tout']) AND !isset($boucle->modificateur['plat'])) {
+ array_unshift($boucle->where,array("'='", "'$id_table." ."id_parent'", 0));
+ }
+ // Restreindre aux elements publies
+ if (!$boucle->modificateur['criteres']['statut']) {
+ if ($GLOBALS['var_preview'])
+ array_unshift($boucle->where,array("'IN'", "'$mstatut'", "'(\\'publie\\',\\'prive\\')'"));
+ else
+ array_unshift($boucle->where,array("'='", "'$mstatut'", "'\\'publie\\''"));
+ }
+
+ return calculer_boucle($id_boucle, $boucles);
+}
+
+
+//
+// <BOUCLE(SIGNATURES)>
+//
+// http://doc.spip.org/@boucle_SIGNATURES_dist
+function boucle_SIGNATURES_dist($id_boucle, &$boucles) {
+ $boucle = &$boucles[$id_boucle];
+ $id_table = $boucle->id_table;
+ $mstatut = $id_table .'.statut';
+
+ // Restreindre aux elements publies
+ if (!isset($boucle->modificateur['criteres']['statut'])
+ AND !isset($boucle->modificateur['tout'])) {
+
+ array_unshift($boucle->where,array("'='", "'$mstatut'", "'\\'publie\\''"));
+ }
+ return calculer_boucle($id_boucle, $boucles);
+}
+
+
+//
+// <BOUCLE(DOCUMENTS)>
+//
+// http://doc.spip.org/@boucle_DOCUMENTS_dist
+function boucle_DOCUMENTS_dist($id_boucle, &$boucles) {
+ $boucle = &$boucles[$id_boucle];
+ $id_table = $boucle->id_table;
+
+ // on ne veut pas des fichiers de taille nulle,
+ // sauf s'ils sont distants (taille inconnue)
+ array_unshift($boucle->where,array("'($id_table.taille > 0 OR $id_table.distant=\\'oui\\')'"));
+
+ // Supprimer les vignettes
+ if (!isset($boucle->modificateur['criteres']['mode'])
+ AND !isset($boucle->modificateur['criteres']['tout'])) {
+ array_unshift($boucle->where,array("'!='", "'$id_table.mode'", "'\\'vignette\\''"));
+ }
+
+ // Pour une boucle generique (DOCUMENTS) sans critere de lien, verifier
+ // qu notre document est lie a un element publie
+ // (le critere {tout} permet de les afficher tous quand meme)
+ // S'il y a un critere de lien {id_article} par exemple, on zappe
+ // ces complications (et tant pis si la boucle n'a pas prevu de
+ // verification du statut de l'article)
+ if ((!isset($boucle->modificateur['tout']) OR !$boucle->modificateur['tout'])
+ AND (!isset($boucle->modificateur['criteres']['id_objet']) OR !$boucle->modificateur['criteres']['id_objet'])
+ ) {
+ # Espace avant LEFT JOIN indispensable pour insertion de AS
+ # a refaire plus proprement
+
+ ## la boucle par defaut ignore les documents de forum
+ $boucle->from[$id_table] = "spip_documents LEFT JOIN spip_documents_liens AS l
+ ON $id_table.id_document=l.id_document
+ LEFT JOIN spip_articles AS aa
+ ON (l.id_objet=aa.id_article AND l.objet=\'article\')
+ LEFT JOIN spip_breves AS bb
+ ON (l.id_objet=bb.id_breve AND l.objet=\'breve\')
+ LEFT JOIN spip_rubriques AS rr
+ ON (l.id_objet=rr.id_rubrique AND l.objet=\'rubrique\')
+ LEFT JOIN spip_forum AS ff
+ ON (l.id_objet=ff.id_forum AND l.objet=\'forum\')
+ ";
+ $boucle->group[] = "$id_table.id_document";
+
+ if ($GLOBALS['var_preview']) {
+ array_unshift($boucle->where,"'(aa.statut IN (\'publie\',\'prop\') OR bb.statut IN (\'publie\',\'prop\') OR rr.statut IN (\'publie\',\'prive\') OR ff.statut IN (\'publie\',\'prop\'))'");
+ } else {
+ $postdates = ($GLOBALS['meta']['post_dates'] == 'non')
+ ? ' AND aa.date<=\'.sql_quote(quete_date_postdates()).\''
+ : '';
+ array_unshift($boucle->where,"'((aa.statut = \'publie\'$postdates) OR bb.statut = \'publie\' OR rr.statut = \'publie\' OR ff.statut=\'publie\')'");
+ }
+ }
+
+
+ return calculer_boucle($id_boucle, $boucles);
+}
+
+//
+// <BOUCLE(RUBRIQUES)>
+//
+// http://doc.spip.org/@boucle_RUBRIQUES_dist
+function boucle_RUBRIQUES_dist($id_boucle, &$boucles) {
+ $boucle = &$boucles[$id_boucle];
+ $id_table = $boucle->id_table;
+ $mstatut = $id_table .'.statut';
+
+ // Restreindre aux elements publies
+ if (!isset($boucle->modificateur['criteres']['statut'])) {
+ if (!$GLOBALS['var_preview'])
+ if (!isset($boucle->modificateur['tout']))
+ array_unshift($boucle->where,array("'='", "'$mstatut'", "'\\'publie\\''"));
+ }
+
+ return calculer_boucle($id_boucle, $boucles);
+}
+
+
+//
+// <BOUCLE(HIERARCHIE)>
+//
+// http://doc.spip.org/@boucle_HIERARCHIE_dist
+function boucle_HIERARCHIE_dist($id_boucle, &$boucles) {
+ $boucle = &$boucles[$id_boucle];
+ $id_table = $boucle->id_table . ".id_rubrique";
+
+// Si la boucle mere est une boucle RUBRIQUES il faut ignorer la feuille
+// sauf en presence du critere {tout} (vu par phraser_html)
+
+ $boucle->hierarchie = 'if (!($id_rubrique = intval('
+ . calculer_argument_precedent($boucle->id_boucle, 'id_rubrique', $boucles)
+ . ")))\n\t\treturn '';\n\t"
+ . '$hierarchie = '
+ . (isset($boucle->modificateur['tout']) ? '",$id_rubrique"' : "''")
+ . ";\n\t"
+ . 'while ($id_rubrique = sql_getfetsel("id_parent","spip_rubriques","id_rubrique=" . $id_rubrique,"","","", "", $connect)) {
+ $hierarchie = ",$id_rubrique$hierarchie";
+ }
+ if (!$hierarchie) return "";
+ $hierarchie = substr($hierarchie,1);';
+
+ $boucle->where[]= array("'IN'", "'$id_table'", '"($hierarchie)"');
+
+ $order = "FIELD($id_table, \$hierarchie)";
+ if (!isset($boucle->default_order[0]) OR $boucle->default_order[0] != " DESC")
+ $boucle->default_order[] = "\"$order\"";
+ else
+ $boucle->default_order[0] = "\"$order DESC\"";
+ return calculer_boucle($id_boucle, $boucles);
+}
+
+
+//
+// <BOUCLE(SYNDICATION)>
+//
+// http://doc.spip.org/@boucle_SYNDICATION_dist
+function boucle_SYNDICATION_dist($id_boucle, &$boucles) {
+ $boucle = &$boucles[$id_boucle];
+ $id_table = $boucle->id_table;
+ $mstatut = $id_table .'.statut';
+
+ // Restreindre aux elements publies
+
+ if (!isset($boucle->modificateur['criteres']['statut'])) {
+ if (!$GLOBALS['var_preview']) {
+ array_unshift($boucle->where,array("'='", "'$mstatut'", "'\\'publie\\''"));
+ } else
+ array_unshift($boucle->where,array("'IN'", "'$mstatut'", "'(\\'publie\\',\\'prop\\')'"));
+ }
+ return calculer_boucle($id_boucle, $boucles);
+}
+
+//
+// <BOUCLE(SYNDIC_ARTICLES)>
+//
+// http://doc.spip.org/@boucle_SYNDIC_ARTICLES_dist
+function boucle_SYNDIC_ARTICLES_dist($id_boucle, &$boucles) {
+ $boucle = &$boucles[$id_boucle];
+ $id_table = $boucle->id_table;
+ $mstatut = $id_table .'.statut';
+
+ // Restreindre aux elements publies, sauf critere contraire
+ if (isset($boucle->modificateur['criteres']['statut']) AND $boucle->modificateur['criteres']['statut']) {}
+ else if ($GLOBALS['var_preview'])
+ array_unshift($boucle->where,array("'IN'", "'$mstatut'", "'(\\'publie\\',\\'prop\\')'"));
+ else {
+ $jointure = array_search("spip_syndic", $boucle->from);
+ if (!$jointure) {
+ fabrique_jointures($boucle, array(array($id_table, array('spip_syndic'), 'id_syndic')), true, $boucle->show, $id_table);
+ $jointure = array_search('spip_syndic', $boucle->from);
+ }
+ array_unshift($boucle->where,array("'='", "'$mstatut'", "'\\'publie\\''"));
+ $boucle->where[]= array("'='", "'$jointure" . ".statut'", "'\\'publie\\''");
+
+ }
+ return calculer_boucle($id_boucle, $boucles);
+}
+
+?>