[ Index ]
 

Code source de SPIP 1.8.3

Accédez au Source d'autres logiciels libres | Soutenez Angelica Josefina !

title

Body

[fermer]

/ -> inc-calcul-outils.php3 (source)

   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  ?>


Généré le : Thu Feb 22 22:27:47 2007 par Balluche grâce à PHPXref 0.7