[ Index ] |
|
Code source de SPIP 1.8.3 |
1 <?php 2 3 /***************************************************************************\ 4 * SPIP, Systeme de publication pour l'internet * 5 * * 6 * Copyright (c) 2001-2005 * 7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * 8 * * 9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * 10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * 11 \***************************************************************************/ 12 13 14 // 15 // Des fonctions diverses utilisees lors du calcul d'une page ; ces fonctions 16 // bien pratiques n'ont guere de logique organisationnelle ; elles sont 17 // appelees par certaines balises au moment du calcul des pages. (Peut-on 18 // trouver un modele de donnees qui les associe physiquement au fichier 19 // definissant leur balise ??? 20 // 21 22 // ON TROUVERA EN QUEUE DE FICHIER LES FONCTIONS FAISANT DES APPELS SQL 23 24 25 // Ce fichier ne sera execute qu'une fois 26 if (defined("_INC_CALCUL_OUTILS")) return; 27 define("_INC_CALCUL_OUTILS", "1"); 28 29 // Pour les documents comme pour les logos, le filtre |fichier donne 30 // le chemin du fichier apres 'IMG/' ; peut-etre pas d'une purete 31 // remarquable, mais a conserver pour compatibilite ascendante. 32 // -> http://www.spip.net/fr_article901.html 33 function calcule_fichier_logo($on) { 34 $r = ereg_replace("^" . _DIR_IMG, "", $on); 35 return $r; 36 } 37 38 // Renvoie le code html pour afficher un logo, avec ou sans survol, lien, etc. 39 40 function affiche_logos($logos, $lien, $align) { 41 42 list ($arton, $artoff) = $logos; 43 44 if (!$arton) return $artoff; 45 46 if ($taille = @getimagesize($arton)) { 47 $taille = " ".$taille[3]; 48 } 49 50 if ($artoff) 51 $mouseover = " onmouseover=\"this.src='$artoff'\" " 52 ."onmouseout=\"this.src='$arton'\""; 53 54 $milieu = "<img src=\"$arton\" alt=\"\"" 55 . ($align ? " align='$align'" : '') 56 . $taille 57 . $mouseover 58 . " style='border-width: 0px;' class='spip_logos' />"; 59 60 return ($lien ? http_href($lien, $milieu) : $milieu); 61 } 62 63 // 64 // Retrouver le logo d'un objet (et son survol) 65 // 66 67 function calcule_logo($type, $onoff, $id, $id_rubrique, $ff) { 68 include_ecrire ('inc_logos.php3'); 69 70 $table_logos = array ( 71 'ARTICLE' => 'art', 72 'AUTEUR' => 'aut', 73 'BREVE' => 'breve', 74 'MOT' => 'mot', 75 'RUBRIQUE' => 'rub', 76 'SITE' => 'site' 77 ); 78 $type = $table_logos[$type]; 79 $nom = strtolower($onoff); 80 # attention au cas $id = '0' pour LOGO_SITE_SPIP : utiliser intval() 81 while (1) { 82 $on = cherche_image_nommee($type . $nom . intval($id)); 83 if ($on) { 84 if ($ff) 85 return (array('', "$on[1].$on[2]")); 86 else { 87 $off = ($onoff != 'ON') ? '' : 88 cherche_image_nommee($type . 'off' . $id); 89 return array ("$on[0]$on[1].$on[2]", 90 ($off ? ("$off[0]$off[1].$off[2]") : '')); 91 } 92 } 93 else if ($id_rubrique) { 94 $type = 'rub'; 95 $id = $id_rubrique; 96 $id_rubrique = 0; 97 } else if ($id AND $type == 'rub') 98 $id = sql_parent($id); 99 else return array('',''); 100 } 101 } 102 103 // 104 // fonction standard de calcul de la balise #INTRODUCTION 105 // on peut la surcharger en definissant dans mes_fonctions.php3 : 106 // function introduction($type,$texte,$chapo,$descriptif) {...} 107 // 108 function calcul_introduction ($type, $texte, $chapo='', $descriptif='') { 109 if (function_exists("introduction")) 110 return introduction ($type, $texte, $chapo, $descriptif); 111 112 switch ($type) { 113 case 'articles': 114 if ($descriptif) 115 return propre($descriptif); 116 else if (substr($chapo, 0, 1) == '=') // article virtuel 117 return ''; 118 else 119 return PtoBR(propre(supprimer_tags(couper_intro($chapo."\n\n\n".$texte, 500)))); 120 break; 121 case 'breves': 122 return PtoBR(propre(supprimer_tags(couper_intro($texte, 300)))); 123 break; 124 case 'forums': 125 return PtoBR(propre(supprimer_tags(couper_intro($texte, 600)))); 126 break; 127 case 'rubriques': 128 if ($descriptif) 129 return propre($descriptif); 130 else 131 return PtoBR(propre(supprimer_tags(couper_intro($texte, 600)))); 132 break; 133 } 134 } 135 136 137 // 138 // Balises dynamiques 139 // 140 141 // elles sont traitees comme des inclusions 142 function synthetiser_balise_dynamique($nom, $args, $file, $lang, $ligne) { 143 return 144 ('<'.'?php 145 include_ecrire(\'inc_lang.php3\'); 146 lang_select("'.$lang.'"); 147 include_local("' 148 . $file 149 . '"); 150 inclure_balise_dynamique(balise_' 151 . $nom 152 . '_dyn(\'' 153 . join("', '", array_map('texte_script', $args)) 154 . "'),1, $ligne); 155 lang_dselect(); 156 ?" 157 .">"); 158 } 159 160 // verifier leurs arguments et filtres, et calculer le code a inclure 161 function executer_balise_dynamique($nom, $args, $filtres, $lang, $ligne) { 162 if ($file = find_in_path('inc-' . strtolower($nom) . _EXTENSION_PHP)) 163 include_local($file); 164 else 165 die ("pas de balise dynamique pour #". strtolower($nom)." !"); 166 167 // Y a-t-il une fonction de traitement filtres-arguments ? 168 $f = 'balise_' . $nom . '_stat'; 169 if (function_exists($f)) 170 $r = $f($args, $filtres); 171 else 172 $r = $args; 173 if (!is_array($r)) 174 return $r; 175 else 176 return synthetiser_balise_dynamique($nom, $r, $file, $lang, $ligne); 177 } 178 179 180 // 181 // FONCTIONS FAISANT DES APPELS SQL 182 // 183 184 # NB : a l'exception des fonctions pour les balises dynamiques 185 186 function calcul_exposer ($id, $type, $reference) { 187 static $exposer; 188 static $ref_precedente; 189 190 // Que faut-il exposer ? Tous les elements de $reference 191 // ainsi que leur hierarchie ; on ne fait donc ce calcul 192 // qu'une fois (par squelette) et on conserve le resultat 193 // en static. 194 if ($reference<>$ref_precedente) { 195 $ref_precedente = $reference; 196 197 $exposer = array(); 198 foreach ($reference as $element=>$id_element) { 199 if ($element == 'id_secteur') $element = 'id_rubrique'; 200 if ($x = table_from_primary($element)) { 201 list($table,$hierarchie) = $x; 202 $exposer[$element][$id_element] = true; 203 if ($hierarchie) { 204 list ($id_rubrique) = spip_abstract_fetsel( 205 array('id_rubrique'), 206 array($table), 207 array("$element=$id_element")); 208 $hierarchie = substr(calculer_hierarchie($id_rubrique), 2); 209 foreach (split(',',$hierarchie) as $id_rubrique) 210 $exposer['id_rubrique'][$id_rubrique] = true; 211 } 212 } 213 } 214 } 215 216 // And the winner is... 217 return $exposer[$type][$id]; 218 } 219 220 function table_from_primary($id) { 221 global $tables_principales; 222 include_ecrire ('inc_serialbase.php3'); 223 foreach ($tables_principales as $k => $v) { 224 if ($v['key']['PRIMARY KEY'] == $id) 225 return array($k, array_key_exists('id_rubrique', $v['field'])); 226 } 227 return ''; 228 } 229 230 function calcul_generation ($generation) { 231 $lesfils = array(); 232 $result = spip_abstract_select(array('id_rubrique'), 233 array('spip_rubriques AS rubriques'), 234 array(calcul_mysql_in('id_parent', 235 $generation, 236 ''))); 237 while ($row = spip_abstract_fetch($result)) 238 $lesfils[] = $row['id_rubrique']; 239 return join(",",$lesfils); 240 } 241 242 function calcul_branche ($generation) { 243 if (!$generation) 244 return '0'; 245 else { 246 $branche[] = $generation; 247 while ($generation = calcul_generation ($generation)) 248 $branche[] = $generation; 249 return join(",",$branche); 250 } 251 } 252 253 // fonction appelee par la balise #LOGO_DOCUMENT 254 function calcule_logo_document($id_document, $doubdoc, &$doublons, $flag_fichier, $lien, $align, $params) { 255 if (!$id_document) return ''; 256 if ($doubdoc) $doublons["documents"] .= ','.$id_document; 257 258 if (!($row = spip_abstract_select(array('id_type', 'id_vignette', 'fichier', 'mode'), array('spip_documents AS documents'), array("id_document = $id_document")))) 259 // pas de document. Ne devrait pas arriver 260 return ''; 261 262 list($id_type, $id_vignette, $fichier, $mode) = spip_abstract_fetch($row); 263 264 // Lien par defaut = l'adresse du document 265 ## if (!$lien) $lien = $fichier; 266 267 // Y a t il une vignette personnalisee ? 268 if ($id_vignette) { 269 if ($res = spip_abstract_select(array('fichier'), 270 array('spip_documents AS documents'), 271 array("id_document = $id_vignette"))) { 272 list($vignette) = spip_abstract_fetch($res); 273 if (@file_exists($vignette)) 274 $logo = generer_url_document($id_vignette); 275 } 276 } else if ($mode == 'vignette') { 277 $logo = generer_url_document($id_document); 278 if (!@file_exists($logo)) 279 $logo = ''; 280 } 281 282 // taille maximum [(#LOGO_DOCUMENT{300,52})] 283 list($x,$y) = split(',', ereg_replace("[}{]", "", $params)); 284 285 286 if ($logo AND @file_exists($logo)) { 287 if ($x OR $y) 288 $logo = reduire_image($logo, $x, $y); 289 else { 290 $size = @getimagesize($logo); 291 $logo = "<img src='$logo' ".$size[3]." />"; 292 } 293 } 294 else { 295 // Retrouver l'extension 296 list($extension) = 297 spip_abstract_fetch(spip_abstract_select(array('extension'), 298 array('spip_types_documents AS documents'), 299 array("id_type = " . intval($id_type)))); 300 if (!$extension) $extension = 'txt'; 301 302 // Pas de vignette, mais un fichier image -- creer la vignette 303 if (strstr(lire_meta('formats_graphiques'), $extension)) { 304 if ($img = copie_locale($fichier) 305 AND @file_exists($img)) { 306 if (!$x AND !$y) { 307 $logo = reduire_image($img); 308 } else { 309 # eviter une double reduction 310 $size = @getimagesize($img); 311 $logo = "<img src='$img' ".$size[3]." />"; 312 } 313 } 314 } 315 316 // Document sans vignette ni image : vignette par defaut 317 if (!$logo) { 318 $img = vignette_par_defaut($extension, false); 319 $size = @getimagesize($img); 320 $logo = "<img src='$img' ".$size[3]." />"; 321 } 322 } 323 324 // Reduire si une taille precise est demandee 325 if ($x OR $y) 326 $logo = reduire_image($logo, $x, $y); 327 328 // flag_fichier : seul le fichier est demande 329 if ($flag_fichier) 330 # supprimer le IMG/ 331 return calcule_fichier_logo(extraire_attribut($logo, 'src')); 332 333 334 // Calculer le code html complet (cf. calcule_logo) 335 $logo = inserer_attribut($logo, 'alt', ''); 336 $logo = inserer_attribut($logo, 'style', 'border-width: 0px;'); 337 $logo = inserer_attribut($logo, 'class', 'spip_logos'); 338 if ($align) 339 $logo = inserer_attribut($logo, 'align', $align); 340 341 if ($lien) 342 $logo = "<a href='$lien'>$logo</a>"; 343 344 return $logo; 345 } 346 347 348 // fonction appelee par la balise #EMBED 349 function calcule_embed_document($id_document, $filtres, &$doublons, $doubdoc) { 350 if ($doubdoc && $id_document) $doublons["documents"] .= ', ' . $id_document; 351 return embed_document($id_document, $filtres, false); 352 } 353 354 // les balises dynamiques et EMBED ont des filtres sans arguments 355 // car en fait ce sont des arguments pas des filtres. 356 // Si le besoin s'en fait sentir, il faudra récuperer la 2e moitie du tableau 357 358 function argumenter_balise($fonctions, $sep) { 359 $res = array(); 360 if ($fonctions) 361 foreach ($fonctions as $f) $res[] = 362 str_replace('\'', '\\\'', str_replace('\\', '\\\\',$f[0])); 363 return ("'" . join($sep, $res) . "'"); 364 } 365 366 // fonction appelee par la balise #NOTES 367 function calculer_notes() { 368 $r = $GLOBALS["les_notes"]; 369 $GLOBALS["les_notes"] = ""; 370 $GLOBALS["compt_note"] = 0; 371 $GLOBALS["marqueur_notes"] ++; 372 return $r; 373 } 374 375 # retourne la profondeur d'une rubrique 376 377 function sql_profondeur($id) { 378 $n = 0; 379 while ($id) { 380 $n++; 381 $id = sql_parent($id); 382 } 383 return $n; 384 } 385 386 387 function sql_parent($id_rubrique) { 388 $row = spip_abstract_fetsel(array(id_parent), 389 array('spip_rubriques'), 390 array("id_rubrique=" . intval($id_rubrique))); 391 return $row['id_parent']; 392 } 393 394 function sql_rubrique($id_article) { 395 $row = spip_abstract_fetsel(array('id_rubrique'), 396 array('spip_articles'), 397 array("id_article=" . intval($id_article))); 398 return $row['id_rubrique']; 399 } 400 401 function sql_auteurs($id_article, $table, $id_boucle, $serveur='') { 402 $auteurs = ""; 403 if ($id_article) { 404 $result_auteurs = spip_abstract_select(array('auteurs.nom', 'auteurs.email'), 405 array('spip_auteurs AS auteurs', 406 'spip_auteurs_articles AS lien'), 407 array("lien.id_article=$id_article", 408 "auteurs.id_auteur=lien.id_auteur"), 409 '',array(),'','',1, 410 $table, $id_boucle, $serveur); 411 412 while($row_auteur = spip_abstract_fetch($result_auteurs, $serveur)) { 413 $nom_auteur = typo($row_auteur["nom"]); 414 $email_auteur = $row_auteur["email"]; 415 if ($email_auteur) { 416 $auteurs[] = "<a href=\"mailto:$email_auteur\">$nom_auteur</a>"; 417 } else { 418 $auteurs[] = "$nom_auteur"; 419 } 420 } 421 } 422 return (!$auteurs) ? "" : join($auteurs, ", "); 423 } 424 425 function sql_petitions($id_article, $table, $id_boucle, $serveur, &$Cache) { 426 $retour = spip_abstract_fetsel( 427 array('texte'), 428 array('spip_petitions'), 429 array("id_article=".intval($id_article)), 430 '',array(),'','',1, 431 $table, $id_boucle, $serveur); 432 433 if (!$retour) return ''; 434 # cette page est invalidee par toute petition 435 $Cache['varia']['pet'.$id_article] = 1; 436 # ne pas retourner '' car le texte sert aussi de presence 437 return ($retour['texte'] ? $retour['texte'] : ' '); 438 } 439 440 # retourne le chapeau d'un article, et seulement s'il est publie 441 442 function sql_chapo($id_article) { 443 if ($id_article) 444 return spip_abstract_fetsel(array('chapo'), 445 array('spip_articles'), 446 array("id_article=".intval($id_article), 447 "statut='publie'")); 448 } 449 450 # retourne le champ 'accepter_forum' d'un article 451 function sql_accepter_forum($id_article) { 452 static $cache = array(); 453 454 if (!$id_article) return; 455 456 if (!isset($cache[$id_article])) { 457 $row = spip_abstract_fetsel(array('accepter_forum'), 458 array('spip_articles'), 459 array("id_article=".intval($id_article))); 460 $cache[$id_article] = $row['accepter_forum']; 461 } 462 463 return $cache[$id_article]; 464 } 465 466 467 // Calcul de la rubrique associee a la requete 468 // (selection de squelette specifique par id_rubrique & lang) 469 470 function sql_rubrique_fond($contexte) { 471 472 if ($id = intval($contexte['id_rubrique'])) { 473 $row = spip_abstract_fetsel(array('lang'), 474 array('spip_rubriques'), 475 array("id_rubrique=$id")); 476 if ($row['lang']) 477 $lang = $row['lang']; 478 return array ($id, $lang); 479 } 480 481 if ($id = intval($contexte['id_breve'])) { 482 $row = spip_abstract_fetsel(array('id_rubrique', 'lang'), 483 array('spip_breves'), 484 array("id_breve=$id")); 485 $id_rubrique_fond = $row['id_rubrique']; 486 if ($row['lang']) 487 $lang = $row['lang']; 488 return array($id_rubrique_fond, $lang); 489 } 490 491 if ($id = intval($contexte['id_syndic'])) { 492 $row = spip_abstract_fetsel(array('id_rubrique'), 493 array('spip_syndic'), 494 array("id_syndic=$id")); 495 $id_rubrique_fond = $row['id_rubrique']; 496 $row = spip_abstract_fetsel(array('lang'), 497 array('spip_rubriques'), 498 array("id_rubrique='$id_rubrique_fond'")); 499 if ($row['lang']) 500 $lang = $row['lang']; 501 return array($id_rubrique_fond, $lang); 502 } 503 504 if ($id = intval($contexte['id_article'])) { 505 $row = spip_abstract_fetsel(array('id_rubrique', 'lang'), 506 array('spip_articles'), 507 array("id_article=$id")); 508 $id_rubrique_fond = $row['id_rubrique']; 509 if ($row['lang']) 510 $lang = $row['lang']; 511 return array($id_rubrique_fond, $lang); 512 } 513 } 514 515 // Ajouter "&lang=..." si la langue de base n'est pas celle du site 516 function lang_parametres_forum($s) { 517 518 // ne pas se fatiguer si le site est unilingue (plus rapide) 519 if (strstr(lire_meta('langues_utilisees'), ',') 520 // chercher l'identifiant qui nous donnera la langue 521 AND preg_match(',id_(article|breve|rubrique|syndic)=([0-9]+),', $s, $r)){ 522 $objet = $r[1]; 523 $id = $r[2]; 524 list($lang) = spip_fetch_array(spip_query( 525 "SELECT lang FROM spip_$objet}s WHERE id_$objet=$id" 526 )); 527 // Si ce n'est pas la meme que celle du site, l'ajouter aux parametres 528 if ($lang AND $lang <> lire_meta('langue_site')) 529 $s .= "&lang=$lang"; 530 } 531 532 return $s; 533 } 534 535 ?>
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
Généré le : Thu Feb 22 22:27:47 2007 | par Balluche grâce à PHPXref 0.7 |