[ 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 // http://doc.spip.org/@insere_1_init 16 function insere_1_init($request) { 17 18 // preparation de la table des translations 19 $spip_translate = array( 20 "type" => "VARCHAR(16) NOT NULL", 21 "ajout" => "ENUM('0', '1')", 22 "titre" => "text NOT NULL", 23 "id_old" => "BIGINT (21) DEFAULT '0' NOT NULL", 24 "id_new" => "BIGINT (21) DEFAULT '0' NOT NULL"); 25 26 $spip_translate_key = array( 27 "PRIMARY KEY" => "id_old, id_new, type", 28 "KEY id_old" => "id_old"); 29 30 spip_mysql_create('spip_translate', $spip_translate, $spip_translate_key, true); 31 // au cas ou la derniere fois ce serait terminee anormalement 32 spip_query("DELETE FROM spip_translate"); 33 return insere_1bis_init($request); 34 } 35 36 // http://doc.spip.org/@insere_1bis_init 37 function insere_1bis_init($request) { 38 39 // l'insertion porte sur les tables principales ... 40 $t = array_keys($GLOBALS['tables_principales']); 41 // ... mais pas cette table a cause de la duplication des login 42 unset($t[array_search('spip_auteurs', $t)]); 43 return $t; 44 } 45 46 // En passe 2, relire les tables principales et les tables auxiliaires 47 // sur les mots et les documents car on sait les identifier 48 49 // http://doc.spip.org/@insere_2_init 50 function insere_2_init($request) { 51 $t = insere_1bis_init($request); 52 53 // ne pas importer cette table, son homologue est prioritaire 54 unset($t[array_search('spip_types_documents', $t)]); 55 56 $t[]= 'spip_mots_articles'; 57 $t[]= 'spip_mots_breves'; 58 $t[]= 'spip_mots_rubriques'; 59 $t[]= 'spip_mots_syndic'; 60 $t[]= 'spip_mots_forum'; 61 $t[]= 'spip_mots_documents'; 62 $t[]= 'spip_documents_articles'; 63 $t[]= 'spip_documents_rubriques'; 64 65 return $t; 66 } 67 68 // construire le tableau PHP de la table spip_translate 69 // (mis en table pour pouvoir reprendre apres interruption) 70 71 // http://doc.spip.org/@translate_init 72 function translate_init($request) { 73 74 include_spip('inc/texte'); // pour les Regexp des raccourcis 75 include_spip('inc/chercher_logo'); // pour les noms des logos 76 include_spip('inc/distant'); // pour recuperer les logos 77 78 $q = spip_query("SELECT * FROM spip_translate"); 79 $trans = array(); 80 while ($r = spip_fetch_array($q)) { 81 $trans[$r['type']][$r['id_old']] = array($r['id_new'], $r['titre'], intval($r['ajout'])); 82 } 83 return $trans; 84 } 85 86 87 // http://doc.spip.org/@import_insere 88 function import_insere($values, $table, $desc, $request, $atts) { 89 90 $type_id = $desc['key']["PRIMARY KEY"]; 91 // reserver une place dans les tables principales si nouveau 92 $ajout = 0; 93 if ((!function_exists($f = 'import_identifie_' . $type_id)) 94 OR (!($n = $f($values, $table, $desc, $request)))) { 95 // pas d'importation de types_doc (a revoir) 96 if ($table == 'spip_types_documents') return; 97 $n = spip_abstract_insert($table, '', '()'); 98 if (!$n) { 99 $GLOBALS['erreur_restauration'] = spip_sql_error(); 100 return; 101 } 102 $ajout = 1; 103 } 104 105 if (is_array($n)) 106 list($id, $titre) = $n; 107 else {$id = $n; $titre = "";} 108 spip_abstract_insert('spip_translate', 109 "(id_old, id_new, titre, type, ajout)", 110 "(". $values[$type_id] .",$id, " . _q($titre) . ", '$type_id', '$ajout')"); 111 } 112 113 // Renumerotation des entites collectees 114 // Appelle la fonction specifique a la table, ou a defaut la std. 115 // Le tableau de correspondance est global, et permet qu'un numero 116 // d'une entite soit calcule une seule fois, a sa premiere occurrence. 117 // (Mais des requetes avec jointures eviteraient sa construction. A voir) 118 119 // http://doc.spip.org/@import_translate 120 function import_translate($values, $table, $desc, $request, $atts) { 121 122 if (!function_exists($f = 'import_translate_' . $table)) 123 $f = 'import_translate_std'; 124 $f($values, $table, $desc, $request, $atts); 125 } 126 127 // La fonction d'insertion apres renumerotation. 128 // Afin qu'inserer une 2e fois la meme sauvegarde ne change pas la base, 129 // chaque entree de la sauvegarde est ignoree s'il existe une entree 130 // de meme titre avec le meme contexte (parent etc) dans la base installee. 131 // Une synchronisation plus fine serait preferable, cf [8004] 132 133 // http://doc.spip.org/@import_inserer_translate 134 function import_inserer_translate($values, $table, $desc, $request, $vals, $atts) { 135 global $trans; 136 $p = $desc['key']["PRIMARY KEY"]; 137 $v = $values[$p]; 138 139 if (!isset($trans[$p]) OR !isset($trans[$p][$v]) OR $trans[$p][$v][2]){ 140 spip_query("REPLACE $table (" . join(',',array_keys($values)) . ') VALUES (' .substr($vals,1) . ')'); 141 142 $on = isset($atts['on']) ? ($atts['on']) : ''; 143 $off = isset($atts['off']) ? ($atts['off']) : ''; 144 if ($on OR $off) { 145 $t = type_du_logo($p); 146 $url = $request['url_site']; 147 if (!$url) $url = $atts['adresse_site']; 148 if (substr($url,-1) !='/') $url .='/'; 149 $url .= $atts['dir_logos']; 150 $new = $trans[$p][$v][0]; 151 if ($on) { 152 if ($logo = recuperer_page($url . $t . "on$v." . $on)) 153 ecrire_fichier(_DIR_LOGOS. $t . "on$new." . $on, $logo); 154 } 155 if ($off) { 156 if ($logo = recuperer_page($url . $t . "off$v." . $off)) 157 ecrire_fichier(_DIR_LOGOS. $t . "off$new." . $off, $logo); 158 } 159 } 160 } 161 } 162 163 // Insertion avec renumerotation, y compris des raccourcis. 164 // http://doc.spip.org/@import_translate_std 165 function import_translate_std($values, $table, $desc, $request, $atts) { 166 167 $vals = ''; 168 169 foreach ($values as $k => $v) { 170 if ($k=='id_parent' OR $k=='id_secteur') 171 $k = 'id_rubrique'; 172 else if (($k=='chapo') AND ($v[0]=='=') AND preg_match(_RACCOURCI_CHAPO, substr($v,1), $m)) 173 $v = '=[->' . substr($v,1) . ']'; 174 175 $v = importe_raccourci($k,importe_translate_maj($k, $v)); 176 177 $vals .= "," . _q($v); 178 } 179 import_inserer_translate($values, $table, $desc, $request, $vals, $atts); 180 } 181 182 // http://doc.spip.org/@import_translate_spip_documents 183 function import_translate_spip_documents($values, $table, $desc, $request, $atts) { 184 185 $url = $request['url_site']; 186 if (!$url) $url = $atts['adresse_site']; 187 if (substr($url,-1) !='/') $url .='/'; 188 # $url .= $atts['dir_img']; // deja dans la BD importee 189 $values['distant']= 'oui'; 190 191 $vals = ''; 192 foreach ($values as $k => $v) { 193 if ($k=='fichier') 194 $v = $url .$v; 195 else $v = importe_raccourci($k,importe_translate_maj($k, $v)); 196 $vals .= "," . _q($v); 197 } 198 import_inserer_translate($values, $table, $desc, $request, $vals, $atts); 199 } 200 201 // Fonction de renumerotation, par delegation aux fonction specialisees 202 // Si une allocation est finalement necessaire, celles-ci doivent repercuter 203 // la renumerotation sur la table SQL temporaire pour qu'en cas de reprise 204 // sur Time-Out il n'y ait pas reallocation. 205 // En l'absence d'allocation, cet acces SQL peut etre omis, quitte a 206 // recalculer le nouveau numero si une autre occurrence est rencontree 207 // a la reprise. Pas dramatique. 208 209 // http://doc.spip.org/@importe_translate_maj 210 function importe_translate_maj($k, $v) 211 { 212 global $trans; 213 if (!(isset($trans[$k]) AND isset($trans[$k][$v]))) return $v; 214 list($g, $titre, $ajout) = $trans[$k][$v]; 215 if ($g <= 0) { 216 $f = 'import_identifie_parent_' . $k; 217 $g = $f($g, $titre, $v); 218 if ($g > 0) 219 // memoriser qu'on insere 220 $trans[$k][$v][2]=1; 221 else $g = (0-$g); 222 $trans[$k][$v][0] = $g; 223 } 224 return $g; 225 } 226 227 define('_RACCOURCI_MODELE_ALL', '/' . _RACCOURCI_MODELE .'/isS'); 228 229 // http://doc.spip.org/@importe_raccourci 230 function importe_raccourci($k, $v) 231 { 232 233 if (preg_match_all(_RACCOURCI_LIEN, $v, $m, PREG_SET_ORDER)) { 234 foreach ($m as $regs) { 235 // supprimer 'http://' ou 'mailto:' 236 $lien = vider_url($regs[3]); 237 if ($match = typer_raccourci($lien)) { 238 list($f,$objet,$id,$params,$ancre) = $match; 239 $k = 'id_' . $f; 240 $g = importe_translate_maj($k, $id); 241 if ($g != $id) { 242 243 $rac = '[' . $regs[1] . '->' . $reg[2] . $objet . $g . $params . $ancre .']'; 244 $v = str_replace($regs[0], $rac, $v); 245 } 246 } 247 } 248 } 249 250 if (preg_match_all(_RACCOURCI_MODELE_ALL, $v, $m, PREG_SET_ORDER)) { 251 foreach ($m as $regs) { 252 $g = importe_translate_maj('id_document', $regs[3]); 253 if ($g != $regs[3]) { 254 $rac = '<' . $regs[2] . $g . $regs[4] . '>' . $regs[5]; 255 $v = str_replace($regs[0], $rac, $v); 256 } 257 } 258 } 259 return $v; 260 } 261 262 // un document importe est considere comme identique a un document present 263 // s'ils ont meme taille et meme nom 264 // http://doc.spip.org/@import_identifie_id_document 265 function import_identifie_id_document($values, $table, $desc, $request) { 266 $t = $values['taille']; 267 $f = $values['fichier']; 268 $h = $request['url_site'] . $f; 269 $r = spip_fetch_array(spip_query($q="SELECT id_document, fichier FROM spip_documents WHERE taille=" . _q($t) . " AND (fichier=" . _q($f) . " OR fichier= " . _q($h) . ')'), SPIP_NUM); 270 return $r; 271 } 272 // un type de document importe est considere comme identique a un type present 273 // s'ils ont meme extension et meme titre 274 // Sinon il ne sera PAS importe 275 // http://doc.spip.org/@import_identifie_id_type 276 function import_identifie_id_type($values, $table, $desc, $request) { 277 $e = $values['extension']; 278 $t = $values['titre']; 279 $r = spip_fetch_array(spip_query($q="SELECT id_type, titre FROM spip_types_documents WHERE extension=" . _q($e) . " AND titre=" . _q($t)), SPIP_NUM); 280 return $r; 281 } 282 283 // deux groupes de mots ne peuvent avoir le meme titre ==> identification 284 // http://doc.spip.org/@import_identifie_id_groupe 285 function import_identifie_id_groupe($values, $table, $desc, $request) { 286 $r = spip_fetch_array(spip_query("SELECT id_groupe, titre FROM spip_groupes_mots WHERE titre=" . _q($values['titre'])), SPIP_NUM); 287 return $r; 288 } 289 290 // pour un mot le titre est insuffisant, il faut aussi l'identite du groupe. 291 // Memoriser ces 2 infos et le signaler a import_translate grace a 1 negatif 292 // http://doc.spip.org/@import_identifie_id_mot 293 function import_identifie_id_mot($values, $table, $desc, $request) { 294 return array((0 - $values['id_groupe']), $values['titre']); 295 } 296 297 // Passe 2: mot de meme titre et de meme groupe ==> identification 298 // http://doc.spip.org/@import_identifie_parent_id_mot 299 function import_identifie_parent_id_mot($id_groupe, $titre, $v) 300 { 301 global $trans; 302 $titre = _q($titre); 303 $id_groupe = 0-$id_groupe; 304 if (isset($trans['id_groupe']) 305 AND isset($trans['id_groupe'][$id_groupe])) { 306 $new = $trans['id_groupe'][$id_groupe][0]; 307 $r = spip_fetch_array(spip_query("SELECT id_mot FROM spip_mots WHERE titre=$titre AND id_groupe=$new" )); 308 if ($r) return (0 - $r['id_mot']); 309 } 310 $r = spip_abstract_insert('spip_mots', '', '()'); 311 spip_query("REPLACE spip_translate (id_old, id_new, titre, type, ajout) VALUES ($v,$r,$titre,'id_mot',1)"); 312 return $r; 313 } 314 315 // idem pour les articles 316 // http://doc.spip.org/@import_identifie_id_article 317 function import_identifie_id_article($values, $table, $desc, $request) { 318 return array((0 - $values['id_rubrique']), $values['titre']); 319 } 320 321 // Passe 2 des articles comme pour les mots 322 323 // http://doc.spip.org/@import_identifie_parent_id_article 324 function import_identifie_parent_id_article($id_parent, $titre, $v) 325 { 326 $id_parent = importe_translate_maj('id_rubrique', (0 - $id_parent)); 327 328 $titre = _q($titre); 329 $r = spip_fetch_array(spip_query("SELECT id_article FROM spip_articles WHERE titre=$titre AND id_rubrique=$id_parent AND statut<>'poubelle'" )); 330 if ($r) return (0 - $r['id_article']); 331 332 $r = spip_abstract_insert('spip_articles', '', '()'); 333 spip_query("REPLACE spip_translate (id_old, id_new, titre, type, ajout) VALUES ($v,$r,$titre,'id_article',1)"); 334 return $r; 335 } 336 337 // idem pour les breves 338 // http://doc.spip.org/@import_identifie_id_breve 339 function import_identifie_id_breve($values, $table, $desc, $request) { 340 return array((0 - $values['id_rubrique']), $values['titre']); 341 } 342 343 // Passe 2 des breves comme pour les mots 344 345 // http://doc.spip.org/@import_identifie_parent_id_breve 346 function import_identifie_parent_id_breve($id_parent, $titre, $v) 347 { 348 $id_parent = importe_translate_maj('id_rubrique', (0 - $id_parent)); 349 350 $titre = _q($titre); 351 $r = spip_fetch_array(spip_query("SELECT id_breve FROM spip_breves WHERE titre=$titre AND id_rubrique=$id_parent AND statut<>'refuse'" )); 352 if ($r) return (0 - $r['id_breve']); 353 354 $r = spip_abstract_insert('spip_breves', '', '()'); 355 spip_query("REPLACE spip_translate (id_old, id_new, titre, type, ajout) VALUES ($v,$r,$titre,'id_breve',1)"); 356 return $r; 357 } 358 359 360 // pour une rubrique le titre est insuffisant, il faut l'identite du parent 361 // Memoriser ces 2 infos et le signaler a import_translate grace a 1 negatif 362 // http://doc.spip.org/@import_identifie_id_rubrique 363 function import_identifie_id_rubrique($values, $table, $desc, $request) { 364 return array((0 - $values['id_parent']), $values['titre']); 365 } 366 367 // Passe 2 des rubriques, renumerotation en cascade. 368 // rubrique de meme titre et de meme parent ==> identification 369 // http://doc.spip.org/@import_identifie_parent_id_rubrique 370 function import_identifie_parent_id_rubrique($id_parent, $titre, $v) 371 { 372 global $trans; 373 if (isset($trans['id_rubrique'])) { 374 if ($id_parent < 0) { 375 $id_parent = (0 - $id_parent); 376 $gparent = $trans['id_rubrique'][$id_parent][0]; 377 // parent deja renumerote depuis le debut la passe 2 378 if ($gparent >= 0) 379 $id_parent = $gparent; 380 else { 381 // premiere occurrence du parent 382 $pitre = $trans['id_rubrique'][$id_parent][1]; 383 $n = import_identifie_parent_id_rubrique($gparent, $pitre, $id_parent); 384 $trans['id_rubrique'][$id_parent][0] = ($n>0) ? $n: (0-$n); 385 // parent tout neuf, 386 // pas la peine de chercher un titre homonyme 387 if ($n > 0) { 388 $trans['id_rubrique'][$id_parent][2]=1; // nouvelle rub. 389 return import_alloue_id_rubrique($n, $titre, $v); 390 } else $id_parent = (0 - $n); 391 } 392 } 393 394 $r = spip_fetch_array(spip_query("SELECT id_rubrique FROM spip_rubriques WHERE titre=" . _q($titre) . " AND id_parent=" . intval($id_parent))); 395 if ($r) { 396 return (0 - $r['id_rubrique']); 397 } 398 return import_alloue_id_rubrique($id_parent, $titre, $v); 399 } 400 } 401 402 // reserver la place en mettant titre et parent tout de suite 403 // pour que le SELECT ci-dessus fonctionne a la prochaine occurrence 404 405 // http://doc.spip.org/@import_alloue_id_rubrique 406 function import_alloue_id_rubrique($id_parent, $titre, $v) { 407 $titre = _q($titre); 408 $r = spip_abstract_insert('spip_rubriques', '(titre, id_parent)', "($titre,$id_parent)"); 409 spip_query("REPLACE spip_translate (id_old, id_new, titre, type, ajout) VALUES ($v,$r,$titre,'id_rubrique',1)"); 410 return $r; 411 } 412 ?>
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 |
![]() |