[ Index ]
 

Code source de SPIP 1.9.2c

Accédez au Source d'autres logiciels libres

title

Body

[fermer]

/ecrire/inc/ -> revisions.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  if (!defined("_ECRIRE_INC_VERSION")) return;
  14  
  15  $GLOBALS['agregation_versions'] = 10;
  16  
  17  // http://doc.spip.org/@separer_paras
  18  function separer_paras($texte, $paras = "") {
  19      if (!$paras) $paras = array();
  20      while (preg_match("/(\r\n?){2,}|\n{2,}/", $texte, $regs)) {
  21          $p = strpos($texte, $regs[0]) + strlen($regs[0]);
  22          $paras[] = substr($texte, 0, $p);
  23          $texte = substr($texte, $p);
  24      }
  25      if ($texte) $paras[] = $texte;
  26      return $paras;
  27  }
  28  
  29  // http://doc.spip.org/@replace_fragment
  30  function replace_fragment($id_article, $version_min, $version_max, $id_fragment, $fragment) {
  31      global $flag_gz;
  32  
  33      $fragment = serialize($fragment);
  34      $compress = 0;
  35      if ($flag_gz) {
  36          $s = gzcompress($fragment);
  37          if (strlen($s) < strlen($fragment)) {
  38              //spip_log("gain gz: ".(100 - 100 * strlen($s) / strlen($fragment)));
  39              $compress = 1;
  40              $fragment = $s;
  41          }
  42      }
  43      // Attention a bien echapper le $fragment qui est en binaire
  44      return "($id_article, $version_min, $version_max, $id_fragment, $compress, '"
  45          .mysql_escape_string($fragment)."')";
  46  }
  47  
  48  // http://doc.spip.org/@exec_replace_fragments
  49  function exec_replace_fragments($replaces) {
  50      if (count($replaces)) {
  51          spip_query("REPLACE spip_versions_fragments (id_article, version_min, version_max, id_fragment, compress, fragment) VALUES ".join(", ", $replaces));
  52  
  53      }
  54  }
  55  // http://doc.spip.org/@exec_delete_fragments
  56  function exec_delete_fragments($id_article, $deletes) {
  57      if (count($deletes)) {
  58          spip_query("DELETE FROM spip_versions_fragments WHERE id_article=$id_article AND ((".    join(") OR (", $deletes)."))");
  59  
  60      }
  61  }
  62  
  63  
  64  //
  65  // Ajouter les fragments de la derniere version (tableau associatif id_fragment => texte)
  66  //
  67  // http://doc.spip.org/@ajouter_fragments
  68  function ajouter_fragments($id_article, $id_version, $fragments) {
  69      global $flag_gz, $agregation_versions;
  70  
  71      $replaces = array();
  72      foreach ($fragments as $id_fragment => $texte) {
  73          $nouveau = true;
  74          // Recuperer la version la plus recente
  75          $result = spip_query("SELECT compress, fragment, version_min, version_max FROM spip_versions_fragments WHERE id_article=$id_article AND id_fragment=$id_fragment AND version_min<=$id_version ORDER BY version_min DESC LIMIT 0,1");
  76  
  77          if ($row = spip_fetch_array($result)) {
  78              $fragment = $row['fragment'];
  79              $version_min = $row['version_min'];
  80              if ($row['compress'] > 0) $fragment = gzuncompress($fragment);
  81              $fragment = unserialize($fragment);
  82              if (is_array($fragment)) {
  83                  unset($fragment[$id_version]);
  84                  // Si le fragment n'est pas trop gros, prolonger celui-ci
  85                  $nouveau = count($fragment) >= $agregation_versions
  86                      && strlen($row['fragment']) > 1000;
  87              }
  88          }
  89          if ($nouveau) {
  90              $fragment = array($id_version => $texte);
  91              $version_min = $id_version;
  92          }
  93          else {
  94              // Ne pas dupliquer les fragments non modifies
  95              $modif = true;
  96              for ($i = $id_version - 1; $i >= $version_min; $i--) {
  97                  if (isset($fragment[$i])) {
  98                      $modif = ($fragment[$i] != $texte);
  99                      break;
 100                  }
 101              }
 102              if ($modif) $fragment[$id_version] = $texte;
 103          }
 104          
 105          // Preparer l'enregistrement du fragment
 106          $replaces[] = replace_fragment($id_article, $version_min, $id_version, $id_fragment, $fragment);
 107      }
 108  
 109      exec_replace_fragments($replaces);
 110  }
 111  
 112  //
 113  // Supprimer tous les fragments d'un article lies a un intervalle de versions
 114  // (essaie d'eviter une trop grande fragmentation)
 115  //
 116  // http://doc.spip.org/@supprimer_fragments
 117  function supprimer_fragments($id_article, $version_debut, $version_fin) {
 118      global $flag_gz, $agregation_versions;
 119  
 120      $replaces = array();
 121      $deletes = array();
 122  
 123      // D'abord, vider les fragments inutiles
 124      spip_query("DELETE FROM spip_versions_fragments WHERE id_article=$id_article AND version_min>=$version_debut AND version_max<=$version_fin");
 125  
 126  
 127      // Fragments chevauchant l'ensemble de l'intervalle, s'ils existent
 128      $result = spip_query("SELECT id_fragment, compress, fragment, version_min, version_max FROM spip_versions_fragments WHERE id_article=$id_article AND version_min<$version_debut AND version_max>$version_fin");
 129  
 130      while ($row = spip_fetch_array($result)) {
 131          $id_fragment = $row['id_fragment'];
 132          $fragment = $row['fragment'];
 133          if ($row['compress'] > 0) $fragment = gzuncompress($fragment);
 134          $fragment = unserialize($fragment);
 135          for ($i = $version_fin; $i >= $version_debut; $i--) {
 136              if (isset($fragment[$i])) {
 137                  // Recopier le dernier fragment si implicite
 138                  if (!isset($fragment[$version_fin + 1]))
 139                      $fragment[$version_fin + 1] = $fragment[$i];
 140                  unset($fragment[$i]);
 141              }
 142          }
 143  
 144          $replaces[] = replace_fragment($id_article,
 145              $row['version_min'], $row['version_max'], $id_fragment, $fragment);
 146      }
 147  
 148      // Fragments chevauchant le debut de l'intervalle, s'ils existent
 149      $result = spip_query("SELECT id_fragment, compress, fragment, version_min, version_max FROM spip_versions_fragments WHERE id_article=$id_article AND version_min<$version_debut AND version_max>=$version_debut AND version_max<=$version_fin");
 150  
 151      $deb_fragment = array();
 152      while ($row = spip_fetch_array($result)) {
 153          $id_fragment = $row['id_fragment'];
 154          $fragment = $row['fragment'];
 155          $version_min = $row['version_min'];
 156          $version_max = $row['version_max'];
 157          if ($row['compress'] > 0) $fragment = gzuncompress($fragment);
 158          $fragment = unserialize($fragment);
 159          for ($i = $version_debut; $i <= $version_max; $i++) {
 160              if (isset($fragment[$i])) unset($fragment[$i]);
 161          }
 162  
 163          // Stocker temporairement le fragment pour agregation
 164          $deb_fragment[$id_fragment] = $fragment;
 165          // Ajuster l'intervalle des versions
 166          $deb_version_min[$id_fragment] = $version_min;
 167          $deb_version_max[$id_fragment] = $version_debut - 1;
 168      }
 169  
 170      // Fragments chevauchant la fin de l'intervalle, s'ils existent
 171      $result = spip_query("SELECT id_fragment, compress, fragment, version_min, version_max FROM spip_versions_fragments WHERE id_article=$id_article AND version_max>$version_fin AND version_min>=$version_debut AND version_min<=$version_fin");
 172  
 173      while ($row = spip_fetch_array($result)) {
 174          $id_fragment = $row['id_fragment'];
 175          $fragment = $row['fragment'];
 176          $version_min = $row['version_min'];
 177          $version_max = $row['version_max'];
 178          if ($row['compress'] > 0) $fragment = gzuncompress($fragment);
 179          $fragment = unserialize($fragment);
 180          for ($i = $version_fin; $i >= $version_min; $i--) {
 181              if (isset($fragment[$i])) {
 182                  // Recopier le dernier fragment si implicite
 183                  if (!isset($fragment[$version_fin + 1]))
 184                      $fragment[$version_fin + 1] = $fragment[$i];
 185                  unset($fragment[$i]);
 186              }
 187          }
 188  
 189          // Virer l'ancien enregistrement (la cle primaire va changer)
 190          $deletes[] = "id_fragment=$id_fragment AND version_min=$version_min";
 191          // Essayer l'agregation
 192          $agreger = false;
 193          if (isset($deb_fragment[$id_fragment])) {
 194              $agreger = (count($deb_fragment[$id_fragment]) + count($fragment) <= $agregation_versions);
 195              if ($agreger) {
 196                  $fragment = $deb_fragment[$id_fragment] + $fragment;
 197                  $version_min = $deb_version_min[$id_fragment];
 198              }
 199              else {
 200                  $replaces[] = replace_fragment($id_article,
 201                      $deb_version_min[$id_fragment], $deb_version_max[$id_fragment],
 202                      $id_fragment, $deb_fragment[$id_fragment]);
 203              }
 204              unset($deb_fragment[$id_fragment]);
 205          }
 206          if (!$agreger) {
 207              // Ajuster l'intervalle des versions
 208              $version_min = $version_fin + 1;
 209          }
 210          $replaces[] = replace_fragment($id_article, $version_min, $version_max, $id_fragment, $fragment);
 211      }
 212  
 213      // Ajouter fragments restants
 214      if (is_array($deb_fragment) && count($deb_fragment) > 0) {
 215          foreach ($deb_fragment as $id_fragment => $fragment) {
 216              $replaces[] = replace_fragment($id_article,
 217                  $deb_version_min[$id_fragment], $deb_version_max[$id_fragment],
 218                  $id_fragment, $deb_fragment[$id_fragment]);
 219          }
 220      }
 221      
 222      exec_replace_fragments($replaces);
 223      exec_delete_fragments($id_article, $deletes);
 224  }
 225  
 226  //
 227  // Recuperer les fragments d'une version donnee
 228  // renvoie un tableau associatif (id_fragment => texte)
 229  //
 230  // http://doc.spip.org/@recuperer_fragments
 231  function recuperer_fragments($id_article, $id_version) {
 232      $fragments = array();
 233  
 234      if ($id_version == 0) return array();
 235  
 236      $result = spip_query("SELECT id_fragment, version_min, version_max, compress, fragment FROM spip_versions_fragments WHERE id_article=$id_article AND version_min<=$id_version AND version_max>=$id_version");
 237  
 238      while ($row = spip_fetch_array($result)) {
 239          $id_fragment = $row['id_fragment'];
 240          $version_min = $row['version_min'];
 241          $fragment = $row['fragment'];
 242          if ($row['compress'] > 0){
 243              $fragment_ = @gzuncompress($fragment);
 244              if (strlen($fragment) && $fragment_===false)
 245                  $fragment=serialize(array($row['version_max']=>"["._T('forum_titre_erreur').$id_fragment."]"));
 246              else
 247               $fragment = $fragment_;
 248          }
 249          $fragment_ = unserialize($fragment);
 250          if (strlen($fragment) && $fragment_===false)
 251              $fragment=array($row['version_max']=>"["._T('forum_titre_erreur').$id_fragment."]");
 252          else
 253           $fragment = $fragment_;
 254          for ($i = $id_version; $i >= $version_min; $i--) {
 255              if (isset($fragment[$i])) {
 256  
 257                  ## hack destine a sauver les archives des sites iso-8859-1
 258                  ## convertis en utf-8 (les archives ne sont pas converties
 259                  ## mais ce code va les nettoyer ; pour les autres charsets
 260                  ## la situation n'est pas meilleure ni pire qu'avant)
 261                  if ($GLOBALS['meta']['charset'] == 'utf-8'
 262                  AND !is_utf8($fragment[$i])) {
 263                      include_spip('inc/charsets');
 264                      $fragment[$i] = importer_charset($fragment[$i], 'iso-8859-1');
 265                  }
 266  
 267                  $fragments[$id_fragment] = $fragment[$i];
 268                  break;
 269              }
 270          }
 271      }
 272      return $fragments;
 273  }
 274  
 275  
 276  //
 277  // Apparier des paragraphes deux a deux entre une version originale
 278  // et une version modifiee
 279  //
 280  // http://doc.spip.org/@apparier_paras
 281  function apparier_paras($src, $dest, $flou = true) {
 282      $src_dest = array();
 283      $dest_src = array();
 284      
 285      $t1 = $t2 = array();
 286  
 287      $md1 = $md2 = array();
 288      $gz_min1 = $gz_min2 = array();
 289      $gz_trans1 = $gz_trans2 = array();
 290      $l1 = $l2 = array();
 291  
 292      // Nettoyage de la ponctuation pour faciliter l'appariement
 293      foreach($src as $key => $val) {
 294          $t1[$key] = strval(preg_replace("/[[:punct:][:space:]]+/", " ", $val));
 295      }
 296      foreach($dest as $key => $val) {
 297          $t2[$key] = strval(preg_replace("/[[:punct:][:space:]]+/", " ", $val));
 298      }
 299  
 300      // Premiere passe : chercher les correspondance exactes
 301      foreach($t1 as $key => $val) $md1[$key] = md5($val);
 302      foreach($t2 as $key => $val) $md2[md5($val)][$key] = $key;
 303      foreach($md1 as $key1 => $h) {
 304          if (isset($md2[$h])) {
 305              $key2 = reset($md2[$h]);
 306              if ($t1[$key1] == $t2[$key2]) {
 307                  $src_dest[$key1] = $key2;
 308                  $dest_src[$key2] = $key1;
 309                  unset($t1[$key1]);
 310                  unset($t2[$key2]);
 311                  unset($md2[$h][$key2]);
 312              }
 313          }
 314      }
 315  
 316      if ($flou) {
 317          // Deuxieme passe : recherche de correlation par test de compressibilite
 318          foreach($t1 as $key => $val) {
 319              $l1[$key] = strlen(gzcompress($val));
 320          }
 321          foreach($t2 as $key => $val) {
 322              $l2[$key] = strlen(gzcompress($val));
 323          }
 324          foreach($t1 as $key1 => $s1) {
 325              foreach($t2 as $key2 => $s2) {
 326                  $r = strlen(gzcompress($s1.$s2));
 327                  $taux = 1.0 * $r / ($l1[$key1] + $l2[$key2]);
 328                  if (!$gz_min1[$key1] || $gz_min1[$key1] > $taux) {
 329                      $gz_min1[$key1] = $taux;
 330                      $gz_trans1[$key1] = $key2;
 331                  }
 332                  if (!$gz_min2[$key2] || $gz_min2[$key2] > $taux) {
 333                      $gz_min2[$key2] = $taux;
 334                      $gz_trans2[$key2] = $key1;
 335                  }
 336              }
 337          }
 338          
 339          // Depouiller les resultats de la deuxieme passe :
 340          // ne retenir que les correlations reciproques
 341          foreach($gz_trans1 as $key1 => $key2) {
 342              if ($gz_trans2[$key2] == $key1 && $gz_min1[$key1] < 0.9) {
 343                  $src_dest[$key1] = $key2;
 344                  $dest_src[$key2] = $key1;
 345              }
 346          }
 347      }
 348  
 349      // Retourner les mappings
 350      return array($src_dest, $dest_src);
 351  }
 352  
 353  //
 354  // Recuperer les champs d'une version donnee
 355  //
 356  // http://doc.spip.org/@recuperer_version
 357  function recuperer_version($id_article, $id_version) {
 358      $result = spip_query("SELECT champs FROM spip_versions WHERE id_article=$id_article AND id_version=$id_version");
 359      
 360      if (!($row = spip_fetch_array($result))) return false;
 361  
 362      $fragments = recuperer_fragments($id_article, $id_version);
 363      $champs = unserialize($row['champs']);
 364      $textes = array();
 365      foreach ($champs as $nom_champ => $code) {
 366          $textes[$nom_champ] = "";
 367          $code = explode(' ', $code);
 368          foreach ($code as $id_fragment) {
 369              $textes[$nom_champ] .= isset($fragments[$id_fragment])?$fragments[$id_fragment]:("["._T('forum_titre_erreur').$id_fragment."]");
 370          }
 371      }
 372      return $textes;
 373  }
 374  
 375  // http://doc.spip.org/@supprimer_versions
 376  function supprimer_versions($id_article, $version_min, $version_max) {
 377      spip_query("DELETE FROM spip_versions WHERE id_article=$id_article AND id_version>=$version_min AND id_version<=$version_max");
 378  
 379      supprimer_fragments($id_article, $version_min, $version_max);
 380  }
 381  
 382  //
 383  // Ajouter une version a un article
 384  //
 385  // http://doc.spip.org/@ajouter_version
 386  function ajouter_version($id_article, $champs, $titre_version = "", $id_auteur) {
 387  
 388      // Eviter les validations entremelees
 389      $lock = "ajout_version $id_article";
 390      spip_get_lock($lock, 10);
 391  
 392      // Attention a une edition anonyme (type wiki): id_auteur n'est pas
 393      // definie, on enregistre alors le numero IP
 394      if (!$id_auteur = intval($id_auteur))
 395          $id_auteur = $GLOBALS['ip'];
 396  
 397      // Examiner la derniere version
 398      $result = spip_query("SELECT id_version, (id_auteur='$id_auteur' AND date > DATE_SUB(NOW(), INTERVAL 1 HOUR) AND permanent!='oui') AS flag FROM spip_versions WHERE id_article=$id_article ORDER BY id_version DESC LIMIT 0,1");
 399  
 400      if ($row = spip_fetch_array($result)) {
 401          $nouveau = !$row['flag'];
 402          $id_version = $row['id_version'];
 403          if ($nouveau) {
 404              $id_version_new = $id_version + 1;
 405          } else {
 406              // On reprend une version existante ; pour qu'elle soit complete
 407              // il faut merger ses champs avec ceux qu'on met a jour
 408              $id_version_new = $id_version;
 409              $champs = array_merge(
 410                  recuperer_version($id_article, $id_version),
 411                  $champs
 412              );
 413          }
 414      }
 415      else {
 416          $nouveau = true;
 417          $id_version_new = 1;
 418      }
 419      $result = spip_query("SELECT id_fragment FROM spip_versions_fragments WHERE id_article=$id_article ORDER BY id_fragment DESC LIMIT 0,1");
 420  
 421      if ($row = spip_fetch_array($result))
 422          $id_fragment_next = $row['id_fragment'] + 1;
 423      else
 424          $id_fragment_next = 1;
 425  
 426      // Generer les nouveaux fragments
 427      $fragments = array();
 428      $paras_old = recuperer_fragments($id_article, $id_version);
 429      $paras_new = $paras_champ = array();
 430      foreach ($champs as $nom_champ => $texte) {
 431          $codes[$nom_champ] = array();
 432          $paras_new = separer_paras($texte, $paras_new);
 433          $paras_champ[$nom_champ] = count($paras_new);
 434      }
 435  
 436      // Apparier les fragments de maniere optimale
 437      $n = count($paras_new);
 438      if ($n) {
 439          // Tables d'appariement dans les deux sens
 440          list($trans, $trans_rev) = apparier_paras($paras_old, $paras_new);
 441          reset($champs);
 442          $nom_champ = '';
 443          for ($i = 0; $i < $n; $i++) {
 444              while ($i >= $paras_champ[$nom_champ]) list($nom_champ, ) = each($champs);
 445              // Lier au fragment existant si possible, sinon creer un nouveau fragment
 446              if (isset($trans_rev[$i])) $id_fragment = $trans_rev[$i];
 447              else $id_fragment = $id_fragment_next++;
 448              $codes[$nom_champ][] = $id_fragment;
 449              $fragments[$id_fragment] = $paras_new[$i];
 450          }
 451      }
 452      foreach ($champs as $nom_champ => $t) {
 453          $codes[$nom_champ] = join(' ', $codes[$nom_champ]);
 454          if (!strlen($codes[$nom_champ])) unset($codes[$nom_champ]);
 455      }
 456  
 457      // Enregistrer les modifications
 458      ajouter_fragments($id_article, $id_version_new, $fragments);
 459      if (!$codes) $codes = array();
 460      $codes = (serialize($codes));
 461      $permanent = empty($titre_version) ? 'non' : 'oui';
 462      if ($nouveau) {
 463          spip_query("INSERT spip_versions (id_article, id_version, titre_version, permanent, date, id_auteur, champs) VALUES ($id_article, $id_version_new, " . _q($titre_version) . ", '$permanent', NOW(), '$id_auteur', " . _q($codes) . ")");
 464  
 465      }
 466      else {
 467          spip_query("UPDATE spip_versions SET date=NOW(), id_auteur='$id_auteur', champs=" . _q($codes) . ", permanent='$permanent', titre_version=" . _q($titre_version) . " WHERE id_article=$id_article AND id_version=$id_version");
 468  
 469      }
 470      spip_query("UPDATE spip_articles SET id_version=$id_version_new WHERE id_article=$id_article");
 471  
 472      spip_release_lock($lock);
 473  
 474      spip_log("creation version $id_version_new de l'article $id_article $titre_version");
 475  
 476      return $id_version_new;
 477  }
 478  
 479  // les textes "diff" ne peuvent pas passer dans propre directement,
 480  // car ils contiennent des <span> et <div> parfois mal places
 481  // http://doc.spip.org/@propre_diff
 482  function propre_diff($texte) {
 483  
 484      $span_diff = array();
 485      if (preg_match_all(',<(/)?(span|div) (class|rem)="diff-[^>]*>,', $texte, $regs, PREG_SET_ORDER)) {
 486          foreach ($regs as $c => $reg) {
 487              $texte = str_replace($reg[0], '@@@SPIP_DIFF'.$c.'@@@', $texte);
 488          }
 489      }
 490  
 491      // [ ...<span diff> -> lien ]
 492      // < tag <span diff> >
 493      $texte = preg_replace(',<([^>]*@@@SPIP_DIFF[0-9]+@@@),',
 494          '&lt;\1', $texte);
 495      # attention ici astuce seulement deux @@ finals car on doit eviter
 496      # deux patterns a suivre, afin de pouvoir prendre [ mais eviter [[
 497      $texte = preg_replace(',(^|[^[])[[]([^[\]]*@@@SPIP_DIFF[0-9]+@@),',
 498          '\1&#91;\2', $texte);
 499  
 500      $tex = $GLOBALS['traiter_math']; // desactiver TeX
 501      $GLOBALS['traiter_math'] = '';
 502      
 503      $texte = propre($texte);
 504  
 505      $GLOBALS['traiter_math'] = $tex;
 506  
 507      // un blockquote mal ferme peut gener l'affichage, et title plante safari
 508      $texte = preg_replace(',<(/?(blockquote|title)[^>]*)>,i', '&lt;\1>', $texte);
 509  
 510      // Dans les <cadre> c'est un peu plus complique
 511      if (preg_match_all(',<textarea (.*)</textarea>,Uims', $texte, $area, PREG_SET_ORDER)) {
 512          foreach ($area as $reg) {
 513              $remplace = preg_replace(',@@@SPIP_DIFF[0-9]+@@@,', '**', $reg[0]);
 514              if ($remplace <> $reg[0])
 515                  $texte = str_replace($reg[0], $remplace, $texte);
 516          }
 517      }
 518  
 519      // replacer les valeurs des <span> et <div> diff-
 520      if (is_array($regs))
 521      foreach ($regs as $c => $reg) {
 522          $bal = (!$reg[1]) ? $reg[0] : "</$reg[2]>";
 523          $texte = str_replace('@@@SPIP_DIFF'.$c.'@@@', $bal, $texte);
 524          $GLOBALS['les_notes'] = str_replace('@@@SPIP_DIFF'.$c.'@@@', $$bal, $GLOBALS['les_notes']);
 525      }
 526  
 527      return $texte;
 528  }
 529  
 530  
 531  // liste les champs versionnes d'un objet
 532  // http://doc.spip.org/@liste_champs_versionnes
 533  function liste_champs_versionnes($table) {
 534      if ($table == 'spip_articles')
 535          return array('surtitre', 'titre', 'soustitre', 'descriptif',
 536          'nom_site', 'url_site', 'chapo', 'texte', 'ps');
 537      else
 538          return array();
 539  }
 540  
 541  // http://doc.spip.org/@enregistrer_premiere_revision
 542  function enregistrer_premiere_revision($x) {
 543  
 544      if  ($GLOBALS['flag_revisions']
 545      AND $GLOBALS['meta']["articles_versions"]=='oui'
 546      AND $x['args']['table'] == 'spip_articles') {
 547  
 548          $id_article = $x['args']['id_objet'];
 549  
 550          $query = spip_query("SELECT id_article FROM spip_versions WHERE id_article=$id_article LIMIT 1");
 551          if (!spip_num_rows($query)) {
 552              $select = join(", ", liste_champs_versionnes($x['args']['table']));
 553              $query = spip_query("SELECT $select, date, date_modif FROM spip_articles WHERE id_article=$id_article");
 554              $champs_originaux = spip_fetch_array($query);
 555              // Si le titre est vide, c'est qu'on vient de creer l'article
 556              if ($champs_originaux['titre'] != '') {
 557                  $date_modif = $champs_originaux['date_modif'];
 558                  $date = $champs_originaux['date'];
 559                  unset ($champs_originaux['date_modif']);
 560                  unset ($champs_originaux['date']);
 561                  $id_version = ajouter_version($id_article, $champs_originaux,
 562                      _T('version_initiale'), 0);
 563                  // Inventer une date raisonnable pour la version initiale
 564                  if ($date_modif>'1970-')
 565                      $date_modif = strtotime($date_modif);
 566                  else if ($date>'1970-')
 567                      $date_modif = strtotime($date);
 568                  else
 569                      $date_modif = time()-7200;
 570                  spip_query("UPDATE spip_versions SET date=FROM_UNIXTIME($date_modif) WHERE id_article=$id_article AND id_version=$id_version");
 571              }
 572          }
 573      }
 574      return $x;
 575  }
 576  
 577  
 578  // http://doc.spip.org/@enregistrer_nouvelle_revision
 579  function enregistrer_nouvelle_revision($x) {
 580      if  ($GLOBALS['flag_revisions']
 581      AND $GLOBALS['meta']["articles_versions"]=='oui'
 582      AND $x['args']['table'] == 'spip_articles') {
 583  
 584          $champs = array();
 585          foreach (liste_champs_versionnes($x['args']['table']) as $key)
 586              if (isset($x['data'][$key]))
 587                  $champs[$key] = $x['data'][$key];
 588  
 589          if (count($champs))
 590              ajouter_version($x['args']['id_objet'], $champs, '', $GLOBALS['auteur_session']['id_auteur']);
 591      }
 592  
 593      return $x;
 594  }
 595  
 596  ?>


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