[ Index ]
 

Code source de SPIP 1.9.2c

Accédez au Source d'autres logiciels libres

title

Body

[fermer]

/ecrire/public/ -> assembler.php (source)

   1  <?php
   2  
   3  /***************************************************************************\
   4   *  SPIP, Systeme de publication pour l'internet                           *
   5   *                                                                         *
   6   *  Copyright (c) 2001-2007                                                *
   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  if (!defined("_ECRIRE_INC_VERSION")) return;
  15  
  16  // fonction principale declenchant tout le service
  17  // elle-meme ne fait que traiter les cas particuliers, puis passe la main.
  18  // http://doc.spip.org/@public_assembler_dist
  19  function public_assembler_dist($fond) {
  20        global $auteur_session, $forcer_lang, $ignore_auth_http, $var_mode;
  21  
  22      // multilinguisme
  23      if ($forcer_lang AND ($forcer_lang!=='non') AND !count($_POST)) {
  24          include_spip('inc/lang');
  25          verifier_lang_url();
  26      }
  27      if (isset($_GET['lang'])) {
  28          include_spip('inc/lang');
  29          lang_select($_GET['lang']);
  30      }
  31  
  32      // Si envoi pour un forum, enregistrer puis rediriger
  33      if (isset($_POST['confirmer_forum'])
  34      OR (isset($_POST['ajouter_mot']) AND $GLOBALS['afficher_texte']=='non')) {
  35          include_spip('inc/headers');
  36          $forum_insert = charger_fonction('forum_insert', 'inc');
  37          redirige_par_entete($forum_insert());
  38      }
  39  
  40      // si signature de petition, l'enregistrer avant d'afficher la page
  41      // afin que celle-ci contienne la signature
  42      if (isset($_GET['var_confirm'])) {
  43          include_spip('balise/formulaire_signature');
  44          reponse_confirmation($_GET['var_confirm']);
  45      }
  46  
  47      //  refus du debug si l'admin n'est pas connecte
  48      if ($var_mode=='debug') {
  49          if ($auteur_session['statut'] == '0minirezo')
  50              spip_log('debug !');
  51          else {
  52              include_spip('inc/headers');
  53              redirige_par_entete(generer_url_public('login',
  54              'url='.rawurlencode(
  55              parametre_url(self(), 'var_mode', 'debug', '&')
  56              ), true));
  57          }
  58      }
  59  
  60      return assembler_page ($fond);
  61  }
  62  
  63  
  64  // http://doc.spip.org/@is_preview
  65  function is_preview()
  66  {
  67      global $var_mode;
  68      if ($var_mode !== 'preview') return false;
  69      $statut = $GLOBALS['auteur_session']['statut'];
  70      return ($statut=='0minirezo' OR
  71          ($GLOBALS['meta']['preview']=='1comite' AND $statut=='1comite'));
  72  }
  73  
  74  //
  75  // calcule la page et les entetes
  76  //
  77  // http://doc.spip.org/@assembler_page
  78  function assembler_page ($fond) {
  79      global $flag_ob, $flag_preserver,$lastmodified,
  80          $use_cache, $var_mode, $var_preview;
  81  
  82      // Cette fonction est utilisee deux fois
  83      $cacher = charger_fonction('cacher', 'public');
  84      // Garnir ces quatre parametres avec les infos sur le cache
  85      $cacher(NULL, $use_cache, $chemin_cache, $page, $lastmodified);
  86  
  87      if (!$chemin_cache || !$lastmodified) $lastmodified = time();
  88  
  89      // demande de previsualisation ?
  90      // -> inc-calcul n'enregistrera pas les fichiers caches
  91      // -> inc-boucles acceptera les objets non 'publie'
  92      if (is_preview()) {
  93              $var_mode = 'recalcul';
  94              $var_preview = true;
  95              spip_log('preview !');
  96          } else    $var_preview = false;
  97  
  98      $headers_only = ($_SERVER['REQUEST_METHOD'] == 'HEAD');
  99  
 100      // Pour les pages non-dynamiques (indiquees par #CACHE{duree,cache-client})
 101      // une perennite valide a meme reponse qu'une requete HEAD (par defaut les
 102      // pages sont dynamiques)
 103      if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])
 104      AND !$var_mode
 105      AND $chemin_cache
 106      AND isset($page['entetes'])
 107      AND strstr($page['entetes']['Cache-Control'],'max-age=')
 108      AND !strstr($_SERVER['SERVER_SOFTWARE'],'IIS/')
 109      ) {
 110          $since = preg_replace('/;.*/', '',
 111              $_SERVER['HTTP_IF_MODIFIED_SINCE']);
 112          $since = str_replace('GMT', '', $since);
 113          if (trim($since) == gmdate("D, d M Y H:i:s", $lastmodified)) {
 114              $page['status'] = 304;
 115              $headers_only = true;
 116          }
 117      }
 118  
 119      // Si requete HEAD ou Last-modified compatible, ignorer le texte
 120      // et pas de content-type (pour contrer le bouton admin de inc-public)
 121  
 122      if ($headers_only) {
 123          $page['entetes']["Connection"] = "close";
 124          $page['texte'] = "";
 125      } else {
 126          if (!$use_cache)  {
 127              if (isset($page['contexte'])){
 128                  // Remplir les globals pour les boutons d'admin
 129                  foreach ($page['contexte'] as $var=>$val)
 130                      $GLOBALS[$var] = $val;
 131              }
 132          } else {
 133              $parametrer = charger_fonction('parametrer', 'public');
 134              $page = $parametrer($fond, '', $chemin_cache);
 135              if ($chemin_cache)
 136                  $cacher(NULL, $use_cache, $chemin_cache, $page, $lastmodified);
 137          }
 138  
 139          if ($chemin_cache) $page['cache'] = $chemin_cache;
 140  
 141          auto_content_type($page);
 142  
 143          $flag_preserver |=  headers_sent();
 144  
 145          // Definir les entetes si ce n'est fait 
 146          if (!$flag_preserver) {
 147              if ($flag_ob) {
 148                  // Si la page est vide, produire l'erreur 404
 149                  if (trim($page['texte']) === ''
 150                  AND $var_mode != 'debug') {
 151                      $page = message_erreur_404();
 152                  }
 153                  // pas de cache client en mode 'observation'
 154                  if ($var_mode) {
 155                      $page['entetes']["Cache-Control"]= "no-cache,must-revalidate";
 156                      $page['entetes']["Pragma"] = "no-cache";
 157                  }
 158              }
 159          }
 160      }
 161  
 162      // Entete Last-Modified:
 163      // eviter d'etre incoherent en envoyant un lastmodified identique
 164      // a celui qu'on a refuse d'honorer plus haut (cf. #655)
 165      if ($lastmodified
 166      AND !isset($_SERVER['HTTP_IF_MODIFIED_SINCE']))
 167          $page['entetes']["Last-Modified"]=gmdate("D, d M Y H:i:s", $lastmodified)." GMT";
 168  
 169      return $page;
 170  }
 171  
 172  //
 173  // 2 fonctions pour compatibilite arriere. Sont probablement superflues
 174  //
 175  
 176  // http://doc.spip.org/@auto_content_type
 177  function auto_content_type($page)
 178  {
 179      global $flag_preserver;
 180      if (!isset($flag_preserver))
 181        {
 182          $flag_preserver = preg_match("/header\s*\(\s*.content\-type:/isx",$page['texte']) || (isset($page['entetes']['Content-Type']));
 183        }
 184  }
 185  
 186  // http://doc.spip.org/@stop_inclure
 187  function stop_inclure($fragment) {
 188      if ($fragment == _request('var_fragment')) {
 189          define('_STOP_INCLURE', 1);
 190          #spip_log("fin du fragment $fragment, on arrete d'inclure");
 191      }
 192  }
 193  // http://doc.spip.org/@inclure_page
 194  function inclure_page($fond, $contexte_inclus) {
 195      global $lastmodified;
 196  
 197      // Si un fragment est demande et deja obtenu, inutile de continuer a inclure
 198      if (defined('_STOP_INCLURE')) {
 199          return array(
 200          'texte' => '',
 201          'process_ins' => 'html'
 202          );
 203      }
 204  
 205      // Si on a inclus sans fixer le critere de lang, on prend la langue courante
 206      if (!isset($contexte_inclus['lang']))
 207          $contexte_inclus['lang'] = $GLOBALS['spip_lang'];
 208  
 209      if ($contexte_inclus['lang'] != $GLOBALS['meta']['langue_site']) {
 210          lang_select($contexte_inclus['lang']);
 211          $lang_select = true; // pour lang_dselect en sortie
 212      }
 213  
 214      $cacher = charger_fonction('cacher', 'public');
 215      // Garnir ces quatre parametres avec les infos sur le cache :
 216      // emplacement, validite, et, s'il est valide, contenu & age
 217      $cacher($contexte_inclus, $use_cache, $chemin_cache, $page, $lastinclude);
 218  
 219      // Une fois le chemin-cache decide, on ajoute la date (et date_redac)
 220      // dans le contexte inclus, pour que les criteres {age} etc fonctionnent
 221      if (!isset($contexte_inclus['date']))
 222          $contexte_inclus['date'] = date('Y-m-d H:i:s');
 223      if (!isset($contexte_inclus['date_redac']))
 224          $contexte_inclus['date_redac'] = $contexte_inclus['date'];
 225  
 226      // Si use_cache vaut 0, la page a ete tiree du cache et se trouve dans $page
 227      if (!$use_cache) {
 228          $lastmodified = max($lastmodified, $lastinclude);
 229      }
 230      // sinon on la calcule
 231      else {
 232          $parametrer = charger_fonction('parametrer', 'public');
 233          $page = $parametrer($fond, $contexte_inclus, $chemin_cache);
 234          $lastmodified = time();
 235          // et on l'enregistre sur le disque
 236          if ($chemin_cache
 237          AND $page['entetes']['X-Spip-Cache'] > 0)
 238              $cacher($contexte_inclus, $use_cache, $chemin_cache, $page,
 239                  $lastmodified);
 240      }
 241      if($lang_select)
 242          lang_dselect();
 243  
 244      return $page;
 245  }
 246  
 247  
 248  # Attention, un appel explicite a cette fonction suppose certains include
 249  # (voir l'exemple de spip_inscription et spip_pass)
 250  # $echo = faut-il faire echo ou return
 251  
 252  // http://doc.spip.org/@inclure_balise_dynamique
 253  function inclure_balise_dynamique($texte, $echo=true, $ligne=0) {
 254      global $contexte_inclus; # provisoire : c'est pour le debuggueur
 255  
 256      if (is_array($texte)) {
 257  
 258          list($fond, $delainc, $contexte_inclus) = $texte;
 259  
 260          // delais a l'ancienne, c'est pratiquement mort
 261          $d = isset($GLOBALS['delais']) ? $GLOBALS['delais'] : NULL;
 262          $GLOBALS['delais'] = $delainc;
 263          $page = inclure_page($fond, $contexte_inclus);
 264          $GLOBALS['delais'] = $d;
 265  
 266          // Faire remonter les entetes
 267          if (is_array($page['entetes'])) {
 268              // mais pas toutes
 269              unset($page['entetes']['X-Spip-Cache']);
 270              unset($page['entetes']['Content-Type']);
 271              if (is_array($GLOBALS['page'])) {
 272                  if (!is_array($GLOBALS['page']['entetes']))
 273                      $GLOBALS['page']['entetes'] = array();
 274                  $GLOBALS['page']['entetes'] = 
 275                      array_merge($GLOBALS['page']['entetes'],$page['entetes']);
 276              }
 277          }
 278  
 279          if ($page['process_ins'] == 'html') {
 280                  $texte = $page['texte'];
 281          } else {
 282                  ob_start();
 283                  eval('?' . '>' . $page['texte']);
 284                  $texte = ob_get_contents();
 285                  ob_end_clean();
 286          }
 287      }
 288  
 289      if ($GLOBALS['var_mode'] == 'debug')
 290          $GLOBALS['debug_objets']['resultat'][$ligne] = $texte;
 291  
 292      if ($echo)
 293          echo $texte;
 294      else
 295          return $texte;
 296  
 297  }
 298  
 299  // Traiter var_recherche pour surligner les mots
 300  // http://doc.spip.org/@f_surligne
 301  function f_surligne ($texte) {
 302      if (isset($_GET['var_recherche'])) {
 303          include_spip('inc/surligne');
 304          $texte = surligner_mots($texte, $_GET['var_recherche']);
 305      }
 306      return $texte;
 307  }
 308  
 309  // Valider/indenter a la demande.
 310  // http://doc.spip.org/@f_tidy
 311  function f_tidy ($texte) {
 312      global $xhtml;
 313  
 314      if ($xhtml # tidy demande
 315      AND $GLOBALS['html'] # verifie que la page avait l'entete text/html
 316      AND strlen($texte)
 317      AND (_request('var_fragment') === NULL)
 318      AND !headers_sent()) {
 319          # Compatibilite ascendante
 320          if (!is_string($xhtml)) $xhtml ='tidy';
 321  
 322          if ($f = charger_fonction($xhtml, 'inc'))
 323              $texte = $f($texte);
 324      }
 325  
 326      return $texte;
 327  }
 328  
 329  // Offre #INSERT_HEAD sur tous les squelettes (bourrin)
 330  // a activer dans mes_options via :
 331  // $spip_pipeline['affichage_final'] .= '|f_insert_head';
 332  // http://doc.spip.org/@f_insert_head
 333  function f_insert_head($texte) {
 334      if (!$GLOBALS['html']) return $texte;
 335      include_spip('public/admin'); // pour strripos
 336  
 337      ($pos = stripos($texte, '</head>'))
 338          || ($pos = stripos($texte, '<body>'))
 339          || ($pos = 0);
 340  
 341      if (false === strpos(substr($texte, 0,$pos), '<!-- insert_head -->')) {
 342          $insert = "\n".pipeline('insert_head','<!-- f_insert_head -->')."\n";
 343          $texte = substr_replace($texte, $insert, $pos, 0);
 344      }
 345  
 346      return $texte;
 347  }
 348  
 349  // Inserer au besoin les boutons admins
 350  // http://doc.spip.org/@f_admin
 351  function f_admin ($texte) {
 352      if ($GLOBALS['affiche_boutons_admin']) {
 353          include_spip('public/admin');
 354          $texte = affiche_boutons_admin($texte);
 355      }
 356  
 357      return $texte;
 358  }
 359  
 360  // http://doc.spip.org/@message_erreur_404
 361  function message_erreur_404 ($erreur= "") {
 362      if (!$erreur) {
 363          if (isset($GLOBALS['id_article']))
 364          $erreur = 'public:aucun_article';
 365          else if (isset($GLOBALS['id_rubrique']))
 366          $erreur = 'public:aucune_rubrique';
 367          else if (isset($GLOBALS['id_breve']))
 368          $erreur = 'public:aucune_breve';
 369          else if (isset($GLOBALS['id_auteur']))
 370          $erreur = 'public:aucun_auteur';
 371          else if (isset($GLOBALS['id_syndic']))
 372          $erreur = 'public:aucun_site';
 373      }
 374      $contexte_inclus = array(
 375          'erreur' => _T($erreur),
 376          'lang' => $GLOBALS['spip_lang']
 377      );
 378      $page = inclure_page('404', $contexte_inclus);
 379      $page['status'] = 404;
 380      return $page;
 381  }
 382  
 383  // fonction permettant de recuperer le resultat du calcul d'un squelette
 384  // pour une inclusion dans un flux
 385  // http://doc.spip.org/@recuperer_fond
 386  function recuperer_fond($fond, $contexte=array()) {
 387  
 388      // on est peut etre dans l'espace prive au moment de l'appel
 389      define ('_INC_PUBLIC', 1);
 390      if (($fond=='')&&isset($contexte['fond']))
 391          $fond = $contexte['fond'];
 392      
 393      $contexte['fond'] = $fond; // necessaire pour calculer correctement le cache
 394  
 395      $page = inclure_page($fond, $contexte);
 396      if ($GLOBALS['flag_ob'] AND ($page['process_ins'] != 'html')) {
 397          ob_start();
 398          eval('?' . '>' . $page['texte']);
 399          $page['texte'] = ob_get_contents();
 400          ob_end_clean();
 401      }
 402  
 403      return trim($page['texte']);
 404  }
 405  
 406  // temporairement ici : a mettre dans le futur inc/modeles
 407  // creer_contexte_de_modele('left', 'autostart=true', ...) renvoie un array()
 408  // http://doc.spip.org/@creer_contexte_de_modele
 409  function creer_contexte_de_modele($args) {
 410      $contexte = array();
 411      $params = array();
 412      foreach ($args as $var=>$val) {
 413          if (is_int($var)){ // argument pas formate
 414              if (in_array($val, array('left', 'right', 'center'))) {
 415                  $var = 'align';
 416                  $contexte[$var] = $val;
 417              } else {
 418                  $args = explode('=', $val);
 419                  if (count($args)>=2) // Flashvars=arg1=machin&arg2=truc genere plus de deux args
 420                      $contexte[$args[0]] = substr($val,strlen($args[0])+1);
 421              }
 422          }
 423          else
 424              $contexte[$var] = $val;
 425      }
 426  
 427      return $contexte;
 428  }
 429  
 430  // Calcule le modele et retourne la mini-page ainsi calculee
 431  // http://doc.spip.org/@inclure_modele
 432  function inclure_modele($type, $id, $params, $lien) {
 433      static $compteur;
 434      if (++$compteur>10) return ''; # ne pas boucler indefiniment
 435  
 436      $type = strtolower($type);
 437  
 438      $fond = 'modeles/'.$type;
 439  
 440      $params = array_filter(explode('|', $params));
 441      if ($params) {
 442          list(,$soustype) = each($params);
 443          $soustype = strtolower($soustype);
 444          if (in_array($soustype,
 445          array('left', 'right', 'center'))) {
 446              list(,$soustype) = each($params);
 447              $soustype = strtolower($soustype);
 448          }
 449  
 450          if (preg_match(',^[a-z0-9_]+$,', $soustype)) {
 451              $fond = 'modeles/'.$type.'_'.$soustype;
 452              if (!find_in_path($fond.'.html')) {
 453                  $fond = 'modeles/'.$type;
 454                  $class = $soustype;
 455              }
 456          }
 457      }
 458  
 459      // en cas d'echec : si l'objet demande a une url, on cree un petit encadre
 460      // avec un lien vers l'objet ; sinon on passe la main au suivant
 461      if (!find_in_path($fond.'.html')) {
 462          if (!$lien)
 463              $lien = calculer_url("$type$id", '', 'tout');
 464          if (strpos($lien[1],'spip_url') !== false)
 465              return false;
 466          else
 467              return '<a href="'.$lien[0].'" class="spip_modele'
 468                  . ($class ? " $class" : '')
 469                  . '">'.sinon($lien[2], _T('ecrire:info_sans_titre'))."</a>";
 470      }
 471  
 472  
 473      // Creer le contexte
 474      $contexte = array( 
 475          'lang' => $GLOBALS['spip_lang'], 
 476          'fond' => $fond, 
 477          'dir_racine' => _DIR_RACINE # eviter de mixer un cache racine et un cache ecrire (meme si pour l'instant les modeles ne sont pas caches, le resultat etant different il faut que le contexte en tienne compte 
 478      ); 
 479      // Fixer l'identifiant qu'on passe dans #ENV ;
 480      // pour le modele <site1> on veut id_syndic => 1
 481      // par souci de systematisme on ajoute aussi
 482      // id => 1.
 483      $contexte[id_table_objet($type)] = $contexte['id'] = $id;
 484  
 485      if ($class)
 486          $contexte['class'] = $class;
 487  
 488      // Si un lien a ete passe en parametre, ex: [<modele1>->url]
 489      if ($lien) {
 490          # un eventuel guillemet (") sera reechappe par #ENV
 491          $contexte['lien'] = str_replace("&quot;",'"', $lien[0]);
 492          $contexte['lien_class'] = $lien[1];
 493      }
 494  
 495      // Traiter les parametres
 496      // par exemple : <img1|center>, <emb12|autostart=true> ou <doc1|lang=en>
 497      $contexte = array_merge($contexte,
 498          creer_contexte_de_modele($params));
 499  
 500      // On cree un marqueur de notes unique lie a ce modele
 501      // et on enregistre l'etat courant des globales de notes...
 502      $enregistre_marqueur_notes = $GLOBALS['marqueur_notes'];
 503      $enregistre_les_notes = $GLOBALS['les_notes'];
 504      $enregistre_compt_note = $GLOBALS['compt_note'];
 505      $GLOBALS['marqueur_notes'] = substr(md5(serialize($contexte)),0,8);
 506      $GLOBALS['les_notes'] = '';
 507      $GLOBALS['compt_note'] = 0;
 508  
 509      // Appliquer le modele avec le contexte
 510      $retour = trim(recuperer_fond($fond, $contexte));
 511  
 512      // On restitue les globales de notes telles qu'elles etaient avant l'appel
 513      // du modele. Si le modele n'a pas affiche ses notes, tant pis (elles *doivent*
 514      // etre dans le cache du modele, autrement elles ne seraient pas prises en
 515      // compte a chaque calcul d'un texte contenant un modele, mais seulement
 516      // quand le modele serait calcule, et on aurait des resultats incoherents)
 517      $GLOBALS['les_notes'] = $enregistre_les_notes;
 518      $GLOBALS['marqueur_notes'] = $enregistre_marqueur_notes;
 519      $GLOBALS['compt_note'] = $enregistre_compt_note;
 520  
 521      // Regarder si le modele tient compte des liens (il *doit* alors indiquer
 522      // spip_lien_ok dans les classes de son conteneur de premier niveau ;
 523      // sinon, s'il y a un lien, on l'ajoute classiquement
 524      if (strstr(' ' . ($classes = extraire_attribut($retour, 'class')).' ',
 525      'spip_lien_ok')) {
 526          $retour = inserer_attribut($retour, 'class',
 527              trim(str_replace(' spip_lien_ok ', ' ', " $classes ")));
 528      } else if ($lien)
 529          $retour = "<a href='".$lien[0]."' class='".$lien[1]."'>".$retour."</a>";
 530  
 531      $compteur--;
 532      return $retour;
 533  }
 534  
 535  ?>


Généré le : Wed Nov 21 10:20:27 2007 par Balluche grâce à PHPXref 0.7
  Clicky Web Analytics