[ 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 // Ce fichier regroupe la quasi totalite des definitions de #BALISES de spip 16 // Pour chaque balise, il est possible de surcharger, dans mes_fonctions.php3, 17 // la fonction balise_TOTO_dist par une fonction balise_TOTO() respectant la 18 // meme API : 19 // elle recoit en entree un objet de classe CHAMP, le modifie et le retourne. 20 // Cette classe est definie dans inc-compilo-index.php3 21 // 22 23 // Ce fichier ne sera execute qu'une fois 24 if (defined("_INC_BALISES")) return; 25 define("_INC_BALISES", "1"); 26 27 28 // 29 // Traitements standard de divers champs 30 // 31 function champs_traitements ($p) { 32 static $traitements = array ( 33 'BIO' => 'traiter_raccourcis(%s)', 34 'CHAPO' => 'traiter_raccourcis(nettoyer_chapo(%s))', 35 'DATE' => 'vider_date(%s)', 36 'DATE_MODIF' => 'vider_date(%s)', 37 'DATE_NOUVEAUTES' => 'vider_date(%s)', 38 'DATE_REDAC' => 'vider_date(%s)', 39 'DESCRIPTIF' => 'traiter_raccourcis(%s)', 40 'LIEN_TITRE' => 'typo(%s)', 41 'LIEN_URL' => 'htmlspecialchars(vider_url(%s))', 42 'MESSAGE' => 'traiter_raccourcis(%s)', 43 'NOM_SITE_SPIP' => 'typo(%s)', 44 'NOM_SITE' => 'typo(%s)', 45 'NOM' => 'typo(%s)', 46 'PARAMETRES_FORUM' => 'htmlspecialchars(lang_parametres_forum(%s))', 47 'PS' => 'traiter_raccourcis(%s)', 48 'SOUSTITRE' => 'typo(%s)', 49 'SURTITRE' => 'typo(%s)', 50 'TEXTE' => 'traiter_raccourcis(%s)', 51 'TITRE' => 'typo(%s)', 52 'TYPE' => 'typo(%s)', 53 'URL_ARTICLE' => 'htmlspecialchars(vider_url(%s))', 54 'URL_BREVE' => 'htmlspecialchars(vider_url(%s))', 55 'URL_DOCUMENT' => 'htmlspecialchars(vider_url(%s))', 56 'URL_FORUM' => 'htmlspecialchars(vider_url(%s))', 57 'URL_MOT' => 'htmlspecialchars(vider_url(%s))', 58 'URL_RUBRIQUE' => 'htmlspecialchars(vider_url(%s))', 59 'URL_SITE_SPIP' => 'htmlspecialchars(vider_url(%s))', 60 'URL_SITE' => 'htmlspecialchars(vider_url(%s))', 61 'URL_SYNDIC' => 'htmlspecialchars(vider_url(%s))', 62 'ENV' => 'entites_html(%s)' 63 ); 64 $ps = $traitements[$p->nom_champ]; 65 if (!$ps) return $p->code; 66 if ($p->descr['documents']) { 67 $ps = str_replace('traiter_raccourcis(', 68 'traiter_raccourcis_doublon($doublons,', 69 str_replace('typo(', 'typo_doublon($doublons,', $ps)); 70 } 71 72 // Passer |safehtml sur les boucles "sensibles" 73 // sauf sur les champs dont on est surs 74 switch ($p->type_requete) { 75 case 'forums': 76 case 'signatures': 77 case 'syndic_articles': 78 $champs_surs = array( 79 'date', 'date_heure', 'statut', 'ip', 'url_article', 'maj', 'idx', 80 'parametres_forum'); 81 if (!in_array(strtolower($p->nom_champ), $champs_surs) 82 AND !preg_match(',^ID_,', $p->nom_champ)) 83 $ps = 'safehtml('.$ps.')'; 84 break; 85 default: 86 break; 87 } 88 89 // on supprime les < IMGnnn > tant qu'on ne rapatrie pas 90 // les documents distants joints.. 91 // il faudrait aussi corriger les raccourcis d'URL locales 92 return str_replace('%s', 93 (!$p->boucles[$p->id_boucle]->sql_serveur ? 94 $p->code : 95 ('supprime_img(' . $p->code . ')')), 96 $ps); 97 } 98 99 // il faudrait savoir traiter les formulaires en local 100 // tout en appelant le serveur SQL distant. 101 // En attendant, cette fonction permet de refuser une authentification 102 // sur qqch qui n'a rien a voir. 103 104 function balise_distante_interdite($p) { 105 $nom = $p->id_boucle; 106 if ($p->boucles[$nom]->sql_serveur) { 107 erreur_squelette($p->nom_champ .' '._T('zbug_distant_interdit'), $nom); 108 } 109 } 110 111 // 112 // Definition des balises 113 // 114 function balise_NOM_SITE_SPIP_dist($p) { 115 $p->code = "lire_meta('nom_site')"; 116 $p->statut = 'html'; 117 return $p; 118 } 119 120 function balise_EMAIL_WEBMASTER_dist($p) { 121 $p->code = "lire_meta('email_webmaster')"; 122 $p->statut = 'html'; 123 return $p; 124 } 125 126 function balise_CHARSET_dist($p) { 127 $p->code = "lire_meta('charset')"; 128 $p->statut = 'html'; 129 return $p; 130 } 131 132 function balise_LANG_LEFT_dist($p) { 133 $_lang = champ_sql('lang', $p); 134 $p->code = "lang_dir(($_lang ? $_lang : \$GLOBALS['spip_lang']),'left','right')"; 135 $p->statut = 'php'; 136 return $p; 137 } 138 139 function balise_LANG_RIGHT_dist($p) { 140 $_lang = champ_sql('lang', $p); 141 $p->code = "lang_dir(($_lang ? $_lang : \$GLOBALS['spip_lang']),'right','left')"; 142 $p->statut = 'php'; 143 return $p; 144 } 145 146 function balise_LANG_DIR_dist($p) { 147 $_lang = champ_sql('lang', $p); 148 $p->code = "lang_dir(($_lang ? $_lang : \$GLOBALS['spip_lang']),'ltr','rtl')"; 149 $p->statut = 'php'; 150 return $p; 151 } 152 153 function balise_PUCE_dist($p) { 154 $_lang = champ_sql('lang', $p); 155 $p->code = "((lang_dir(($_lang ? $_lang : \$GLOBALS['spip_lang']),false,true) && \$GLOBALS['puce_rtl']) ? \$GLOBALS['puce_rtl'] : \$GLOBALS['puce'])"; 156 $p->statut = 'php'; 157 return $p; 158 } 159 160 // #DATE 161 // Cette fonction sait aller chercher dans le contexte general 162 // quand #DATE est en dehors des boucles 163 // http://www.spip.net/fr_article1971.html 164 function balise_DATE_dist ($p) { 165 $_date = champ_sql('date', $p); 166 $p->code = "$_date"; 167 $p->statut = 'php'; 168 return $p; 169 } 170 171 // #DATE_REDAC 172 // http://www.spip.net/fr_article1971.html 173 function balise_DATE_REDAC_dist ($p) { 174 $_date = champ_sql('date_redac', $p); 175 $p->code = "$_date"; 176 $p->statut = 'php'; 177 return $p; 178 } 179 180 // #DATE_MODIF 181 // http://www.spip.net/fr_article1971.html 182 function balise_DATE_MODIF_dist ($p) { 183 $_date = champ_sql('date_modif', $p); 184 $p->code = "$_date"; 185 $p->statut = 'php'; 186 return $p; 187 } 188 189 // #DATE_NOUVEAUTES 190 // http://www.spip.net/fr_article1971.html 191 function balise_DATE_NOUVEAUTES_dist($p) { 192 $p->code = "((lire_meta('quoi_de_neuf') == 'oui' 193 AND @file_exists(_DIR_SESSIONS . 'mail.lock')) ? 194 normaliser_date(@filemtime(_DIR_SESSIONS . 'mail.lock')) : 195 \"'0000-00-00'\")"; 196 $p->statut = 'php'; 197 return $p; 198 } 199 200 function balise_DOSSIER_SQUELETTE_dist($p) { 201 $p->code = "'" . addslashes(dirname($p->descr['sourcefile'])) . "'" ; 202 $p->statut = 'html'; 203 return $p; 204 } 205 206 function balise_URL_SITE_SPIP_dist($p) { 207 $p->code = "lire_meta('adresse_site')"; 208 $p->statut = 'html'; 209 return $p; 210 } 211 212 213 function balise_URL_ARTICLE_dist($p) { 214 $_type = $p->type_requete; 215 216 // Cas particulier des boucles (SYNDIC_ARTICLES) 217 if ($_type == 'syndic_articles') { 218 $p->code = champ_sql('url', $p); 219 } 220 221 // Cas general : chercher un id_article dans la pile 222 else { 223 $_id_article = champ_sql('id_article', $p); 224 $p->code = "generer_url_article($_id_article)"; 225 226 if ($p->boucles[$p->nom_boucle ? $p->nom_boucle : $p->id_boucle]->hash) 227 $p->code = "url_var_recherche(" . $p->code . ")"; 228 } 229 230 $p->statut = 'php'; 231 return $p; 232 } 233 234 function balise_URL_RUBRIQUE_dist($p) { 235 $p->code = "generer_url_rubrique(" . 236 champ_sql('id_rubrique',$p) . 237 ")" ; 238 if ($p->boucles[$p->nom_boucle ? $p->nom_boucle : $p->id_boucle]->hash) 239 $p->code = "url_var_recherche(" . $p->code . ")"; 240 241 $p->statut = 'php'; 242 return $p; 243 } 244 245 function balise_URL_BREVE_dist($p) { 246 $p->code = "generer_url_breve(" . 247 champ_sql('id_breve',$p) . 248 ")"; 249 if ($p->boucles[$p->nom_boucle ? $p->nom_boucle : $p->id_boucle]->hash) 250 $p->code = "url_var_recherche(" . $p->code . ")"; 251 252 $p->statut = 'php'; 253 return $p; 254 } 255 256 function balise_URL_MOT_dist($p) { 257 $p->code = "generer_url_mot(" . 258 champ_sql('id_mot',$p) . 259 ")"; 260 261 if ($p->boucles[$p->nom_boucle ? $p->nom_boucle : $p->id_boucle]->hash) 262 $p->code = "url_var_recherche(" . $p->code . ")"; 263 264 $p->statut = 'php'; 265 return $p; 266 } 267 268 # remarque : URL_SITE ne figure pas ici car c'est une donnee 'brute' 269 # correspondant a l'URL du site reference ; URL_SYNDIC correspond 270 # pour sa part a l'adresse de son backend. 271 # Il n'existe pas de balise pour afficher generer_url_site($id_syndic), 272 # a part [(#ID_SYNDIC|generer_url_site)] 273 274 function balise_URL_FORUM_dist($p) { 275 $p->code = "generer_url_forum(" . 276 champ_sql('id_forum',$p) .")"; 277 278 if ($p->boucles[$p->nom_boucle ? $p->nom_boucle : $p->id_boucle]->hash) 279 $p->code = "url_var_recherche(" . $p->code . ")"; 280 281 $p->statut = 'php'; 282 return $p; 283 } 284 285 function balise_URL_DOCUMENT_dist($p) { 286 $p->code = "generer_url_document(" . 287 champ_sql('id_document',$p) . ")"; 288 289 $p->statut = 'php'; 290 return $p; 291 } 292 293 function balise_URL_AUTEUR_dist($p) { 294 $p->code = "generer_url_auteur(" . 295 champ_sql('id_auteur',$p) .")"; 296 if ($p->boucles[$p->nom_boucle ? $p->nom_boucle : $p->id_boucle]->hash) 297 $p->code = "url_var_recherche(" . $p->code . ")"; 298 299 $p->statut = 'php'; 300 return $p; 301 } 302 303 function balise_NOTES_dist($p) { 304 // Recuperer les notes 305 $p->code = 'calculer_notes()'; 306 $p->statut = 'html'; 307 return $p; 308 } 309 310 // Qu'afficher en cas d'erreur 404 ? 311 function balise_ERREUR_AUCUN_dist($p) { 312 $p->code = '$Pile[0]["erreur_aucun"]'; 313 $p->statut = 'html'; 314 return $p; 315 } 316 317 function balise_RECHERCHE_dist($p) { 318 $p->code = 'htmlspecialchars($GLOBALS["recherche"])'; 319 $p->statut = 'php'; 320 return $p; 321 } 322 323 function balise_COMPTEUR_BOUCLE_dist($p) { 324 $b = $p->nom_boucle ? $p->nom_boucle : $p->descr['id_mere']; 325 if ($b === '') { 326 erreur_squelette( 327 _T('zbug_champ_hors_boucle', 328 array('champ' => '#COMPTEUR_BOUCLE') 329 ), $p->id_boucle); 330 $p->code = "''"; 331 } else { 332 $p->code = "\$Numrows['$b']['compteur_boucle']"; 333 $p->statut = 'php'; 334 return $p; 335 } 336 } 337 338 function balise_TOTAL_BOUCLE_dist($p) { 339 $b = $p->nom_boucle ? $p->nom_boucle : $p->descr['id_mere']; 340 if ($b === '') { 341 erreur_squelette( 342 _T('zbug_champ_hors_boucle', 343 array('champ' => '#TOTAL_BOUCLE') 344 ), $p->id_boucle); 345 $p->code = "''"; 346 } else { 347 $p->code = "\$Numrows['$b']['total']"; 348 $p->boucles[$b]->numrows = true; 349 $p->statut = 'php'; 350 } 351 return $p; 352 } 353 354 function balise_POINTS_dist($p) { 355 return rindex_pile($p, 'points', 'recherche'); 356 } 357 358 function balise_POPULARITE_ABSOLUE_dist($p) { 359 $p->code = 'ceil(' . 360 champ_sql('popularite', $p) . 361 ')'; 362 $p->statut = 'php'; 363 return $p; 364 } 365 366 function balise_POPULARITE_SITE_dist($p) { 367 $p->code = 'ceil(lire_meta(\'popularite_total\'))'; 368 $p->statut = 'php'; 369 return $p; 370 } 371 372 function balise_POPULARITE_MAX_dist($p) { 373 $p->code = 'ceil(lire_meta(\'popularite_max\'))'; 374 $p->statut = 'php'; 375 return $p; 376 } 377 378 function balise_EXPOSE_dist($p) { 379 $on = "'on'"; 380 $off= "''"; 381 382 if ($p->param && !$p->param[0][0]) { 383 $on = calculer_liste($p->param[0][1], 384 $p->descr, 385 $p->boucles, 386 $p->id_boucle); 387 388 $off = calculer_liste($p->param[0][2], 389 $p->descr, 390 $p->boucles, 391 $p->id_boucle); 392 393 // autres filtres 394 array_shift($p->param); 395 } 396 return calculer_balise_expose($p, $on, $off); 397 } 398 399 // obsolete. utiliser la precedente 400 401 function balise_EXPOSER_dist($p) 402 { 403 $on = "'on'"; 404 $off= "''"; 405 if ($a = ($p->fonctions)) { 406 // Gerer la notation [(#EXPOSER|on,off)] 407 $onoff = array_shift($a); 408 ereg("([^,]*)(,(.*))?", $onoff[0], $regs); 409 $on = "'" . addslashes($regs[1]) . "'"; 410 $off = "'" . addslashes($regs[3]) . "'" ; 411 // autres filtres 412 array_shift($p->param); 413 } 414 return calculer_balise_expose($p, $on, $off); 415 } 416 417 function calculer_balise_expose($p, $on, $off) 418 { 419 global $table_primary; 420 $type_boucle = $p->type_requete; 421 $primary_key = $table_primary[$type_boucle]; 422 if (!$primary_key) { 423 erreur_squelette(_T('zbug_champ_hors_boucle', 424 array('champ' => '#EXPOSER') 425 ), $p->id_boucle); 426 427 } 428 429 $p->code = '(calcul_exposer(' 430 .champ_sql($primary_key, $p) 431 .", '$primary_key', \$Pile[0]) ? $on : $off)"; 432 $p->statut = 'php'; 433 return $p; 434 } 435 436 // 437 // Inserer directement un document dans le squelette 438 // 439 function balise_EMBED_DOCUMENT_dist($p) { 440 balise_distante_interdite($p); 441 $_id_document = champ_sql('id_document',$p); 442 $p->code = "calcule_embed_document(intval($_id_document), " . 443 argumenter_balise($p->fonctions, "|") . 444 ", \$doublons, '" . $p->descr['documents'] . "')"; 445 $p->param = array(); 446 $p->statut = 'html'; 447 return $p; 448 } 449 450 // Debut et fin de surlignage auto des mots de la recherche 451 // on insere une balise Span avec une classe sans spec: 452 // c'est transparent s'il n'y a pas de recherche, 453 // sinon elles seront remplacees par les fontions de inc_surligne 454 455 function balise_DEBUT_SURLIGNE_dist($p) { 456 include_ecrire('inc_surligne.php3'); 457 $p->code = "'<" . MARQUEUR_SURLIGNE . "'"; 458 return $p; 459 } 460 function balise_FIN_SURLIGNE_dist($p) { 461 include_ecrire('inc_surligne.php3'); 462 $p->code = "'<" . MARQUEUR_FSURLIGNE . "'"; 463 return $p; 464 } 465 466 467 // #SPIP_CRON 468 // a documenter 469 // insere un <div> avec un lien background-image vers les taches de fond. 470 // Si cette balise est presente sur la page de sommaire, le site ne devrait 471 // quasiment jamais se trouver ralenti par des taches de fond un peu lentes 472 // ATTENTION: cette balise efface parfois les boutons admin implicites 473 function balise_SPIP_CRON_dist ($p) { 474 $p->code = "'<div style=\\'position: absolute; background-image: url(\"spip_background.php3\"); height: 1px; width: 1px;\\'></div>'"; 475 $p->statut='php'; 476 return $p; 477 } 478 479 480 // #INTRODUCTION 481 // http://www.spip.net/@introduction 482 function balise_INTRODUCTION_dist ($p) { 483 $_type = $p->type_requete; 484 $_texte = champ_sql('texte', $p); 485 $_chapo = champ_sql('chapo', $p); 486 $_descriptif = champ_sql('descriptif', $p); 487 $p->code = "calcul_introduction('$_type', $_texte, $_chapo, $_descriptif)"; 488 489 $p->statut = 'html'; 490 return $p; 491 } 492 493 494 // #LANG 495 // non documente ? 496 function balise_LANG_dist ($p) { 497 $_lang = champ_sql('lang', $p); 498 $p->code = "($_lang ? $_lang : \$GLOBALS['spip_lang'])"; 499 $p->code = 'htmlentities'.$p->code; 500 $p->statut = 'php'; 501 return $p; 502 } 503 504 505 // #LESAUTEURS 506 // les auteurs d'un article (ou d'un article syndique) 507 // http://www.spip.net/fr_article902.html 508 // http://www.spip.net/fr_article911.html 509 function balise_LESAUTEURS_dist ($p) { 510 // Cherche le champ 'lesauteurs' dans la pile 511 $_lesauteurs = champ_sql('lesauteurs', $p); 512 513 // Si le champ n'existe pas (cas de spip_articles), on donne la 514 // construction speciale sql_auteurs(id_article) ; 515 // dans le cas contraire on prend le champ 'les_auteurs' (cas de 516 // spip_syndic_articles) 517 if ($_lesauteurs AND $_lesauteurs != '$Pile[0][\'lesauteurs\']') { 518 $p->code = $_lesauteurs; 519 } else { 520 $nom = $p->id_boucle; 521 # On pourrait mieux faire qu'utiliser cette fonction assistante ? 522 $p->code = "sql_auteurs(" . 523 champ_sql('id_article', $p) . 524 ",'" . 525 $nom . 526 "','" . 527 $p->boucles[$nom]->type_requete . 528 "','" . 529 $p->boucles[$nom]->sql_serveur . 530 "')"; 531 } 532 533 $p->statut = 'html'; 534 return $p; 535 } 536 537 538 // #PETITION 539 // retourne '' si l'article courant n'a pas de petition 540 // le texte de celle-ci sinon (et ' ' si il est vide) 541 // cf FORMULAIRE_PETITION 542 543 function balise_PETITION_dist ($p) { 544 $nom = $p->id_boucle; 545 $p->code = "sql_petitions(" . 546 champ_sql('id_article', $p) . 547 ",'" . 548 $p->boucles[$nom]->type_requete . 549 "','" . 550 $nom . 551 "','" . 552 $p->boucles[$nom]->sql_serveur . 553 "', \$Cache)"; 554 $p->statut = 'php'; 555 return $p; 556 } 557 558 559 // #POPULARITE 560 // http://www.spip.net/fr_article1846.html 561 function balise_POPULARITE_dist ($p) { 562 $_popularite = champ_sql('popularite', $p); 563 $p->code = "(ceil(min(100, 100 * $_popularite 564 / max(1 , 0 + lire_meta('popularite_max')))))"; 565 $p->statut = 'php'; 566 return $p; 567 } 568 569 570 // 571 // Fonction commune aux balises #LOGO_XXXX 572 // (les balises portant ce type de nom sont traitees en bloc ici) 573 // 574 function calculer_balise_logo ($p) { 575 576 eregi("^LOGO_([A-Z]+)(_.*)?$", $p->nom_champ, $regs); 577 $type_objet = $regs[1]; 578 $suite_logo = $regs[2]; 579 if (ereg("^_SPIP(.*)$", $suite_logo, $regs)) { 580 $type_objet = 'RUBRIQUE'; 581 $suite_logo = $regs[1]; 582 $_id_objet = "\"'0'\""; 583 } else { 584 585 if ($type_objet == 'SITE') 586 $_id_objet = champ_sql("id_syndic", $p); 587 else 588 $_id_objet = champ_sql("id_".strtolower($type_objet), $p); 589 } 590 // analyser les faux filtres, 591 // supprimer ceux qui ont le tort d'etre vrais 592 $flag_fichier = 0; 593 $filtres = ''; 594 if (is_array($p->fonctions)) { 595 foreach($p->fonctions as $couple) { 596 // eliminer les faux filtres 597 if (!$flag_stop) { 598 array_shift($p->param); 599 $nom = $couple[0]; 600 if (ereg('^(left|right|center|top|bottom)$', $nom)) 601 $align = $nom; 602 else if ($nom == 'lien') { 603 $flag_lien_auto = 'oui'; 604 $flag_stop = true; 605 } 606 else if ($nom == 'fichier') { 607 $flag_fichier = 1; 608 $flag_stop = true; 609 } 610 // double || signifie "on passe aux filtres" 611 else if ($nom == '') { 612 if (!$params = $couple[1]) 613 $flag_stop = true; 614 } 615 else if ($nom) { 616 $lien = $nom; 617 $flag_stop = true; 618 } else { 619 620 } 621 } 622 // apres un URL ou || ou |fichier ce sont 623 // des filtres (sauf left...lien...fichier) 624 } 625 } 626 627 // 628 // Preparer le code du lien 629 // 630 // 1. filtre |lien 631 if ($flag_lien_auto AND !$lien) 632 $code_lien = '($lien = generer_url_'.$type_objet.'('.$_id_objet.')) ? $lien : ""'; 633 // 2. lien indique en clair (avec des balises : imprimer#ID_ARTICLE.html) 634 else if ($lien) { 635 $code_lien = "'".texte_script(trim($lien))."'"; 636 while (ereg("^([^#]*)#([A-Za-z_]+)(.*)$", $code_lien, $match)) { 637 $c = new Champ(); 638 $c->nom_champ = $match[2]; 639 $c->id_boucle = $p->id_boucle; 640 $c->boucles = &$p->boucles; 641 $c->descr = $p->descr; 642 $c = calculer_champ($c); 643 $code_lien = str_replace('#'.$match[2], "'.".$c.".'", $code_lien); 644 } 645 // supprimer les '' disgracieux 646 $code_lien = ereg_replace("^''\.|\.''$", "", $code_lien); 647 } 648 649 if ($flag_fichier) 650 $code_lien = "'',''" ; 651 else { 652 if (!$code_lien) 653 $code_lien = "''"; 654 $code_lien .= ", '". addslashes($align) . "'"; 655 } 656 657 // cas des documents 658 if ($type_objet == 'DOCUMENT') { 659 $p->code = "calcule_logo_document($_id_objet, '" . 660 $p->descr['documents'] . 661 '\', $doublons, '. intval($flag_fichier).", $code_lien, '". 662 // #LOGO_DOCUMENT{x,y} donne la taille maxi 663 texte_script($params) 664 ."')"; 665 } 666 else { 667 $p->code = "affiche_logos(calcule_logo('$type_objet', '" . 668 (($suite_logo == '_SURVOL') ? 'off' : 669 (($suite_logo == '_NORMAL') ? 'on' : 'ON')) . 670 "', $_id_objet," . 671 (($suite_logo == '_RUBRIQUE') ? 672 champ_sql("id_rubrique", $p) : 673 (($type_objet == 'RUBRIQUE') ? "sql_parent($_id_objet)" : "''")) . 674 ", '$flag_fichier'), $code_lien)"; 675 } 676 $p->statut = 'php'; 677 return $p; 678 } 679 680 // #EXTRA [(#EXTRA|isbn)] 681 // Champs extra 682 // Non documentes, en voie d'obsolescence, cf. ecrire/inc_extra.php3 683 function balise_EXTRA_dist ($p) { 684 $_extra = champ_sql('extra', $p); 685 $p->code = $_extra; 686 687 // Gerer la notation [(#EXTRA|isbn)] 688 if ($p->params) { 689 include_ecrire ("inc_extra.php3"); 690 list ($key, $champ_extra) = each($p->params); // le premier filtre 691 $type_extra = $p->type_requete; 692 $champ = $champ_extra[1]; 693 694 // ci-dessus est sans doute un peu buggue : si on invoque #EXTRA 695 // depuis un sous-objet sans champ extra d'un objet a champ extra, 696 // on aura le type_extra du sous-objet (!) 697 if (extra_champ_valide($type_extra, $champ)) 698 { 699 array_shift($p->params); 700 # A quoi ca sert ? 701 # $p->code = "extra($p->code, '".addslashes($champ)."')"; 702 703 704 // Appliquer les filtres definis par le webmestre 705 $filtres = extra_filtres($type_extra, $champ); 706 if ($filtres) foreach ($filtres as $f) 707 $p->code = "$f($p->code)"; 708 } 709 } 710 711 $p->statut = 'html'; 712 return $p; 713 } 714 715 // 716 // Parametres de reponse a un forum 717 // 718 719 function balise_PARAMETRES_FORUM_dist($p) { 720 include_local(find_in_path('inc-formulaire_forum.php3')); 721 $_id_article = champ_sql('id_article', $p); 722 $p->code = ' 723 // refus des forums ? 724 (sql_accepter_forum('.$_id_article.')=="non" OR 725 (lire_meta("forums_publics") == "non" 726 AND sql_accepter_forum('.$_id_article.') == "")) 727 ? "" : // sinon: 728 '; 729 730 switch ($p->type_requete) { 731 case 'articles': 732 $c = '"id_article=".' . champ_sql('id_article', $p); 733 break; 734 case 'breves': 735 $c = '"id_breve=".' . champ_sql('id_breve', $p); 736 break; 737 case 'rubriques': 738 $c = '"id_rubrique=".' . champ_sql('id_rubrique', $p); 739 break; 740 case 'syndication': 741 $c = '"id_syndic=".' . champ_sql('id_syndic', $p); 742 break; 743 case 'forums': 744 default: 745 $liste_champs = array ("id_article","id_breve","id_rubrique","id_syndic","id_forum"); 746 foreach ($liste_champs as $champ) { 747 $x = champ_sql( $champ, $p); 748 $c .= (($c) ? ".\n" : "") . "((!$x) ? '' : ('&$champ='.$x))"; 749 } 750 $c = "substr($c,1)"; 751 break; 752 } 753 754 // Syntaxe [(#PARAMETRES_FORUM{#SELF})] pour fixer le retour du forum 755 # note : ce bloc qui sert a recuperer des arguments calcules pourrait 756 # porter un nom et faire partie de l'API. 757 if ($p->param && !$p->param[0][0]) { 758 $retour = array_shift( $p->param ); 759 array_shift($retour); 760 $retour = calculer_liste($retour[0], 761 $p->descr, 762 $p->boucles, 763 $p->id_boucle); 764 } 765 else 766 $retour = "''"; 767 768 // Attention un eventuel &retour=xxx dans l'URL est prioritaire 769 $c .= '. 770 (($lien = (_request("retour") ? _request("retour") : '.$retour.')) ? "&retour=".rawurlencode($lien) : "")'; 771 772 $p->code .= code_invalideur_forums($p, "(".$c.")"); 773 774 $p->statut = 'html'; 775 return $p; 776 } 777 778 779 // Noter l'invalideur de la page contenant ces parametres, 780 // en cas de premier post sur le forum 781 function code_invalideur_forums($p, $code) { 782 include_ecrire ('inc_invalideur.php3'); 783 $type = 'id_forum'; 784 $valeur = "\n\t\tcalcul_index_forum(" 785 // Retournera 4 [$SP] mais force la demande du champ a MySQL 786 . champ_sql('id_article', $p) . ',' 787 . champ_sql('id_breve', $p) . ',' 788 . champ_sql('id_rubrique', $p) .',' 789 . champ_sql('id_syndic', $p) . ")\n\t"; 790 791 return ajouter_invalideur($type, $valeur, $code); 792 } 793 794 // Reference a l'URL de la page courante 795 // Attention dans un INCLURE() ou une balise dynamique on n'a pas le droit de 796 // mettre en cache #SELF car il peut correspondre a une autre page (attaque XSS) 797 // http://www.spip.net/@self 798 function balise_SELF_dist($p) { 799 $p->code = 'quote_amp($GLOBALS["clean_link"]->getUrl())'; 800 $p->statut = 'php'; 801 return $p; 802 } 803 804 805 // 806 // #ENV 807 // l'"environnement", id est le $contexte (ou $contexte_inclus) 808 // 809 // en standard on applique |entites_html, mais si vous utilisez 810 // [(#ENV*{toto})] il *faut* vous assurer vous-memes de la securite 811 // anti-javascript (par exemple en filtrant avec |safehtml) 812 // 813 // La syntaxe #ENV{toto, rempl} renverra 'rempl' si $toto est vide 814 // 815 function balise_ENV_dist($p) { 816 817 if ($a = $p->param) { 818 $sinon = array_shift($a); 819 if (!array_shift($sinon)) { 820 $p->fonctions = $a; 821 array_shift( $p->param ); 822 $nom = array_shift($sinon); 823 $nom = ($nom[0]->type=='texte') ? $nom[0]->texte : ""; 824 } 825 } 826 827 if (!$nom) { 828 // cas de #ENV sans argument : on retourne le serialize() du tableau 829 // une belle fonction [(#ENV|affiche_env)] serait pratique 830 $p->code = 'serialize($Pile[0])'; 831 } else { 832 // admet deux arguments : nom de variable, valeur par defaut si vide 833 $p->code = '$Pile[0]["' . addslashes($nom) . '"]'; 834 if ($sinon) 835 $p->code = 'sinon('. 836 $p->code . 837 compose_filtres_args($p, $sinon, ',') . 838 ')'; 839 } 840 $p->statut = 'html'; 841 842 return $p; 843 } 844 845 ?>
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 |