| [ Index ] |
|
Code source de SPIP 1.9.2c |
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 '<\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[\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', '<\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 ?>
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
| Généré le : Wed Nov 21 10:20:27 2007 | par Balluche grâce à PHPXref 0.7 |
|