";
}
$milieu = "$afflien onMouseOver=\"image$num_survol.src=".
"'$artoff'\" onMouseOut=\"image$num_survol.src=".
"'$arton'\">$milieu$afflien2";
}
else if ($lien) {
$milieu = "
$milieu";
}
} else {
$milieu="";
}
return $milieu;
}
// Retourne la hierarchie d'une rubrique
function construire_hierarchie($id_rubrique) {
$hierarchie = "";
$id_rubrique = intval($id_rubrique);
while ($id_rubrique) {
$hierarchie = $id_rubrique.",".$hierarchie;
$query = "
SELECT a.id_parent AS ida, b.id_parent AS idb
FROM spip_rubriques AS a
LEFT JOIN spip_rubriques AS b
ON (b.id_rubrique = a.id_parent)
WHERE a.id_rubrique = $id_rubrique";
$result = spip_query($query);
if (!$row = spip_fetch_array($result)) break;
if ($id_parent = $row['ida'])
$hierarchie = $id_parent.",".$hierarchie;
$id_rubrique = $row['idb'];
}
return ((!$hierarchie) ? "0" : substr($hierarchie, 0, -1));
}
//
// Critere {branche} : recuperer les descendants d'une rubrique
//
function calcul_generation ($generation) {
$lesfils = array();
$result = spip_query("SELECT id_rubrique FROM spip_rubriques WHERE id_parent IN ($generation)");
while ($row = spip_fetch_array($result))
$lesfils[] = $row['id_rubrique'];
return join(",",$lesfils);
}
function calcul_branche ($generation) {
if ($generation) {
$branche[] = $generation;
while ($generation = calcul_generation ($generation))
$branche[] = $generation;
return join(",",$branche);
} else
return '0';
}
//
// fonction standard de calcul de la balise #INTRODUCTION
// on peut la surcharger en definissant dans mes_fonctions.php3 :
// function introduction($type,$texte,$descriptif) {...}
//
function calcul_introduction ($type, $texte, $chapo='', $descriptif='') {
if (function_exists("introduction"))
return introduction ($type, $texte, $chapo, $descriptif);
switch ($type) {
case 'articles':
if ($descriptif)
return propre($descriptif);
else if (substr($chapo, 0, 1) == '=') // article virtuel
return '';
else
return PtoBR(propre(supprimer_tags(couper_intro($chapo."\n\n\n".$texte, 500))));
break;
case 'breves':
return PtoBR(propre(supprimer_tags(couper_intro($texte, 300))));
break;
case 'forums':
return PtoBR(propre(supprimer_tags(couper_intro($texte, 600))));
break;
case 'rubriques':
if ($descriptif)
return propre($descriptif);
else
return PtoBR(propre(supprimer_tags(couper_intro($texte, 600))));
break;
}
}
//////////////////////////////////////////////////////////////////////////////
//
// Calcul de la page
//
//////////////////////////////////////////////////////////////////////////////
// fonction appelée par les squelettes (insertion dans le code trop lourde)
function cache_forum($id_a, $id_b, $id_r, $id_f) {
global $fichier_cache, $requetes_cache;
if ((!$id_f) OR $id_a OR $id_b OR $id_r) $id_f = 0;
if (!$id_a) $id_a = 0;
if (!$id_r) $id_r = 0;
if (!$id_b) $id_b = 0;
$valeurs = "$id_a, $id_r, $id_b, $id_f, \'$fichier_cache\'";
if (!$requetes_cache[$valeurs]) {
spip_query("INSERT INTO spip_forum_cache (id_article, id_rubrique, id_breve, id_forum, fichier) VALUES ($valeurs)");
$requetes_cache[$valeurs] = 1;
}
}
// fonction appelée par les squelettes (insertion dans le code trop lourde)
function query_auteurs($larticle)
{
$auteurs = "";
if ($larticle)
{
$query_auteurs = "SELECT auteurs.nom, auteurs.email FROM spip_auteurs AS auteurs, spip_auteurs_articles AS lien WHERE lien.id_article=$larticle AND auteurs.id_auteur=lien.id_auteur";
$result_auteurs = spip_query($query_auteurs);
while($row_auteur = spip_fetch_array($result_auteurs)) {
$nom_auteur = typo($row_auteur["nom"]);
$email_auteur = $row_auteur["email"];
if ($email_auteur) {
$auteurs[] = "
$nom_auteur";
}
else {
$auteurs[] = "$nom_auteur";
}
}
}
return ($auteurs) ? "" : join($auteurs, ", ");
}
//
// Executer un squelette dans un contexte donne
//
function executer_squelette($squelette, $contexte) {
static $fonctions_squelettes = '';
// Si squelette pas deja inclus, l'inclure
if (!$fonctions_squelettes[$squelette]) {
$squelette_cache = 'CACHE/skel_'.rawurlencode($squelette).'.php3';
$use_cache = false;
if (file_exists($squelette_cache)) {
$t = filemtime($squelette_cache);
if ((filemtime("$squelette.html") < $t)
AND (filemtime("inc-calcul-squel.php3") < $t)
AND (!file_exists("mes_fonctions.php3") OR (filemtime("mes_fonctions.php3") < $t))) {
$use_cache = true;
}
}
if ($GLOBALS['recalcul_squelettes'] == 'oui') {
$use_cache = false;
}
// Au besoin, recompiler le squelette
if (!$use_cache) {
include_local ("inc-calcul-squel.php3");
calculer_squelette($squelette, $squelette_cache, $contexte);
}
// L'inclusion du squelette permet de definir les fonctions associees
// aux boucles, et de recuperer le nom de la fonction principale
include($squelette_cache);
// Si le squelette compile est vide, pour une raison inconnue
// (plantage disque lors du calcul precedent), tenter un recalcul
if (!$func_squelette_executer) {
@unlink($squelette_cache);
spip_log ("ERREUR $squelette_cache est vide");
if ($use_cache) {
include_local ("inc-calcul-squel.php3");
calculer_squelette($squelette, $squelette_cache, $contexte);
include($squelette_cache);
}
}
// fin du plantage squelette compile
$fonctions_squelettes[$squelette] = $func_squelette_executer;
if ($GLOBALS['flag_apc']) {
apc_rm($squelette_cache);
}
}
// Executer la fonction principale du squelette
// (i.e. racine de l'arbre d'execution)
$f = $fonctions_squelettes[$squelette];
return $f($contexte);
}
//
// Recherche recursive du squelette
//
function chercher_squelette_hierarchie($fond, $id_rubrique, $dossier='') {
if (!$id_rubrique) {
if (@file_exists("$dossier$fond.html")) {
return "$dossier$fond";
} else if (@file_exists("$fond.html")) {
return "$fond";
} else if (@file_exists("$fond-dist.html")) {
return "$fond-dist";
} else {
// erreur webmaster : $fond ne correspond a rien
include_ecrire ("inc_presentation.php3");
install_debut_html("Erreur sur le site");
echo "
Aucun squelette $dossier$fond n'est disponible...
";
install_fin_html();
spip_log ("ERREUR: aucun squelette $dossier$fond n'est disponible...");
exit;
}
}
else {
if (file_exists("$dossier$fond-$id_rubrique.html")) {
return "$dossier$fond-$id_rubrique";
} else {
$query = "SELECT id_parent FROM spip_rubriques WHERE id_rubrique='$id_rubrique'";
$result = spip_query($query);
while($row = spip_fetch_array($result)) {
$id_parent=$row['id_parent'];
}
return chercher_squelette_hierarchie($fond, $id_parent, $dossier);
}
}
}
function chercher_squelette($fond, $id_rubrique) {
global $dossier_squelettes;
// prendre en compte le bon repertoire (pas grave si on a deux / dans l'arborescence)
$dossier = ($dossier_squelettes ? $dossier_squelettes.'/' : '');
// On selectionne, dans l'ordre :
// fond=10.html, fond-10.html, fond-
.html, fond.html puis fond-dist.html
if (($id_rubrique > 0) AND (file_exists("$dossier$fond=$id_rubrique.html"))) {
return "$dossier$fond=$id_rubrique";
}
else {
return chercher_squelette_hierarchie($fond, $id_rubrique, $dossier); // recursif le long de la hierarchie
}
}
//
// Calculer la page courante
//
function calculer_page($fond, $contexte) {
global $id_doublons;
static $pile_doublons = '';
static $n_doublons = 0;
$pile_doublons[++$n_doublons] = $id_doublons;
$id_doublons = '';
$id_doublons['articles'] = '0';
$id_doublons['rubriques'] = '0';
$id_doublons['breves'] = '0';
$id_doublons['auteurs'] = '0';
$id_doublons['forums'] = '0';
$id_doublons['mots'] = '0';
$id_doublons['groupes_mots'] = '0';
$id_doublons['syndication'] = '0';
$id_doublons['documents'] = '0';
$texte = executer_squelette($fond, $contexte);
$id_doublons = $pile_doublons[$n_doublons--];
return $texte;
}
function calculer_page_globale($fond) {
global $contexte;
global $fichier_requete;
global $id_rubrique_fond;
// Generer le contexte
$contexte = '';
$contexte_defaut = array('id_parent', 'id_rubrique', 'id_article', 'id_auteur',
'id_breve', 'id_forum', 'id_secteur', 'id_syndic', 'id_syndic_article', 'id_mot', 'id_groupe', 'id_document');
reset($contexte_defaut);
while (list(, $val) = each($contexte_defaut)) {
if ($GLOBALS[$val]) {
$contexte[$val] = intval($GLOBALS[$val]);
}
}
if ($GLOBALS['date'])
$contexte['date'] = $contexte['date_redac'] = normaliser_date($GLOBALS['date']);
else
$contexte['date'] = $contexte['date_redac'] = date("Y-m-d H:i:s");
// Analyser les URLs personnalisees (inc-urls-...)
recuperer_parametres_url($fond, $fichier_requete);
$lang = lire_meta('langue_site');
if ($contexte['lang'])
$lang = $contexte['lang']; // si inc-urls veut fixer la langue
// Calcul de la rubrique associee a la requete
// (selection de squelette specifique)
if ($id_rubrique = $contexte['id_rubrique']) {
$id_rubrique_fond = $id_rubrique;
if ($row = spip_fetch_array(spip_query("SELECT lang FROM spip_rubriques WHERE id_rubrique='$id_rubrique'")))
if ($row['lang']) $lang = $row['lang'];
}
else if ($id_breve = $contexte['id_breve']) {
if ($row = spip_fetch_array(spip_query("SELECT id_rubrique FROM spip_breves WHERE id_breve='$id_breve'"))) {
$id_rubrique_fond = $row['id_rubrique'];
if ($row = spip_fetch_array(spip_query("SELECT lang FROM spip_rubriques WHERE id_rubrique='$id_rubrique_fond'")))
if ($row['lang']) $lang = $row['lang'];
}
}
else if ($id_syndic = $contexte['id_syndic']) {
if ($row = spip_fetch_array(spip_query("SELECT id_rubrique FROM spip_syndic WHERE id_syndic='$id_syndic'"))) {
$id_rubrique_fond = $row['id_rubrique'];
if ($row = spip_fetch_array(spip_query("SELECT lang FROM spip_rubriques WHERE id_rubrique='$id_rubrique_fond'")))
if ($row['lang']) $lang = $row['lang'];
}
}
else if ($id_article = $contexte['id_article']) {
if ($row = spip_fetch_array(spip_query("SELECT id_rubrique,lang FROM spip_articles WHERE id_article='$id_article'"))) {
$id_rubrique_fond = $row['id_rubrique'];
if ($row['lang']) $lang = $row['lang'];
}
}
else {
$id_rubrique_fond = 0;
}
$fond = chercher_squelette($fond, $id_rubrique_fond);
// selectionner la langue & affiner le squelette
lang_select($lang);
if (@file_exists("$fond.$lang.html"))
$fond = "$fond.$lang";
// Special stats et boutons admin
reset($contexte_defaut);
while (list($key, $val) = each($contexte_defaut)) {
if ($contexte[$val]) {
$GLOBALS[$val] = $contexte[$val];
$signale_globals .= "\n".'$GLOBALS[\''.$val.'\'] = '.intval($contexte[$val]).";";
}
}
$signale_globals = '<'."?php$signale_globals\n?".'>';
return $signale_globals.calculer_page($fond, $contexte);
}
?>